Тверді принципи проти YAGNI


43

Коли принципи SOLID стають YAGNI?

Як програмісти, ми постійно робимо компроміси між складністю, ремонтом, часом розробки тощо. Серед інших, два з найрозумніших рекомендацій щодо вибору - це, на мій погляд, принципи SOLID та YAGNI. Якщо вам це не потрібно; не будуйте його, а зберігайте його в чистоті.

Наприклад, наприклад, коли я дивлюсь серії dimecast на SOLID , я бачу, що вона починається як досить проста програма, і закінчується як досить складна (кінець, так, складність також в очах глядача), але це все ще робить мені цікаво: коли принципи SOLID перетворюються на те, що вам не потрібно? Усі тверді принципи - це способи роботи, які дозволяють використовувати зміни на більш пізньому етапі. Але що робити, якщо вирішити проблему досить просто, і це викидне додаток, то що? Або принципи SOLID чимось завжди застосовуються?

Як просять у коментарях:


Чи не повинен також бути титул SOLID principle vs YAGNI?
Вовк

2
@Wolf: Це множина "СОЛІД (Однозначна відповідальність, відкритість-закриття, заміна Ліскова, сегрегація інтерфейсу та інверсія залежності) - це мнемонічна абревіатура, введена Майклом Перомсом для" перших п'яти принципів ", названих Робертом К. Мартіном на початку 2000-х років, що означає п'ять основних принципів об'єктно-орієнтованого програмування та дизайну ".
logc

Відповіді:


55

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

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

Зазвичай я використовую такий підхід: якщо я пишу простий додаток для певного завдання, я іноді відмовляюся від принципів великого імені на користь кількох рядків коду, які працюють. Якщо я виявлю, що я повертаюся до цього додатку, щоб вносити подальші зміни, я знайду час, щоб зробити його ТВОРЧОЮ (хоча б дещо, оскільки 100% застосування принципів рідко можливо).

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


Це майже те, що я теж думаю. Як зауваження, я не суджу по екранізації, я просто думаю, що це гарний приклад того, як програмне забезпечення може зростати при застосуванні SOLID.
KeesDijk

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

YAGNI and SOLID coexistхороший висновок. Хоча це може бути непоганим початковим пунктом
Вовк

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

19

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

Натомість краще зрозуміти принципи та проблеми, які SOLID намагається вирішити; а також принципи та проблеми, з якими намагається вирішити YAGNI. Ви побачите, що одна стосується архітектури вашої програми, а друга стосується процесу розробки в цілому. Хоча в деяких випадках можливе перекриття, вони є різними проблемами.

YAGNI (Ви не потребуєте цього [вигадливий американський абревіатура]) стурбований тим, що економить час розробника, додаючи сталеві залізобетонні фундаменти до мосту, який призначений тільки для простягання 3-футової широкої затоки, коли простіший дерев'яний міст буде робити просто штрафу. Якщо ми пролягаємо на милі широкою річкою і потребуємо підтримки кількох тракторних причепів, звичайно, нам знадобляться додаткові фундаментальні роботи. По суті, YAGNI пропонує вам переглянути більшу картину та дизайн для поточних потреб. Це вирішення проблеми зробити щось занадто складне, оскільки ми передбачимо низку потенційних потреб, які замовник ще не визначив.

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

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


Так, погодьтеся ... немає жодного срібного підходу, який би відповідав кожному сценарію.
Е.Л. Юсубов

Ваше make sure the pieces of the bridge fit togetherдалеко не так очевидно, як can be maintained over time.
Вовк

В основному, SOLID - це те, що дозволить вам перетворити цей дерев’яний міст на повний на 1 милі сталевий міст, здатний підтримувати броньований взвод, не виконуючи повного переписування або просто наклеюючи на рубіж після злому.
сара

@kai, це хибна передумова. Якщо вам потрібен міст, який охоплює 1 милю, то ви проектуєте міст, який охоплює 1 милю. Якщо вам потрібен міст, який охоплює 5 футів, ви будуєте міст, який охоплює 5 футів. Не зрозумійте мене неправильно, принципи SOLID дуже корисні, але потрібно більше розуміння їх, щоб знати, які принципи не потрібні для проблеми. У 9 разів з 10 цей зайвий кілометр ніколи не потрібен.
Berin Loritsch

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

9

Принципи SOLID не потрібні, коли це програма, що викидає; інакше вони завжди потрібні.

SOLID та YAGNI не розходяться: Хороший дизайн класу полегшує додаток в обслуговуванні. YAGNI просто зазначає, що ви не повинні додавати можливість для вашої програми бути такою настроюваною жахливістю, яка може робити все під сонцем, - якщо цього насправді не потрібно.

Це різниця між автомобільним класом, який має чітко визначені межі (SOLID), і класом автомобіля, який має можливість самолікування (YAGNI), перш ніж клієнт про це вимагає.


1
Хіба це не переплутано? Що з цього приводу: належним чином застосовуйте принципи SOLID, щоб вирішити складність автомобілів, що самолікуються, або застосовуйте YAGNI до тих пір, поки ваші машини все ще такі прості, що вони ніколи не зламаються (або - як альтернатива - настільки жувати, що їх можна просто викинути) .
Вовк

2
@Wolf Тверді принципи не кажуть, що вам робити, тільки ЯК. якщо ви вже вирішили, що хочете самолікуватися, тоді ви можете застосувати принципи SOLID до цього коду. SOLID не каже, чи є хороша ідея самолікування автомобіля чи ні. Ось де заходить YAGNI.
Сара

Часто програми, що викидають, це не так.
Тулен Кордова

«Самолікування» - це добре. "Перш ніж клієнт про це попросить", це також добре, тому що я думаю, що вся ідея, якщо ви слухаєте дядька Боба, стосується місць, які приносять прибуток і передбачають потреби замовника та мають життєздатний бізнес, який може відповідати потребам. бо вони змінюються. Дуже багато людей дратують дядька Боба, оскільки він не має права на програмування, але він вам каже, більшість часу, чому важливо використовувати SOLID, а не лише як.
johnny

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

4

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

Нещодавно я намагався зрозуміти, коли я повинен використовувати Принцип єдиної відповідальності ( ось що я придумав.)

Сподіваюся, це допомагає!


2

Є цитата, приписана Ейнштейну (ймовірно, варіація реальної ):

"Все повинно бути максимально простим, але не простішим".

І це більш-менш підхід, який я використовую при зіткненні з компромісом SOLID проти YAGNI: застосовувати їх альтернативно, тому що ніколи не знаєш, чи є програма «викинутим» кодом чи ні. Отже, просто додайте шар бруду, який працює, а потім відшліфуйте його до більш чистих інтерфейсів ... і повторюйте, поки не перейдете на потрібний рівень ентропії. Сподіваємось.


Хороший момент: you never know if a program is 'throw-away' code- ну, я думаю, що альтернатива ідеї не така.
Вовк

@Wolf: так, я розширював порядок кроків, які я вважаю найкращими (узагальнений у слові "Спочатку зроби це можливим, потім зроби красивим, потім зроби швидким"), але потім я подумав ... YAGNI :)
logc

1

Існує багато способів розробити програму для заданої проблеми; SOLID - це спроба виявити властивості хорошого дизайну. Правильне використання SOLID повинно спричинити за собою програму, яку простіше міркувати та змінювати.

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

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


0

Я думаю, що ви повинні запустити YAGNI, і коли є потреба, SOLIDify.

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

Ви не витрачаєте час, тому що вам доведеться виконати роботу в будь-якому випадку (на початку), і там, де це потрібно, вам приємно і охайно.

Я думаю, ви можете назвати це лінивою оцінкою SOLID.


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