Vì vậy, gần đây tôi đã thực hiện một số phép tái cấu trúc chính cho mã của mình. Một trong những điều chính tôi đã cố gắng làm là tách các lớp của tôi thành các đối tượng dữ liệu và các đối tượng worker. Điều này đã được truyền cảm hứng, trong số những thứ khác, bởi phần này của Clean Code :
Giống lai
Sự nhầm lẫn này đôi khi dẫn đến các cấu trúc dữ liệu lai không may là một nửa đối tượng và một nửa cấu trúc dữ liệu. Chúng có các hàm làm những việc quan trọng, và chúng cũng có các biến công khai hoặc các bộ truy cập và bộ biến đổi công khai, với tất cả ý nghĩa và mục đích, làm cho các biến riêng tư công khai, cám dỗ các hàm bên ngoài khác sử dụng các biến đó theo cách mà một chương trình thủ tục sẽ sử dụng cấu trúc dữ liệu.
Các giống lai này làm cho việc thêm các chức năng mới trở nên khó khăn nhưng cũng khiến việc thêm các cấu trúc dữ liệu mới trở nên khó khăn. Họ là tồi tệ nhất của cả hai thế giới. Tránh tạo ra chúng. Chúng là dấu hiệu của một thiết kế lộn xộn mà các tác giả không chắc chắn - hoặc tệ hơn, không biết gì - cho dù họ cần bảo vệ khỏi các chức năng hoặc loại.
Gần đây tôi đã xem mã cho một trong các đối tượng công nhân của tôi (điều đó xảy ra để triển khai Mẫu khách truy cập ) và thấy điều này:
@Override
public void visit(MarketTrade trade) {
this.data.handleTrade(trade);
updateRun(trade);
}
private void updateRun(MarketTrade newTrade) {
if(this.data.getLastAggressor() != newTrade.getAggressor()) {
this.data.setRunLength(0);
this.data.setLastAggressor(newTrade.getAggressor());
}
this.data.setRunLength(this.data.getRunLength() + newTrade.getLots());
}
Tôi ngay lập tức nói với bản thân mình "tính đố kị! Logic này nên có trong Data
lớp - cụ thể là trong handleTrade
phương thức. handleTrade
Và updateRun
nên luôn luôn xảy ra cùng nhau". Nhưng sau đó tôi nghĩ "lớp dữ liệu chỉ là một public
cấu trúc dữ liệu, nếu tôi bắt đầu làm điều đó, thì nó sẽ trở thành một đối tượng lai!"
Điều gì tốt hơn và tại sao? Làm thế nào để bạn quyết định làm gì?