Często używam wzorca, w którym używam łączenia łańcuchowego do ustawiania obiektu, podobnego do wzoru Builder
lub Prototype
, ale nie tworzę nowych obiektów przy każdym wywołaniu metody, zamiast tego modyfikując oryginalny obiekt.
Przykład:
new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");
Zastanawiam się tylko, czy istnieje nazwa tego wzorca i czy jest on uważany za anty-wzorzec, ponieważ chociaż może czytać płynniej, może prowadzić do długich łańcuchów metod.
design-patterns
coding-style
code-quality
patterns-and-practices
method-chaining
Garrett Hall
źródło
źródło
menu.withStyle("")
bez kontekstu. W takim przypadku potrzebujesz dwóch interfejsów API.Odpowiedzi:
Płynny interfejs
Zawsze słyszałem o tej metodzie nazywanej „ płynnym interfejsem ”, jak wymyślili ją Eric Evans ( sława Domain Driven Design ) i Martin Fowler ( sława Agile Manifesto ).
Główne wady to czytelność (którą niektórzy uwielbiają, a niektórzy nienawidzą) oraz fakt, że w niektórych przypadkach może być trudniej debugować, ponieważ cały łańcuch działań może być uważany za jedno stwierdzenie podczas jego przechodzenia.
Z pewnością nie uważam tego za anty-wzór, chociaż sam użyłem tej techniki tylko kilka razy.
źródło
Takie łączenie łańcuchów jest zwykle nazywane płynnym interfejsem, gdy występuje pewien przepływ lub możliwość wykrycia w łańcuchu. Alternatywnie możesz pomyśleć o interfejsie API, takim jak jQuery, który opiera się w dużej mierze na tworzeniu łańcuchów metod, jako nie „płynnym”, ponieważ nie kładzie się takiego samego nacisku na wykrywalność - jest to bardziej wygodne.
Na przykład (używając withx, withy) możesz rozważyć ten wariant wzorca Buildera, ponieważ masz wyspecjalizowaną klasę, która, biorąc pod uwagę niektóre stany (wywołania metod), wie, jak zwrócić poprawnie skonfigurowany obiekt.
To nie jest anty-wzór, jeśli jest właściwie stosowany.
źródło
zdecydowanie nie jest to anty-wzór. jQuery jest prawdopodobnie najczęściej używaną implementacją tego.
Tak, może, ale jaka jest alternatywa? Możesz skończyć z prawie prostym angielskim zdaniem, a API prowadzi cię do tego, co jest dostępne i odpowiednie.
źródło
Nazywa się to wzorem „wraku pociągu”.
(To jest anty-wzorzec i jest przeciwko Clean Code)
Wzór „wraku pociągu” narusza Prawo Demetera .
źródło
a.getB().getC().doSomething()
. Ten przykład jest zły, ponieważ „Twoja metoda może wywoływać metody bezpośrednio na własnych polach (ale nie na polach pól)”. Tutaj powstaje tylko 1 obiekt i „możesz się bawić zabawkami, które sam stworzyłeś”.