Category: искусство

Category was added automatically. Read all entries about "искусство".

flow

Искусство не-написания кода

Программисты любят писать код. А когда менеджмент ещё и мотивирует их на увеличение объёмов, то более-менее работающий результат становится бешено дорогим в отладке, поддержке и развитии. Пример такого подхода: https://github.com/SonyWWS/ATF/wiki/Registering-Menus-and-Commands

Процитирую фрагмент с добавлением пункта в меню:
var commandItem = m_commandService.RegisterCommand(
new CommandDef(
new ContextMenuHelpTag() { Index = i },
null,
Groups.Help,
"Help".Localize(),
new string[] { "Help".Localize() },
"Help".Localize(),
null,
null,
Sce.Atf.Applications.CommandVisibility.None), this);


Можно так писать код? Нет. Это уродливо, нечитаемо и опасно.

Лучше не писать код, а просто указать желаемое в наиболее читаемом виде.

Прямо в контексте описания меню.

На Python:
@uitem(vis_label="Help", shortcut="F1")
def Help():
    ...command behavior...


Или на JavaScript:
uitem("Help", {vis_label: "Help", shortcut: "F1", action: function(){...command behavior...}})

Или на другом языке, который вы выбрали (где-то через динамику, где-то через метапрограммирование или аннотации).

Что даёт такое не-написание кода:
1. Расширяемость. Поддержка vis_tooltip или enabled_if добавляется без какого-либо изменения клиентского кода. Или можно вместо action указать navigation="Help/index.htm".
2. Универсальность. Если добавить vis_icon="Help.png", то из того же контекста прекрасно генерируется тулбар.
3. Автоматическая верификация. На старте приложения проверяется корректность описаний и целостность подгружаемых ресурсов.
4. Простая локализация. Все статичные vis_label или msg_* легко сохраняются в таблицу для локализаторов или перегружаются из неё на старте приложения.
5. Независимость от низлежащих платформ и фреймворков.

Таким образом обеспечивается значительная экономия ресурсов при написании и поддерже продукта/сервиса.

Но что собой представляет не-написание кода в общем виде? Это сочетание кусочков настоящего кода (алгоритмов) с компактным описанием синтезируемых и/или распознаваемых данных. Другой хороший пример - парсеры, которые создаются внешними генераторами (YACC для C и многих других языков) или в виде EDSL (Parsec в Haskell).

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