Мені було доручено реалізувати мову домену для інструменту, який може стати досить важливим для компанії. Мова проста, але не тривіальна, вона вже дозволяє вкладати цикли, об'єднання рядків тощо, і практично впевнені, що інші конструкції будуть додані в міру просування проекту.
З досвіду я знаю, що написання лексема / аналізатора вручну - без граматики є тривіальним - це трудомісткий і схильний до помилок процес. Тож мені залишилися два варіанти: генератор парсера à la yacc або бібліотека комбінаторів на зразок Parsec. Перший також був хорошим, але я вибрав другий з різних причин і реалізував рішення на функціональній мові.
Результат для мене досить вражаючий, код дуже лаконічний, елегантний і читабельний / вільний. Зізнаюсь, це може виглядати трохи дивно, якщо ви ніколи не програмували нічого, крім java / c #, але тоді це було б правдою для нічого, що не написано в java / c #.
У якийсь момент, однак, мене буквально напав колега. Після швидкого погляду на мій екран він заявив, що код незрозумілий і що я не повинен винаходити розбір, а просто використовувати стек і String.Split, як всі. Він зробив багато шуму, і я не зміг його переконати, частково тому, що мене сприйняли зненацька і не мали чіткого пояснення, частково тому, що його думка була непорушною (жоден каламбур не призначений). Я навіть запропонував пояснити йому мову, але безрезультатно.
Я впевнений, що обговорення збирається повторно перед керівництвом, тому я готую кілька вагомих аргументів.
Ось кілька перших причин, які мені спадають на думку уникати рішення на основі String.Split:
- тобі потрібно чимало ifs для обробки спеціальних справ, і речі швидко виходять з-під контролю
- багато індексів жорсткого коду масиву робить технічне обслуговування болісним
- надзвичайно важко обробляти такі речі, як виклик функції як аргумент методу (наприклад, add ((add a, b), c)
- дуже важко надати значущі повідомлення про помилки у разі помилок синтаксису (дуже ймовірно, що трапиться)
- Я все для простоти, ясності та уникаю зайвих розумних криптовалют, але я також вважаю, що це помилка притупляти кожну частину кодової бази, так що навіть фліппер із гамбургер може це зрозуміти. Це той самий аргумент, який я чую за те, що не використовую інтерфейси, не приймаю розділення проблем, копіюючи-вставляючи код і т. Д. Для роботи над програмним проектом потрібен мінімум технічної компетентності та готовності вчитися. (Я не буду використовувати цей аргумент, оскільки це, мабуть, буде образливим, і розпочати війну ніхто не допоможе)
Які ваші улюблені аргументи проти розбору способу Cthulhu ? *
* звичайно, якщо ти зможеш переконати мене, він правий, я також буду абсолютно щасливий