Це досить розпливчасте запитання, але це те, на що я ніколи не відчував відповіді задовільно, читаючи про належний дизайн.
Як правило, коли ви дізнаєтесь про об'єктно-орієнтоване програмування, абстрагування, розбиття факторів тощо, святий грааль дизайну - і тому, чому вони завжди стверджують, що ви використовуєте розроблені методи розробки - це те, що це зробить вашу програму "легкою для зміни" , "ремонтопридатний", "гнучкий" або будь-який із синонімів, що використовуються для вираження такого продуктивного звучання поняття. Позначаючи ivars приватним, розбиваючи код на багато маленьких, автономних методів, зберігаючи інтерфейси загальними, ви нібито отримуєте можливість змінювати свою програму з повною легкістю та витонченістю.
За відносно невеликих змін це добре спрацювало для мене. Зміни у внутрішніх структурах даних, які використовуються класом для підвищення продуктивності, ніколи не представляли великих труднощів, а також не змінювали кінця інтерфейсу користувача незалежно від API, наприклад, перепроектування системи введення тексту або капітального ремонту графіки для елемента гри .
Всі ці зміни здаються суттєвими самостійними. Жоден з них не передбачає змін у поведінці чи дизайні компонента вашої програми, що змінюється, наскільки це стосується зовнішнього коду. Незалежно від того, пишете ви процедурно чи в стилі OO, з великими функціями чи малими, це легко зміни, навіть якщо у вас є лише помірно хороший дизайн.
Однак щоразу, коли зміни стають великими і волохатими, тобто змінами в API - жодна з моїх дорогоцінних «моделей» ніколи не приходить на допомогу. Велика зміна залишається великою, постраждалий код залишається постраждалим, і попереду мене перебувають багато годин роботи з нерестування помилок.
Отже, моє запитання таке. Наскільки великі зміни вимагає належного дизайну, щоб спростити це? Чи є якась подальша невідома для мене техніка проектування, або я не змогла реалізувати, що справді робить модифікацію, що звучить, як ліпша, чи це обіцянка (про яку я чув, зроблений багатьма різними парадигмами) - просто приємна ідея, повністю відключений від незмінних істин розробки програмного забезпечення? Чи є "інструмент зміни", який я можу додати до своєї панелі інструментів?
Зокрема, проблема, з якою я стикаюсь, що привела мене до форумів, така: я працював над впровадженням інтерпретованої мови програмування (реалізованої в D, але це не актуально), і я вирішив, що аргументи моїх завершень повинні бути на основі ключових слів, а не позиційних, як вони є. Це потребує зміни всього існуючого коду, який викликає анонімні функції, що, на щастя, є досить малим, тому що я рано починаю розвивати свою мову (<2000 рядків), але було б величезним, якби я прийняв це рішення на більш пізньому етапі. У такій ситуації, чи є спосіб, що завдяки належному передбаченню дизайну я міг би полегшити цю модифікацію, або певні (більшість) змін суттєво далекосяжні? Мені цікаво, чи це якимось чином невдача моїх власних дизайнерських навичок - якщо це так, я '
Щоб було зрозуміло, я жодним чином не скептично ставляюся до ООП або будь-яких інших моделей, які зазвичай використовуються. Однак для мене їх чесноти полягають у первинному написанні, а не у підтримці баз коду. Спадкування дозволяє добре абстрагувати повторювані шаблони, поліморфізм дозволяє розділити код за зрозумілою людиною функцією (який клас), а не машинно зрозумілим ефектом (яка галузь switch
висловлювання), а невеликі, автономні функції дозволяють вам писати в дуже приємному стилі «знизу вгору». Однак я скептично ставлюсь до їхніх вимог про гнучкість.
foo metarg1: bar metarg2: baz
як foo.metarg1_metarg2_(bar, baz)
. Однак моя мова вносить більші зміни, а саме параметри на основі списку до параметрів на основі словника, що впливає на час виконання, але не на аналізатор, насправді через особливості моєї мови я зараз не заходжу. Оскільки немає чіткого відображення між аргументованими ключовими словами та позиційними аргументами, час роботи - це головне питання.