Які переваги індивідуальних методів «комбінованого» Геттера / Setter VS?


12

Це те, що я називаю "комбінованим" методом getter / setter (від jQuery):

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

Це та сама логіка з окремими (теоретичними) методами:

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

Моє запитання:

Створюючи бібліотеку на зразок jQuery, чому ви вирішили йти першим маршрутом, а не другим? Чи не другий підхід зрозумілий і легший для розуміння з першого погляду?


6
Мартін Фаулер не є прихильником того, що він називає "перевантаженими геттерами
vaughandroid

1
Мені раніше подобався метод розділення get / set (думаючи, що він зробив код більш "очевидним"), але в даний час я вважаю, що перевантажений шаблон getter / setter стає більш привабливим. Це може зробити код чистішим. Я ніколи не відчував, щоб подобатися компромісу містера Фаулера. Мені здається, що це найгірше з обох світів.
Брайан Ноблеуч

Єдиний реальний аргумент проти Мартіна Фаулера - це те, коли "гетьер" передає аргумент, і в цьому випадку він бентежить читача в тому, що він не схожий на геттера. На сьогодні я зробив висновок, що якщо ви дотримуєтесь конвенції про те, що геттер не приймає аргументів, і сетер приймає один, то, поряд з чіткими коментарями API, підхід jQuery / Angular повинен бути просто чудовим. Зараз.
zumalifeguard

Відповіді:


13

Тут явно спекулюю, але я схиляюсь до того, що розробники jQuery, які використовували багато функціонального стилю в структурі jQuery, явно мають нахил до функціональної парадигми.

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

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

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


2
Погоджено, плюс я додам бажання максимально зменшити розмір JS.
Matt S

-1 для імперативних / дослівних та функціональних / неявних пунктів.

3
@MattFenwick Я не хочу ображати, ти кажеш, що це неправда, що функціональна парадигма схиляється до імпліцитності, де імперативна парадигма схиляється до явності? Я не кажу, що краще, просто те, що ви можете звикнути до того чи іншого, що призведе до того, що ви автоматично робитимете так, на відміну від іншого (це стосується будь-якого способу однаково)
Джиммі Хоффа

@Jimmy немає проблем; моя думка полягала лише в тому, що в моєму досвіді я виявив, що неявність / явність є ортогональною для FP / імперативом.

@MattFenwick може бути, але я б сказав, що випливає з виводу типу, який дозволяє багато неявних і є загальним для системи типу HM, інші речі, характерні для мов FP, схиляються до неявності, як і всі оператори як функції Функція не має явного імені, а лише символ, який, як ви очікуєте, будете вивчати та знати неявно, або загальне використання списків або кортежів, що вимагають неявного знання значення та розташування члена замість ДУ (подумайте, як працює монада письменника). Я також схильний бачити спільність імен параметрів однієї літери, але ви можете мати рацію
Джиммі Хоффа

2

Форма

foo.text("This is a new value"); 

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

У багатьох мовах це можна вважати скороченою формою

var result = foo.text("This is a new value"); 

де результат відкидається. Тому такий підхід є занадто неоднозначним, щоб бути ефективним способом встановлення властивості (з точки зору читабельності коду).


Це відмінний момент! Я надягаю свої окуляри FP, коли я читаю javascript, і все виглядає інакше, тому я навіть не думав про це, але якби я побачив такий код у C #, я мав би точно реакцію, яку ви посилаєтесь на "Що робить цей метод ?? ".
Джиммі Хоффа

1

Це трохи спекулятивно, але ось мій постріл на це.

jQuery повністю охоплює функціональний характер JavaScript. Саме це робить це приголомшливо, але це може залишити багатьох розробників чухати голову, коли вони походять з більш чисто мови OO, такої як java. Начебто порушується вся конвенція та добра практика.

Функціональний багаж, як правило, робить упор на декларативний синтаксис. Він, як правило, читає як констатацію факту, а не як команди. Приклад

var eligible = customers.where(c => c.age > 30);

який можна прочитати як "правомочним клієнтом є клієнти, вік яких перевищує 30 років". За обмеженням, імперативна мова читається як послідовність команд

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

Це можна прочитати як "Перевірте кожного клієнта, і якщо їх вік перевищує 30 років, додайте їх до відповідної колекції"

Додавання aa setта getоперації дозволить jQuery відчути себе обов'язковою бібліотекою. Ви можете обмежити спосіб читання наступних тверджень

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

Зберігаючи дієслово дії з jQuery api, вони відчули, що це декларативний API. Це дає послідовне, функціональне відчуття бібліотеці. Ось чому я думаю, що вони перевантажили ключові слова.


1

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

Якщо ви коли-небудь розглядали визначення класу, наповнене такими властивостями, префікси "set" і "get" виглядають зайвими, оскільки додавання параметра value вже говорить про те, що це сеттер. Мартін Фаулер добре говорить про гетерів, яким потрібен параметр, але навіть тоді в цьому контексті параметр додаткового значення чітко позначає сеттер, а також той факт, що сеттер рідко з'являється в правій частині завдання. І коли ви пишете код, у будь-якому випадку вам доведеться переглянути документацію для бібліотеки.

Оскільки ви тільки просили переваги, я не покриватиму недоліки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.