Это довольно расплывчатый вопрос, но я никогда не чувствовал, что на него ответили удовлетворительно, читая о правильном дизайне.
Как правило, когда вы узнаете об объектно-ориентированном программировании, абстракции, факторинге и т. Д., Святой Грааль дизайна - и причина, по которой они всегда утверждают, что вы используете рассматриваемые методы разработки - заключается в том, что это сделает вашу программу «легкой для изменения» «ремонтопригодный», «гибкий» или любой из синонимов, используемых для выражения такой продуктивно звучащей концепции. Помечая ivars как частный, разбивая код на множество небольших, автономных методов, сохраняя общие интерфейсы, вы предположительно получаете возможность изменять свою программу с полной легкостью и изяществом.
Для относительно небольших изменений, это хорошо сработало для меня. Изменения во внутренних структурах данных, используемых классом для повышения производительности, никогда не были серьезной трудностью, и не было изменений в пользовательском интерфейсе, независимо от API, таких как перепроектирование системы ввода текста или капитальный ремонт графики для элемента игрового процесса. ,
Все эти изменения кажутся по сути автономными. Ни один из них не предполагает каких-либо изменений в поведении или дизайне изменяемого компонента вашей программы, если это касается внешнего кода. Независимо от того, пишете ли вы процедурно или в стиле OO, с большими или маленькими функциями, эти изменения легко внести, даже если у вас только умеренно хороший дизайн.
Однако всякий раз, когда изменения становятся большими и волосатыми, то есть изменениями в API, ни один из моих драгоценных «шаблонов» никогда не приходит на помощь. Большое изменение остается большим, уязвимый код остается затронутым, и впереди меня много часов работы по порождению ошибок.
Итак, мой вопрос заключается в следующем. Насколько велико изменение, которое, как утверждает надлежащий дизайн, может способствовать? Есть ли какая-то дальнейшая методика проектирования, либо мне неизвестная, либо которую я не смог реализовать, которая действительно делает модификацию с липким звучанием простой, или это обещание (которое, как я слышал, было сделано многими различными парадигмами), просто хорошая идея, полностью оторваны от неизменных истин разработки программного обеспечения? Есть ли «инструмент изменения», который я могу добавить к своему инструментальному поясу?
В частности, проблема, с которой я столкнулся, которая привела меня к форумам, заключается в следующем: я работал над реализацией интерпретируемого языка программирования (реализованного в D, но это не актуально), и я решил, что аргументы моих замыканий должны быть на основе ключевых слов, а не позиционные, как они в настоящее время. Это требует изменения всего существующего кода, который вызывает анонимные функции, что, к счастью, довольно мало, потому что я нахожусь на ранней стадии разработки моего языка (<2000 строк), но было бы огромным, если бы я принял это решение на более позднем этапе. Есть ли в такой ситуации какой-нибудь способ, который, если бы я был достаточно предусмотрительным в дизайне, мог бы упростить эту модификацию, или определенные (большинство) изменения имеют далеко идущие последствия? Мне любопытно, является ли это каким-то образом неудачей моих собственных дизайнерских навыков - если да, то я
Чтобы быть ясным, я никоим образом не скептически отношусь к ООП или любым другим шаблонам, обычно используемым. Для меня, однако, их достоинства заключаются в оригинальном написании, а не в поддержании основ кода. Наследование позволяет хорошо абстрагировать повторяющиеся шаблоны, полиморфизм позволяет разделять код по понятной человеку функции (какой класс), а не по машинному эффекту (какая ветвь switch
оператора), а небольшие автономные функции позволяют вам писать в очень приятном стиле "снизу вверх". Однако я скептически отношусь к их заявлениям о гибкости.
foo metarg1: bar metarg2: baz
как foo.metarg1_metarg2_(bar, baz)
. Тем не менее, мой язык вносит более существенные изменения, а именно: списочные параметры в словарные параметры, что влияет на время выполнения, но не на синтаксический анализатор, на самом деле, из-за специфических свойств моего языка, я не буду сейчас вдаваться в подробности. Поскольку нет четкого сопоставления между неупорядоченным ключевым словом и позиционными аргументами, время выполнения является основной проблемой.