Một vài tháng trước, tôi đã bắt đầu làm việc trong một dự án mới và khi duyệt mã, nó sẽ cho tôi biết số lượng phương thức tĩnh được sử dụng. Không chỉ các phương thức tiện ích như collectionToCsvString(Collection<E> elements)
, mà còn rất nhiều logic kinh doanh được giữ trong đó.
Khi tôi hỏi anh chàng chịu trách nhiệm cho lý do đằng sau chuyện này, anh ta nói rằng đó là một cách để thoát khỏi sự chuyên chế của Spring . Nó đi một cái gì đó xung quanh quá trình suy nghĩ này: để thực hiện một phương pháp tạo biên nhận khách hàng, chúng tôi có thể có một dịch vụ
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Bây giờ, anh chàng nói rằng anh ta không thích có các lớp được quản lý một cách không cần thiết bởi Spring, về cơ bản vì nó áp đặt các hạn chế rằng các lớp khách phải là chính Spring bean. Chúng tôi cuối cùng có tất cả mọi thứ được quản lý bởi Spring, điều này khiến chúng tôi phải làm việc với các đối tượng không quốc tịch theo cách thủ tục. Nhiều hơn hoặc ít hơn những gì được nêu ở đây https://www.javacodegeek.com/2011/02/domain-driven-design-spring-aspectj.html
Vì vậy, thay vì các mã trên, anh ta có
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Tôi có thể tranh luận đến mức tránh Spring quản lý các lớp học của chúng tôi khi có thể, nhưng điều tôi không thấy là lợi ích của việc có mọi thứ tĩnh. Các phương thức tĩnh này cũng không trạng thái, do đó cũng không OO lắm. Tôi sẽ cảm thấy thoải mái hơn với một cái gì đó như
new CustomerReceiptCreator().createReceipt()
Ông tuyên bố rằng các phương pháp tĩnh có một số lợi ích bổ sung. Cụ thể là:
- Dễ đọc hơn. Nhập phương thức tĩnh và chúng ta chỉ cần quan tâm đến hành động, không có lớp nào đang thực hiện.
- Rõ ràng là một phương thức không có các cuộc gọi DB, vì vậy hiệu năng rất rẻ; và đó là một điều tốt để làm cho nó rõ ràng, để khách hàng tiềm năng cần phải đi vào mã và kiểm tra điều đó.
- Dễ dàng hơn để viết bài kiểm tra.
Nhưng tôi chỉ cảm thấy có điều gì đó không hoàn toàn đúng với điều này, vì vậy tôi muốn nghe một số suy nghĩ của các nhà phát triển dày dạn hơn về điều này.
Vì vậy, câu hỏi của tôi là, những cạm bẫy tiềm năng của cách lập trình này là gì?
static
phương pháp mà bạn đang minh họa ở trên chỉ là một phương pháp nhà máy bình thường. Làm cho các phương thức nhà máy tĩnh là quy ước được chấp nhận chung, vì một số lý do thuyết phục. Liệu phương pháp nhà máy có phù hợp ở đây là một vấn đề khác.