Rất cẩn thận
Phân nhánh tính năng là một tùy chọn nhưng tôi thấy nó hơi nặng. Ngoài ra, nó làm cho các sửa đổi sâu dễ dàng có thể dẫn đến việc loại bỏ hoàn toàn ứng dụng của bạn nếu không được kiểm soát. Lý tưởng nhất là bạn muốn thúc đẩy càng nhiều càng tốt các tùy chỉnh trong nỗ lực giữ cho cơ sở mã lõi của bạn càng phổ biến và chung chung càng tốt.
Đây là cách tôi sẽ làm điều đó mặc dù tôi không biết liệu nó có thể áp dụng cho cơ sở mã của bạn mà không cần sửa đổi và hệ số lại không. Tôi đã có một dự án tương tự trong đó các chức năng cơ bản là như nhau nhưng mỗi khách hàng yêu cầu một bộ tính năng rất cụ thể. Tôi đã tạo ra một tập hợp các mô-đun và bộ chứa mà sau đó tôi lắp ráp thông qua cấu hình (à la IoC).
sau đó, với mỗi khách hàng, tôi đã tạo một dự án về cơ bản chứa các cấu hình và tập lệnh xây dựng để tạo một bản cài đặt được cấu hình đầy đủ cho trang web của họ. Thỉnh thoảng tôi cũng đặt một số thành phần tùy chỉnh cho khách hàng này. Nhưng điều này là hiếm và bất cứ khi nào có thể, tôi cố gắng làm cho nó ở dạng chung chung hơn và đẩy nó xuống để các dự án khác có thể sử dụng chúng.
Kết quả cuối cùng là tôi đã đạt được mức độ tùy chỉnh cần thiết, tôi đã nhận được các tập lệnh cài đặt tùy chỉnh để khi tôi đến trang web của khách hàng, tôi không giống như tôi đang sử dụng hệ thống mọi lúc và như một phần thưởng RẤT đáng kể mà tôi nhận được để có thể tạo các bài kiểm tra hồi quy được nối trực tiếp trên bản dựng. Bằng cách này, bất cứ khi nào tôi gặp một lỗi cụ thể của khách hàng, tôi có thể viết một bài kiểm tra sẽ khẳng định hệ thống khi nó được triển khai và do đó có thể thực hiện TDD ngay cả ở cấp độ đó.
tóm lại
- Hệ thống mô đun hóa nặng nề với cấu trúc dự án phẳng.
- Tạo một dự án cho mỗi hồ sơ cấu hình (khách hàng, mặc dù nhiều người có thể chia sẻ một hồ sơ)
- Lắp ráp các bộ chức năng cần thiết như một sản phẩm khác và xử lý nó như vậy.
Nếu được thực hiện đúng cách lắp ráp sản phẩm của bạn sẽ chứa tất cả trừ một vài tệp cấu hình.
Sau khi sử dụng một thời gian, cuối cùng tôi đã tạo ra các gói meta lắp ráp các hệ thống chủ yếu được sử dụng hoặc thiết yếu làm đơn vị cốt lõi và sử dụng gói meta này cho các cụm khách hàng. Sau một vài năm, cuối cùng tôi đã có một hộp công cụ lớn mà tôi có thể lắp ráp rất nhanh để tạo ra các giải pháp khách hàng. Tôi hiện đang xem xét Spring Roo và xem liệu tôi không thể đẩy ý tưởng thêm một chút với hy vọng một ngày nào đó tôi có thể tạo bản nháp đầu tiên của hệ thống ngay với khách hàng trong cuộc phỏng vấn đầu tiên của chúng tôi ... Tôi đoán bạn có thể gọi nó là User Driven Phát triển ;-).
Hy vọng điều này sẽ giúp
#ifdef
làm việc cho bạn?