Chúng tôi có khá nhiều vị trí trong mã nguồn của ứng dụng của chúng tôi, trong đó một lớp có nhiều phương thức có cùng tên và các tham số khác nhau. Các phương thức đó luôn có tất cả các tham số của phương thức 'trước' cộng thêm một tham số.
Đó là kết quả của quá trình tiến hóa dài (mã kế thừa) và suy nghĩ này (tôi tin):
" Có một phương thức M thực hiện điều A. Tôi cần thực hiện A + B. OK, tôi biết ... Tôi sẽ thêm một tham số mới cho M, tạo một phương thức mới cho điều đó, chuyển mã từ M sang phương thức mới có thêm một tham số, thực hiện A + B ở đó và gọi phương thức mới từ M với giá trị mặc định của tham số mới. "
Đây là một ví dụ (bằng ngôn ngữ giống như Java):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
Tôi cảm thấy như thế này là sai. Không chỉ chúng ta không thể tiếp tục thêm các tham số mới như thế này mãi mãi, mà mã khó mở rộng / thay đổi vì tất cả các phụ thuộc giữa các phương thức.
Dưới đây là một số cách để làm điều này tốt hơn:
Giới thiệu một đối tượng tham số:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Đặt tham số cho
DocumentHome
đối tượng trước khi chúng ta gọicreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Tách công việc thành các phương thức khác nhau và gọi chúng khi cần thiết:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Những câu hỏi của tôi:
- Là vấn đề được mô tả thực sự là một vấn đề?
- Bạn nghĩ gì về các giải pháp được đề xuất? Bạn thích cái nào hơn (dựa trên kinh nghiệm của bạn)?
- Bạn có thể nghĩ ra giải pháp nào khác không?