Мое эмпирическое правило заключается в том, что, когда мне нужно что-то сделать в третий раз, самое время написать небольшой сценарий для его автоматизации или переосмыслить свой подход.
В данный момент я не делаю полноценный «инструмент», просто небольшой скрипт (обычно bash или python; тоже будет работать perl или даже PHP), который автоматизирует то, что я делал раньше. Это в основном применение принципа СУХОЙ (или принципа «Единого источника истины», который, по сути, одно и то же) - если вам нужно изменить два исходных файла в тандеме, должна быть общая истина, которой они делятся, и что Истина должна быть вынесена и храниться в одном центральном месте. Здорово, если вы можете решить эту проблему внутренне путем рефакторинга, но иногда это неосуществимо, и именно здесь появляются пользовательские сценарии.
Затем, позже, сценарий может превратиться или не превратиться в полноценный инструмент, но я обычно начинаю с очень специфического сценария с множеством вещей, жестко запрограммированных в нем.
Я ненавижу грубую работу со страстью, но я также твердо верю, что это признак плохого или неправильного дизайна. Быть ленивым - это важное качество для программиста, и лучше быть таким, когда вы проделываете большую работу, чтобы избежать повторяющейся работы.
Конечно, иногда баланс отрицательный - вы тратите три часа на рефакторинг своего кода или написание сценария, чтобы сэкономить один час повторяющейся работы; но, как правило, баланс является положительным, особенно если учесть затраты, которые не являются очевидными: человеческие ошибки (люди действительно плохо работают с повторяющимися операциями), меньшая кодовая база, лучшая ремонтопригодность благодаря уменьшенной избыточности, лучшая самостоятельная документация, более быстрое будущее разработка, более чистый код. Так что даже если баланс кажется отрицательным прямо сейчаскодовая база будет расти и дальше, и инструмент, который вы написали для создания веб-форм для трех объектов данных, будет работать, когда у вас будет тридцать объектов данных. По моему опыту, баланс обычно оценивается в пользу кропотливой работы, вероятно, потому, что повторяющиеся задачи легче оценить и, следовательно, недооценить, а рефакторинг, автоматизация и абстрагирование воспринимаются как менее предсказуемые и более опасные, и, следовательно, переоцененные. Обычно получается, что автоматизация не так уж и сложна.
И тогда есть риск сделать это слишком поздно: легко преобразовать три совершенно новых класса объектов данных в форму и написать скрипт, который генерирует для них веб-формы, и как только вы это сделаете, легко добавить еще 27 классов, которые также работать с вашим сценарием. Но написать сценарий практически невозможно, когда вы достигли точки, в которой есть 30 классов объектов данных, каждый с рукописными веб-формами и без какой-либо согласованности между ними (так называемый «органический рост»). Сохранение этих 30 классов с их формами - это кошмар повторяющегося кодирования и полуручного поиска-замены, изменение общих аспектов занимает в тридцать раз больше времени, чем нужно, но написание сценария для решения проблемы, который был бы легким перерывом на обед, когда проект начался, теперь это ужасный двухнедельный проект с ужасающей перспективой на месячные последствия, состоящий из исправления ошибок, обучения пользователей и, возможно, даже отказа от и возвращения к старая кодовая база. По иронии судьбы, написание беспорядка из 30 классов заняло гораздо больше времени, чем чистое решение, потому что вы могли все это время использовать удобный сценарий. По моему опыту, автоматизация повторяющейся работы слишком поздно является одной из основных проблем в длительных крупных программных проектах. потому что ты мог все это время ездить на удобном сценарии. По моему опыту, автоматизация повторяющейся работы слишком поздно является одной из основных проблем в длительных крупных программных проектах. потому что ты мог все это время ездить на удобном сценарии. По моему опыту, автоматизация повторяющейся работы слишком поздно является одной из основных проблем в длительных крупных программных проектах.