Походження "методу має повернути значення або мати побічні ефекти, але не обидва"


12

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

Яке походження цієї поради? З якої людини чи громади вона виникла?

Додатковий кредит: Яка заявлена ​​вигода від використання цієї поради?


1
@gnat Так, це насамперед історія. Я побоювався, що додаткова кредитна частина є надто суб'єктивною, щоб стояти самостійно, і що історія має більше шансів уникнути закриття. Я додам тег.
Уейн Конрад

Деякі з відповідей, які купували на мене, змусили мене замислитись, чи запитуєте ви про користь, яку стверджував автор цієї поради, або перелік усіх пільг, на які взагалі можна претендувати?
гнат

@gnat Я запитую про вигоду, яку стверджує автор (знову ж, побоюючись закриття), але я впевнений, що не заперечуючи суттєвих причин - вони відповідають на питання, яке я насправді хотів задати. Якби я видалив "заявлене" з мого запитання, роблячи відповіді на групу на тему, чи це підштовхне питання занадто далеко до суб'єктивного?
Уейн Конрад

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

Одна з переваг полягає в тому, що якщо вам платять за обсягом коду, це призводить до надбавки. "doSomething; GetResultOfSomething; HandleErrorsFromSomething;"
Ⴖ uі

Відповіді:


13

За словами Грега Янг, ця ідея виникла з Бертрана Мейєра : відділення команд-запитів .

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

1: Ейфель: мова для слайдів 43-48 інженерії програмного забезпечення

У дизайні, керованому доменом, це схоже на розділення / сегрегація читання команд-запитів, що читаються (CQRS), як назвав Грег Янг.

Грег Янг взяв ідею CQS від Бертран назвати CQRS, як згадував Мартін Фаулер у цій статті про CQRS

Переваги

  • Частина читання (запиту) може бути масштабована / налаштована інакше, ніж частина запису (команди). Розмежування обох завадить не заважати один одному, коли ключова оптимізація / продуктивність.

Докладніше читайте статтю у посиланні Мартіна Фаулера .


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

1
@Deduplicator Приклад кліше InterlockedCompareExchange?
Ⴖ uí

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

4

Я не знаю, звідки це походить, але це гарна порада і досить прямо зрозуміти.

Будь-яка грамотно розроблена програма буде розбита на різні частини, поєднана та складена різними способами. Чим складніше міркувати про те, що робить якась конкретна частина, тим важче буде переконатися, що ваша програма буде реагувати передбачувано.

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

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


це навіть не намагається вирішити поставлене запитання, дивіться, як відповісти
gnat

@gnat Моє запитання було розроблено у двох частинах: основне питання ("хто") та додатковий кредит ("чому). Чи не стосується це зайва кредитна частина?"
Уейн Конрад

на моє читання (" заявлена пільга"), чому частина очікується такою, яку запропонував автор цитати. Здається, питання не запитує перелік усіх можливих пільг
gnat

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

1

Додатковий кредит: Яка спочатку заявлена вигода від дотримання цієї поради?

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

bool FooWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

bool BarWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

void BadShortCircuitEvaluation()
{
    // the programmer's intent is to have side effects of both functions
    if (FooWithSideEffect() && BarWithSideEffect() ) {
        // do something
    }

    // in case FooWithSideEffect() returns true, 
    // then BarWithSideEffect() is not called at all
    // because of short-circuit evaluation
}

чи є ця вигода, яку стверджує автор поради ?
гнат

@gnat Я боюсь історичного та практичного змішання.
Нік Алексєєв

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