Чи "конвенція щодо конфігурації" не порушує основних принципів програмування?


51

Я переглядав рамку WPF MVVM Caliburn.Micro і читав, що багато стандартних речей засновані на умовах іменування .

Наприклад, автоматичне прив'язування властивостей у View до властивостей ViewModel. Хоча це здається зручним (видаляє якийсь код котла), моя перша реакція на інстинкт полягає в тому, що новому програмісту, який прочитає цей код, це не зовсім очевидно. Іншими словами, функціональність програми не повністю пояснюється її власним кодом, а також документацією рамки.

Редагувати:

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

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

Чи домовленість щодо конфігурації є правильним способом спрощення речей, чи це порушує деякі принципи програмування (і якщо так, то які)?


8
Більшість підходів / принципів певною мірою порушують деякі інші підходи / принципи. Це здебільшого питання пріоритетів та компромісів.
Йоахім Зауер

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

Тут актуальна концепція відстеження програмного забезпечення. Програмісти покладаються на такі інструменти, як grep, але потрібні кращі інструменти для відстеження використання генерованого коду. Наприклад, інструменти повинні зробити більш явним, що клас css "user-id" пов'язаний згенерованим методом getUserId () та стовпцем таблиці user_id.
Макнейл

Відповіді:


49

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

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

Збалансування конвенції та конфігурації є складним завданням. Занадто велика умовність може зробити код заплутаним (наприклад, взяти неявні змінні Perl). Занадто велика свобода з боку програміста може ускладнити розуміння систем, оскільки знання, отримані з однієї системи, рідко корисні при вивченні іншої.

Хороший приклад, коли умова допомагає програмісту, коли пише плагіни Eclipse. Переглядаючи плагін, якого я ніколи не бачив, я одразу знаю багато речей про нього. Список залежностей знаходиться в MANIFEST.MF, точки розширення - у plugin.xml, вихідний код - під "src" тощо. Якби ці речі визначали програміст, кожен плагін Eclipse був би іншим, а навігація по коду була б набагато складніше.


4
+1: Розробка програмного забезпечення є досить складною. Якщо ви можете уникнути складності в речах, якими ви володієте, зробіть це. Збережіть складність місць, які вам абсолютно потрібні.
scrwtp

1
Дякуємо за чітке пояснення щодо різниці та балансу.
Geerten

3
"Якщо ідентифікатор на Java починається з великої літери, це тип." - чи це тип залежить від синтаксичного контексту, а не від шаблону імен, умови іменування Java не впливають на "конфігурацію компіляції". Ви впевнені, що це дійсний приклад? Останній приклад також невірний - йдеться про "конвенції конфігурації", а не про "конвенції щодо конфігурації". Ви говорите правильні речі, але вони мало стосуються принципу subj.
День

4
Не перенапружуйте приклади, це лише приклади. Перший - це лише приклад конвенції, останній - приклад, коли конвенція є доброю справою. Приклад Perl - приклад, коли занадто багато конвенцій (імпліцитів) є поганою справою (IMO, я повинен додати).
JesperE

1
Я ненавиджу, коли конвенція над конфігурацією перетворюється на конвенцію без конфігурації ... в останньому випадку ви, як правило, потрапляєте в пастку з кодовою базою, її важко інтегрувати з іншими інструментами.
Енді

77

Дайте +1 @JesperE і хочете щось додати:

чи це порушення деяких принципів програмування

Так, "конвенція щодо конфігурації" порушує принцип "явне краще, ніж неявне" (погляньте, наприклад, на "Zen-Of-Python" ).

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


4
Ось найпряміша відповідь на запитання!
Йоахім Зауер

Це фактично правильна відповідь серед двох найбільш схвалених.
День

+1 для "явне краще, ніж неявне"
Джастін Омс

12
Моя улюблена частина цієї відповіді полягає в тому, що вона неявно висвітлює реальність, ніж принципи гарної розробки програмного забезпечення часто сидять в напрузі один з одним. Інженерія полягає у врівноваженні цих напружень відповідно до конкретного контексту та застосування.
Кріс Кричо

Хороша відповідь. Щоб розширити коментар @Chris Krycho, приємна річ щодо стандартів або принципів програмного забезпечення полягає в тому, що у вас є стільки, що можна вибрати. :-)
user949300

9

Деякі з "домовленостей щодо конфігурації" просто зводяться до розумних значень за замовчуванням. Вам слід лише налаштувати щось, щоб використовувати його для нестандартних цілей. Я маю тут порівнювати Struts з Rails. У Rails ви повинні помістити свої "дії / екрани" в папку, і тоді вони просто працюють. У Struts вам все одно потрібно помістити їх у папку, але ви також повинні придумати ім'я дії І JSP-файл І ім'я форми І Іменник форми І вказати, як ці три речі працюють разом у Struts-config. xml І вкажіть, що форма належить до запиту (RESTful). Якщо цього недостатньо, відображення форми / форма-квасоля має власний розділ у Struts-config, який потім незалежно відображається в розділі дії в тому ж файлі, і все це покладається на рукописні рядки у файлі JSP для роботи належним чином. Для кожного екрана це принаймні 6 речей, які вам не слід було робити, і стільки ж можливостей зробити помилку. Я думаю, що ви можете встановити більшість або всі ці речі вручну в Rails, якщо вам потрібно, але 2/3 часу розробки Struts вимагає створення та підтримки зайвих шарів складності.

Чесно кажучи, Struts 1 був розроблений, коли люди переносять програми між робочим столом та Інтернетом. Гнучкість, яку втручав Струтц, робить його придатним для всього, що робить Rails, плюс до всього, що знадобиться настільному додатку. На жаль, гора конфігурації, яка дозволяє цю гнучкість, є величезною кулькою і ланцюжком для того, кому просто потрібно написати веб-додаток або просто настільний додаток.

Я десь працював над тим, що вони зробили наступний крок і аргументували "Конфігурація над кодом ", але побачивши, що це було зроблено до своєї логічної крайності, результат - конфігурація стає новою мовою кодування. Це була гра з оболонками, де складність пересувалася, не приручаючись ні в якому значному способі. І мені це вдячно за всі перевірки типу та інші мережі безпеки, які має добре розроблена мова програмування. Якийсь напівзапечений конфігураційний файл конфігурації, який вибухає без повідомлення про помилку, якщо ви додасте пробіл або апостроф, НЕ є поліпшенням щодо якості мови програмування, для якого написані набори інструментів редагування та компілятор якості.

Я не можу собі уявити, що наявність розумних стандартних стандартів порушує будь-які теоретичні принципи щодо розширюваності та модульності. Програміст Ruby / Rails швидше заграє гарячий покер у їх око, ніж перейде на рамку типу Struts 1, де всі конфігурації зроблені явно в декількох XML-файлах. Я загалом не сперечаюся з Rails vs. Struts, але ця конвенція може стати величезною виграшкою продуктивності. Ці дві технології є найбільш екстремальним порівнянням у реальному світі.

Якщо ви взагалі працюєте в Java, ознайомтеся з розділом Джошуа Блоха "Ефективна Java", пункт 2: "Розгляньте, як будівельник стикається з багатьма параметрами конструктора", стор. 11-16. Для більшості цілей потрібні деякі параметри (конфігурація), а деякі - необов'язкові. Основна ідея полягає в тому, щоб вимагати лише необхідної конфігурації і лише змусити користувача (який може бути іншою програмою) вказати додаткові параметри за потребою. Місяць тому я прибрав купу коду з цим малюнком, і він позитивно виблискує.


7

Іншими словами, функціональність програми не повністю пояснюється її власним кодом, а також документацією рамки.

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

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

Наприклад, припустимо, що в деяких рамках A подія FooBarвикликає виклик handleFooBar. В іншому рамках B це співвідношення налаштовано десь у XML-файлі.

Так, в А просто

handleFooBar() {
   ...
}

і якщо ви неправильно розібрали FooBar, він буде називатися, коли FooBar трапляється.

У В, це знову

handleFooBar() {
   ...
}

але також

<eventconfiguration>
  <event>
    <type>FooBar</type>
    <handler>handleFooBar</handler>
  </event>
</eventconfiguration>

Завдяки сотням речей, які можна налаштувати таким чином, все занадто легко випадково створити тонкий помилку на кшталт

<eventconfiguration>
  <event>
    <type>BarFoo</type>
    <handler>handleFooBar</handler>
  </event>
</eventconfiguration>

адже після вставки копії ми лише змінилися, <type>але забули змінити <handler>.

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


1
+1: під уникнути повторних, бурильно-на-записи, важко читається, майже завжди очевидні конфігурації є основною перевагою конференц-над-конфігурації.
Йоахім Зауер

-1

Це може порушувати мало принципів, але в той же час він підкоряється одному з найважливіших принципів проектування - SRP (єдиний принцип відповідальності).


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