Tôi đã tin vào điều gì đó về tái cấu trúc mà tôi chưa thấy đề cập ở đây, tôi biết đã có rất nhiều câu trả lời ở đây, nhưng tôi nghĩ rằng điều này là mới.
Tôi đã là một nhà tái cấu trúc tàn nhẫn và là một người tin tưởng mạnh mẽ vào DRY kể từ trước khi các điều khoản phát sinh. Chủ yếu là vì tôi gặp khó khăn trong việc giữ một codebase lớn trong đầu và một phần vì tôi thích mã hóa DRY và tôi không thích bất cứ điều gì về mã hóa C & P, thực tế nó rất đau và chậm kinh khủng đối với tôi.
Vấn đề là, nhấn mạnh vào DRY đã cho tôi rất nhiều thực hành trong một số kỹ thuật mà tôi hiếm khi thấy người khác sử dụng. Rất nhiều người khăng khăng rằng Java rất khó hoặc không thể tạo ra DRY, nhưng thực sự họ không thử.
Một ví dụ từ rất lâu trước đây có phần giống với ví dụ của bạn. Mọi người có xu hướng nghĩ rằng tạo java GUI là khó. Tất nhiên đó là nếu bạn mã như thế này:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
Bất cứ ai nghĩ rằng điều này thật điên rồ là hoàn toàn đúng, nhưng đó không phải là lỗi của Java - không bao giờ nên viết mã theo cách này. Các cuộc gọi phương thức này là các hàm dự định được bọc trong các hệ thống khác. Nếu bạn không thể tìm thấy một hệ thống như vậy, hãy xây dựng nó!
Rõ ràng là bạn không thể viết mã như vậy nên bạn cần lùi lại và xem xét vấn đề, mã lặp lại đó thực sự đang làm gì? Đó là chỉ định một số chuỗi và mối quan hệ của chúng (một cây) và nối các lá của cây đó với các hành động. Vì vậy, những gì bạn thực sự muốn là nói:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Khi bạn đã xác định mối quan hệ của mình theo một cách ngắn gọn và mô tả thì bạn viết một phương thức để giải quyết nó - trong trường hợp này bạn lặp lại các phương thức của lớp được truyền vào và xây dựng một cây sau đó sử dụng phương thức đó để xây dựng Menu của bạn và Hành động cũng như (rõ ràng) hiển thị một menu. Bạn sẽ không bị trùng lặp và phương pháp của bạn có thể tái sử dụng ... và có thể dễ viết hơn so với số lượng lớn các menu đã có, và nếu bạn thực sự thích lập trình, bạn sẽ có nhiều niềm vui hơn. Điều này không khó - phương pháp bạn cần viết có lẽ ít dòng hơn so với việc tạo menu bằng tay!
Điều đó là, để làm tốt điều này, bạn cần phải thực hành, rất nhiều. Bạn cần giỏi phân tích chính xác thông tin duy nhất trong các phần lặp đi lặp lại, trích xuất thông tin đó và tìm ra cách thể hiện nó tốt. Học cách sử dụng các công cụ như phân tích chuỗi và chú thích giúp ích rất nhiều. Học để thực sự rõ ràng về báo cáo lỗi và tài liệu là rất quan trọng là tốt.
Bạn có được thực hành "Miễn phí" chỉ bằng cách mã hóa tốt - rất có thể là một khi bạn đã thành thạo, bạn sẽ thấy rằng mã hóa một cái gì đó DRY (bao gồm viết một công cụ có thể sử dụng lại) nhanh hơn so với sao chép và dán và tất cả các lỗi, lỗi trùng lặp và những thay đổi khó khăn mà loại mã hóa gây ra.
Tôi không nghĩ rằng tôi có thể tận hưởng công việc của mình nếu tôi không thực hành các kỹ thuật DRY và các công cụ xây dựng nhiều nhất có thể. Nếu tôi phải giảm chi phí để không phải sao chép và dán chương trình, tôi sẽ lấy nó.
Vì vậy, quan điểm của tôi là:
- Sao chép & Dán tốn nhiều thời gian hơn trừ khi bạn không biết cách tái cấu trúc tốt.
- Bạn học cách tái cấu trúc tốt bằng cách thực hiện nó - bằng cách nhấn mạnh vào DRY ngay cả trong những trường hợp khó khăn và tầm thường nhất.
- Bạn là một lập trình viên, nếu bạn cần một công cụ nhỏ để tạo mã DRY, hãy xây dựng nó.
always
vànever
như những lá cờ đỏ. Có một thứ gọi là "bối cảnh", trong đó các quy tắcalways
vànever
, ngay cả khi tốt nói chung, có thể không phù hợp. Coi chừng các nhà phát triển phần mềm giao dịch tuyệt đối. ;)