Tôi đang đọc về mùi mã phổ biến trong cuốn sách Tái cấu trúc của Martin Fowler . Trong bối cảnh đó, tôi đã tự hỏi về một mẫu mà tôi đang thấy trong một cơ sở mã, và người ta có thể coi đó là một mẫu khách quan.
Mẫu là một trong đó một đối tượng được truyền dưới dạng đối số cho một hoặc nhiều phương thức, tất cả đều thay đổi trạng thái của đối tượng, nhưng không có đối tượng nào trả về đối tượng. Vì vậy, nó dựa vào việc vượt qua bởi tính chất tham chiếu của (trong trường hợp này) C # /. NET.
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
Tôi thấy rằng (đặc biệt là khi các phương thức không được đặt tên thích hợp) Tôi cần xem xét các phương thức đó để hiểu nếu trạng thái của đối tượng đã thay đổi. Nó làm cho việc hiểu mã trở nên phức tạp hơn, vì tôi cần theo dõi nhiều cấp độ của ngăn xếp cuộc gọi.
Tôi muốn đề xuất cải thiện mã đó để trả về một đối tượng (nhân bản) khác với trạng thái mới hoặc bất cứ điều gì cần thiết để thay đổi đối tượng tại trang web cuộc gọi.
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
Đối với tôi, dường như mẫu đầu tiên được chọn dựa trên các giả định
- rằng nó là công việc ít hơn, hoặc yêu cầu ít dòng mã hơn
- rằng nó cho phép chúng ta vừa thay đổi đối tượng, vừa trả lại một số thông tin khác
- rằng nó hiệu quả hơn vì chúng ta có ít trường hợp hơn
Thing
.
Tôi minh họa một giải pháp thay thế, nhưng để đề xuất nó, người ta cần có lập luận chống lại giải pháp ban đầu. Điều gì, nếu có, các đối số có thể được đưa ra để làm cho trường hợp rằng giải pháp ban đầu là một mô hình chống?
Và những gì, nếu có bất cứ điều gì là sai với giải pháp thay thế của tôi?