Як називається ідіома, що використовує метод ланцюжка для побудови об'єкта?


21

Я часто використовую шаблон, коли я використовую метод ланцюга для установки об'єкта, подібного до Builderабо Prototypeшаблону, але не створюю нових об'єктів при кожному виклику методу, замість того, щоб змінювати вихідний об'єкт.

Приклад:

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

Цікаво, чи існує назва цього шаблону і чи вважається він антидіаграмою, адже він може читати більш вільно, але це може призвести до довгих ланцюжків методів.


3
Вільний інтерфейс - справа стилю. Якщо ви пишете API, надайте йому альтернативні форми.
Одід

1
Для більш детальної дискусії погляньте на це питання: programmers.stackexchange.com/questions/69519/…
Ерік Кінг

@Oded Можна використовувати такий API без прив’язки, просто зробивши кожен виклик окремим висловлюванням, або у вас була інша ідея для альтернативи?
Гарретт Холл

@GarrettHall - Звичайно, це можливо, але тоді ти закінчуєш називати речі на зразок menu.withStyle("")без контексту. У такому випадку вам потрібні два API.
Одід

2
@GarrettHall Точкою «вільного інтерфейсу» є ланцюжок методів, яку слід читати як пропозицію. У цьому сенсі довгий ланцюжок методів не вважається поганим. Але, і тут я погоджуюся з Одедом, найкраще було б також забезпечити ту ж функціональність у більш звичайному синтаксисі. Таким чином, розробник може вибрати, який метод використовувати.
Ерік Кінг

Відповіді:


37

Вільний інтерфейс

Я завжди чув, як цей метод називався « вільним інтерфейсом », як його створили Ерік Еванс ( слава дизайну, керований доменом ) та Мартін Фаулер ( слава Agile Manifesto ).

Основними недоліками є читабельність (яку деякі люди люблять, а хтось ненавидить), а також те, що в деяких випадках налагодження може бути складніше, оскільки весь ланцюжок дій може вважатися одним твердженням, переходячи через нього.

Я, безумовно, не вважаю це анти-зразком, хоча сам лише кілька разів використовував цю техніку.


4
Зауважте, що прихильники досить наполягають на тому, що плавний інтерфейс передбачає набагато більше, ніж просто ланцюжок методів, хоча часто незрозуміло, що ще розуміється під цим терміном.
Кіліан Фот

Чи загальним для всього ланцюга вважається одне твердження? Це звучить як погано розроблена проблема налагодження для мене.
blueberryfields

Я не натрапив на відладчик, який розглядає ланцюги як єдине твердження, але все одно це може бути болем, якщо вас зацікавить лише один із методів до кінця ланцюга, в одному конкретному ланцюжку.
vaughandroid

1
Я працюю в C #, і налагоджувач .NET дозволяє мені просто вступати в індивідуальні методи. Інші мови, я не дуже впевнений.
Ерік Кінг

1
@KilianFoth Як зазначалося в коментарях до запитання, ланцюгові методи в плавному інтерфейсі повинні читатись майже як вирок. Іноді це означає, що окремі методи повинні мати інші назви, ніж інакше вважається хорошою практикою
Ізката

5

Спосіб, пов'язаний таким чином, зазвичай називається плавним інтерфейсом, коли в ланцюзі є певний потік або відкриваність. Крім того, ви можете придумати такий формат, як jQuery, який в значній мірі покладається на прив'язку методів, як не "вільний", тому що не такий же акцент на відкритті - це більше для зручності.

Для вашого прикладу (використовуючи withx, withy) ви можете вважати цей варіант шаблоном Builder, оскільки у вас є спеціалізований клас, який, враховуючи деякий стан (виклики методів), знає, як повернути правильно налаштований об'єкт.

Це не є антидіаграмою, якщо її правильно використовувати.


Що таке відкриття? Здатність знаходити потрібні вам методи через автозаповнення API?
Йосія Йодер

Я не знайомий з jQuery. Як ланцюжки їх методів лише для зручності, а не для виявлення? Тому що існує стільки способів ланцюга, що це непосильне навіть із автозавершенням?
Йосія Йодер

3

чи вважається це анти-зразком,

безумовно, не анти-шаблон. jQuery - це, мабуть, найбільш вдала реалізація цього.

тому що він може читати більш вільно, але це може призвести до довгих ланцюжків методів

Так, це може, але яка альтернатива? Ви можете закінчити майже простим англійським реченням, а api спрямовує вас до того, що є доступним та підходящим.


..і ви отримаєте те, що хочете в 1 рядок, а не 8 - 10. Що добре, якщо ви пишете лише один вкладиш в термінал. Простіше згадати 1 команду, ніж 10. Оскільки вона вільно володіє і методи мають описові назви, її також легше читати. На жаль, багато цього в Python2 більше не можна зробити в Python3 / Python4.
mckenzm

-3

Він називається візерунком "аварія поїздів".

(Це анти-шаблон і проти чистого коду)

Модель "аварії поїздів" порушує Закон Деметера .


3
Це не те саме, що метод, приведений у статті, на яку ви посилаєтесь, де є приклад a.getB().getC().doSomething(). Цей приклад поганий, оскільки "Ваш метод може викликати методи безпосередньо на власних полях (але не на полях полів"). Тут створено лише 1 об’єкт, який "можна пограти з іграшками, які ви зробили самі".
Nic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.