В программировании мы часто сталкиваемся с выбором: охватить каждый возможный вариант использования индивидуально или решить общую проблему:
Очевидно, что решение неотложной проблемы происходит быстрее, однако создание обобщенного решения сэкономит время в будущем.
Как я узнаю, когда лучше всего попытаться охватить конечный список дел, или создать общую систему, охватывающую все возможности?
algorithms
problem-solving
Pureferret
источник
источник
Ответы:
Во-первых, вы передаете соль. Тогда вы передаете перец. Затем вы передаете тертый сыр пармезан. На данный момент у вас достаточно опыта, чтобы начать разработку общей системы передачи приправ.
Он работает в программных проектах таким же образом: используйте системы специального назначения, которые вы разрабатываете, как ваши шаги обучения к обобщенным, поэтому, когда пришло время запустить систему общего назначения, вы будете лучше уверены в том, что вы создаете, потому что у вас есть несколько специальных систем под вашим поясом.
источник
Опыт.
Единственный способ узнать это - попробовать один путь раньше, увидеть, как он укусил тебя в зад (или ты потратил кучу времени). Повторяйте, пока не получите немного в задницу меньше.
Даже тогда вы не очень знаете ; тебе просто лучше угадать.
источник
Чтобы основываться на ответах от dasblinkenlight и Paddy3118 , если у вас нет нескольких вариантов реализации, вам не нужно обобщать! Причина смешного карикатуры XKCD заключается в том, что это преждевременное обобщение . Когда его просят передать соль, невидимый персонаж немедленно переходит к «разработке системы для передачи произвольных приправ», когда все, о чем просил первый персонаж, была соль. Это хорошая шутка для разработчиков, так как я думаю, что мы все видели случаи преждевременного обобщения.
Принцип, противостоящий преждевременному обобщению, - это ЯГНИ (Тебе это не нужно). Есть много материалов об этом, доступных в Интернете, но в основном YAGNI указывает на ряд рисков в обобщении без выгоды нескольких реальных случаев использования, включая возможность того, что множественные варианты использования могут фактически не появляться. Или, что более тонко, отсутствие реальных вариантов использования требует, чтобы делать предположения о том, что необходимо в будущем. Эти предположения могут быть и часто являются неверными.
источник
Кажется, легче быть универсальным в малом, то есть не создавать класс для обработки справочной таблицы, которая отображает целые числа в строки, когда вы можете сделать разумный класс словаря, который обрабатывает любую пару типов (где первый тип поддерживает некоторый тип сравнение).
В прошлой жизни я делал много проектов промышленной автоматизации для машин, которые обрабатывали непрерывную сеть материалов. Сталь, алюминий, бумага, пластик, .... Вы разворачиваете его на одном конце и снова скручиваете на другом, сделав что-то полезное в середине. В одной отрасли вы начинаете с «выигрышной катушки», а не с «раскручивания». Если вы используете неправильную терминологию, то вы идиот в глазах клиента на несколько миллионов долларов. Вы будете поражены тем, как мало можно абстрагировать для повторного использования из одного проекта в другой. OTOH, часто можно создать основу или шаблон в качестве отправной точки. Он будет настроен для работы под рукой, но, по крайней мере, он получит пользу от изучения предыдущих проектов. И все в команде знали, откуда мы начинали.
источник
Сделайте это один раз, сделайте это дважды, сделайте это три раза, обобщите.
источник
Раз, два, много!
Во втором случае вы должны думать об обобщении. При запросе третьего вы должны предоставить его из обобщенного кода и использовать первый и второй случай, ранее решенный индивидуально, в качестве тестовых случаев.
источник