Bạn đã đúng - copy-paste hoạt động rất tốt và DRY không có lý do gì khi nhiệm vụ của bạn là tạo ra một chương trình mà mẫu được sao chép hoặc bản sao sẽ không phải duy trì hoặc phát triển trong tương lai. Khi hai thành phần phần mềm này có vòng đời hoàn toàn khác nhau, sau đó ghép chúng lại với nhau bằng cách tái cấu trúc mã chung thành một lib chung mà chính nó đang phát triển nặng có thể thực sự có tác dụng không thể đoán trước cho nỗ lực này. Mặt khác, khi sao chép các phần mã bên trong một chương trình hoặc hệ thống chương trình, tất cả các phần này thường sẽ có cùng vòng đời. Tôi sẽ minh họa bên dưới điều này có nghĩa gì với DRY và quản lý dự án.
Nghiêm túc mà nói, có rất nhiều chương trình như vậy: ví dụ, ngành công nghiệp trò chơi máy tính sản xuất rất nhiều chương trình phải được duy trì trong một thời gian ngắn tối đa vài tháng hoặc một năm, và khi thời gian đó kết thúc, dán sao chép mã cũ từ một trò chơi trước đó trong đó thời gian bảo trì đã hết, vào cơ sở mã của trò chơi mới là hoàn toàn tốt và có thể tăng tốc mọi thứ.
Thật không may, vòng đời của hầu hết các chương trình tôi phải đối phó trong những năm qua rất khác so với điều đó. 98% yêu cầu hoặc yêu cầu sửa lỗi đã đến với tôi là yêu cầu thay đổicho các chương trình hiện có. Và bất cứ khi nào bạn cần thay đổi thứ gì đó trong một phần mềm hiện có, "quản lý dự án" hoặc lập kế hoạch hoạt động tốt nhất khi các nỗ lực kiểm tra và gỡ lỗi của bạn khá thấp - điều đó sẽ không xảy ra nếu bạn thay đổi một thứ gì đó, nhưng do sao chép logic kinh doanh -past bạn dễ dàng quên bạn cần phải thay đổi một tá địa điểm khác trong cơ sở mã là tốt. Và ngay cả khi bạn quản lý để tìm tất cả những nơi đó, thời gian để thay đổi tất cả (và kiểm tra các thay đổi) có thể cao hơn nhiều như thể bạn chỉ có một nơi để thay đổi. Vì vậy, ngay cả bạn cũng có thể ước tính chính xác cho thay đổi, có chi phí cao hơn hàng chục lần so với nhu cầu có thể dễ dàng va chạm với ngân sách của dự án.
TLDR - bất cứ khi nào bạn phát triển một chương trình không cần thiết hoặc chịu trách nhiệm sửa lỗi và bảo trì bản gốc hoặc bản sao, vui lòng sao chép. Nhưng nếu bạn, nhóm của bạn hoặc công ty của bạn hoặc có thể trở nên có trách nhiệm, hãy áp dụng DRY bất cứ khi nào bạn có thể.
Thí dụ
Là một phụ lục, hãy để tôi giải thích "sửa lỗi và bảo trì" nghĩa là gì, và điều này dẫn đến sự khó lường trong việc lập kế hoạch, đặc biệt là trong một sản phẩm, bằng một ví dụ trong thế giới thực. Tôi thực sự đã thấy những điều này xảy ra trong thực tế, có thể không phải với 100 trường hợp, nhưng vấn đề thậm chí có thể bắt đầu khi bạn chỉ có một trường hợp trùng lặp.
Nhiệm vụ: tạo 100 báo cáo khác nhau cho một ứng dụng, mỗi báo cáo trông rất giống nhau, một số khác biệt yêu cầu giữa các báo cáo, một số logic khác nhau, nhưng tất cả đều không có nhiều khác biệt.
Nhà phát triển nhận nhiệm vụ này tạo ra cái đầu tiên (giả sử phải mất 3 ngày), sau một số thay đổi hoặc sửa lỗi nhỏ do QA và khách hàng kiểm tra xong, nó dường như chạy tốt. Sau đó, anh ta bắt đầu tạo báo cáo tiếp theo bằng cách dán sao chép và sửa đổi toàn bộ nội dung, sau đó là báo cáo tiếp theo và với mỗi báo cáo mới anh ta cần trung bình ~ 1 ngày. Rất dễ đoán, thoạt nhìn ...
Bây giờ, sau khi 100 báo cáo "sẵn sàng", chương trình đi vào sản xuất thực sự và một số vấn đề xảy ra đã bị bỏ qua trong QA. Có thể có vấn đề về hiệu suất, có thể các báo cáo bị sập một cách thường xuyên, có thể những thứ khác không hoạt động như dự định. Bây giờ, khi nguyên tắc DRY đã được áp dụng, 90% các vấn đề đó có thể được giải quyết bằng cách thay đổi cơ sở mã ở một nơi. Nhưng do phương pháp sao chép-dán, vấn đề phải được giải quyết 100 lần thay vì một lần. Và do những thay đổi đã được áp dụng từ báo cáo này sang báo cáo khác, nhà phát triển không thể nhanh chóng sao chép-dán bản sửa lỗi cho báo cáo đầu tiên sang 99 báo cáo khác. Anh ấy phải xem xét tất cả 100 báo cáo, đọc chúng, dịch thay đổi sang sửa đổi báo cáo, kiểm tra nó và có thể gỡ lỗi từng cái một. Đối với Thủ tướng, việc này bắt đầu trở nên rất khó khăn - tất nhiên anh ta có thể dành thời gian cho việc sửa lỗi "thông thường" (giả sử, 3 giờ) và nhân số này với 100, nhưng thực sự, đây có lẽ là một ước tính sai, một số cách khắc phục có thể là dễ làm hơn người khác, người khác có thể khó hơn. Và ngay cả khi ước tính này là chính xác, việc gỡ lỗi có chi phí cao gấp 100 lần so với mức cần thiết sẽ khiến công ty của bạn tốn rất nhiều tiền.
Điều tương tự sẽ xảy ra vào lần tới khi khách hàng yêu cầu thay đổi màu sắc biểu tượng công ty của mình trong tất cả các báo cáo đó, để làm cho kích thước trang có thể định cấu hình hoặc theo một số yêu cầu mới khác ảnh hưởng đến tất cả các báo cáo theo cách tương tự. Vì vậy, nếu điều đó xảy ra, bạn có thể ước tính chi phí và lập hóa đơn cho khách hàng gấp 100 lần giá mà anh ta sẽ phải trả khi mã đã KHÔ. Tuy nhiên, hãy thử điều này một vài lần và sau đó khách hàng sẽ hủy dự án bởi vì anh ta có thể sẽ không sẵn sàng trả chi phí phát triển cắt cổ của bạn. Và có lẽ tại thời điểm đó, ai đó sẽ đặt câu hỏi tại sao điều này xảy ra và chỉ tay vào người đưa ra quyết định cho chương trình sao chép-dán này.
Quan điểm của tôi là: khi bạn sản xuất phần mềm cho người khác, bạn luôn có ít nhất một khoảng thời gian ngắn để chịu trách nhiệm làm cho công việc hoạt động, sửa lỗi, điều chỉnh chương trình theo các yêu cầu thay đổi, v.v. Ngay cả trong một dự án trường xanh, những điều này các bộ phận có thể nhanh chóng bổ sung nhiều hơn nhiều so với nỗ lực phát triển dự kiến ban đầu. Và đặc biệt khi tất cả các mã được sao chép của bạn nằm trong một sản phẩm, khoảng thời gian chịu trách nhiệm là cho tất cả các phần giống nhau, khác với trường hợp bạn sao chép một số mã cũ từ một dự án đã chết không còn nữa đang bảo trì tích cực.