Tên của thành ngữ sử dụng phương thức xích để xây dựng một đối tượng là gì?


21

Tôi thường sử dụng một mẫu trong đó tôi sử dụng phương thức xích để thiết lập một đối tượng, tương tự như một Builderhoặc một Prototypemẫu, nhưng không tạo các đối tượng mới với mỗi lệnh gọi phương thức, thay vào đó sửa đổi đối tượng ban đầu.

Thí dụ:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

Chỉ cần tự hỏi nếu có một tên cho mẫu này và liệu nó có được coi là một mẫu chống không, bởi vì mặc dù nó có thể đọc trôi chảy hơn, nó có thể dẫn đến các chuỗi phương thức dài.


3
Một giao diện trôi chảy là một vấn đề của phong cách. Nếu bạn đang viết một API cung cấp các hình thức thay thế cho nó.
Oded

1
Để thảo luận thêm, hãy xem câu hỏi này: lập trình
Eric King

@Oded Có thể sử dụng API như vậy mà không cần xâu chuỗi bằng cách chỉ thực hiện mỗi cuộc gọi thành một tuyên bố riêng biệt hoặc bạn có ý tưởng khác cho một giải pháp thay thế không?
Hội trường Garrett

@GarrettHall - Tất nhiên là có thể, nhưng sau đó bạn sẽ gọi những thứ như menu.withStyle("")không có ngữ cảnh. Bạn cần hai API trong trường hợp như vậy.
Oded

2
@GarrettHall Điểm của 'giao diện lưu loát' chuỗi phương thức, có nghĩa là được đọc như một câu. Theo nghĩa này, chuỗi phương thức dài không được coi là xấu. Nhưng, và ở đây tôi đồng ý với Oded, tốt nhất là cũng cung cấp chức năng tương tự trong một cú pháp thông thường hơn. Bằng cách đó, nhà phát triển có thể chọn phương pháp nào sẽ sử dụng.
Eric King

Câu trả lời:


37

Giao diện thông thạo

Tôi đã luôn nghe nói về phương pháp này được gọi là " giao diện trôi chảy ", được đặt ra bởi Eric Evans (của danh tiếng Thiết kế hướng miền ) và Martin Fowler (của danh tiếng Agile Manifesto ).

Nhược điểm chính là khả năng đọc (mà một số người yêu thích và một số ghét), và thực tế là có thể khó gỡ lỗi hơn trong một số trường hợp vì toàn bộ chuỗi hành động có thể được coi là một tuyên bố duy nhất khi bước qua nó.

Tôi chắc chắn không coi đó là một mô hình chống, mặc dù tôi chỉ sử dụng kỹ thuật này một vài lần.


4
Lưu ý rằng những người đề xuất khá khăng khăng rằng một giao diện trôi chảy liên quan đến nhiều thứ hơn là chỉ xâu chuỗi phương pháp, mặc dù điều này thường không rõ ràng về ý nghĩa khác của thuật ngữ đó.
Kilian Foth

Có phải chung cho toàn bộ chuỗi được coi là một tuyên bố duy nhất? Nghe có vẻ như là một vấn đề gỡ lỗi được thiết kế kém đối với tôi.
quả việt quất

Tôi đã không bắt gặp một trình sửa lỗi coi các chuỗi như một câu lệnh đơn lẻ, nhưng vẫn có thể là một nỗi đau nếu bạn chỉ quan tâm đến một trong các phương pháp cho đến cuối chuỗi, trong một chuỗi cụ thể.
vaughandroid

1
Tôi làm việc trong C # và trình gỡ lỗi .NET cho phép tôi bước vào các phương thức riêng lẻ. Các ngôn ngữ khác, tôi không chắc lắm.
Eric King

1
@KilianFoth Như đã lưu ý trong các nhận xét của câu hỏi, các phương thức xâu chuỗi trong giao diện trôi chảy nên có thể đọc được gần như một câu. Đôi khi, điều này có nghĩa là các phương thức riêng lẻ nên có các tên khác với các cách khác được coi là thực hành tốt
Izkata

5

Phương thức xâu chuỗi như thế thường được gọi là Giao diện trôi chảy khi có một loại dòng chảy hoặc khả năng khám phá trong chuỗi. Ngoài ra, bạn có thể nghĩ về một api như jQuery, chủ yếu dựa vào chuỗi phương thức là không "thông thạo" vì không có sự nhấn mạnh tương tự về khả năng khám phá - nó thuận tiện hơn.

Đối với ví dụ của bạn (sử dụng withx, withy), bạn có thể coi đây là một biến thể của mẫu Builder vì bạn đã có một lớp chuyên biệt, với một số trạng thái (gọi phương thức) biết cách trả về một đối tượng được cấu hình đúng.

Đây không phải là một mô hình chống nếu được sử dụng một cách thích hợp.


Khám phá là gì? Khả năng tìm các phương thức bạn cần thông qua tự động hoàn thành của API?
Josiah Yoder

Tôi không quen thuộc với jQuery. Làm thế nào là chuỗi phương thức của họ chỉ để thuận tiện, không thể khám phá? Bởi vì có rất nhiều cách để xâu chuỗi nó là quá sức ngay cả với tự động hoàn thành?
Josiah Yoder

3

cho dù nó được coi là một mô hình chống,

chắc chắn không phải là một mô hình chống. jQuery có lẽ là triển khai được sử dụng tốt nhất trong số này.

bởi vì mặc dù nó có thể đọc trôi chảy hơn, nhưng nó có thể dẫn đến các chuỗi phương thức dài

Có nó có thể, nhưng sự thay thế là gì? Bạn có thể kết thúc với gần như một câu tiếng Anh đơn giản, với api hướng dẫn bạn những gì có sẵn và phù hợp.


..và bạn có được những gì bạn muốn trong 1 dòng, thay vì 8 - 10. Sẽ tốt nếu bạn chỉ viết một dòng trong một thiết bị đầu cuối. Dễ dàng gọi lại 1 lệnh hơn 10. Vì nó lưu loát và các phương thức có tên mô tả nên cũng dễ đọc hơn. Đáng buồn thay, rất nhiều điều này trong Python2 không còn có thể được thực hiện trong Python3 / Python4.
mckenzm

-3

Nó được gọi là mô hình "tàu đắm".

(Đây là một mô hình chống và chống lại Clean Code)

Mô hình "tàu đắm" vi phạm Luật Demeter .


3
Điều này không giống như phương thức xâu chuỗi trong bài viết bạn liên kết đến, ví dụ là ở đâu a.getB().getC().doSomething(). Ví dụ đó là xấu vì "Phương thức của bạn có thể gọi phương thức trực tiếp trên các trường của chính nó (nhưng không phải trên các trường của trường)". Ở đây, chỉ có 1 đối tượng đang được tạo và "bạn có thể chơi với đồ chơi bạn tự làm".
Nic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.