Преждевременная абстракция против YAGNI в нескольких похожих проектах
Я недавно начал заниматься программированием для хобби. Когда я только начинал, я старался создавать абстракции. Даже при том, что я имел в виду определенную игру, я спрашивал себя, как каждый элемент может использоваться в нескольких играх и типах игр. Я понял, что это противоречит фактической реализации конкретной игры.
Поэтому я начал с нуля, писать код, который отвечал бы требованиям игры, которую я имел в виду (и только эту игру). Я все еще создавал абстракции, но только тогда, когда эта игра сама нуждалась в этом. Я очень доволен этим способом ведения дел. Я чувствую, что код находится на правильном уровне абстракции, который необходим для рассматриваемой игры.
Мой вопрос: как эта методология подходит, когда есть несколько похожих проектов? Допустим, я создал космическую игру с боковыми скроллерами. После того, как я закончу, я решаю сделать космический шутер с двойными ручками. В двух играх определенно будут общие элементы. Что было бы лучшим способом сделать это в свете ранее написанного кода? Я могу думать о нескольких возможностях:
- Игнорировать старый код Начните полностью с нуля снова.
- Позвольте мне скопировать и вставить часть старого кода и изменить его в соответствии с текущей игрой и только с текущей игрой.
- Возьмите старый код и обобщите его так, чтобы он мог вместить обе игры.
Подумав об этом, что, если сценарий немного изменился, и это была не новая игра. Что, если я решу, что в моей игре с боковой прокруткой есть несколько уровней-двойников? Похоже, в этом случае вариант 3 будет путь. Означает ли это, что вариант 3 - это путь, даже если это новая игра?
Снова немного изменив сценарий, что если бы это были две разные игры, но я работал над обоими проектами одновременно? Я неизбежно начал бы видеть сходство и возможности для абстракции. Должен ли я противостоять этой абстракции и сохранять код отличным и специфичным для каждой игры?
1 ответ
Ваш вопрос является гипотетическим, поэтому сложно дать конкретный ответ, потому что многое зависит от конкретной ситуации.
Если новая игра достаточно отличается, то вы бы начали с нуля.
Если достаточно просто скопировать и вставить код, тогда вы можете сделать это. Это зависит от содержания старой игры. Если вы окажетесь в ситуации, когда вам нужно будет поддерживать обе игры в течение определенного периода времени, то копирование-вставка - плохая идея, потому что вы должны помнить, что нужно вносить исправления в обоих местах. В этой ситуации предпочтительным может быть вариант 3 - обобщение для платформы, чтобы вы могли вносить исправления в платформу.
Игры обычно не поддерживаются в течение длительного времени, поэтому создание платформы по этой причине может не стоить того. Если ваша игра похожа на MMORPG с длительным сроком обслуживания, то ситуация другая.
Последний фактор - время запуска. Копирование может быть медленным и глючным. Это не может быть проблемой, если вы планируете сделать только одну игру. Некоторые компании специализируются на игровых "продуктовых линейках", где они выпускают новые игры каждые несколько месяцев (хороший пример - Telltale). В этих ситуациях лучше разработать "движок", и вы создаете новые игры, просто подключая новый контент.
Вы упомянули, что делаете это как хобби. В этом случае ничего из этого не имеет значения, потому что 90% решений исходит из бизнес-модели и только 10% из технических факторов.
Кроме того, многие компании просто лицензируют движки, разработанные сторонними разработчиками, и создают игру на ее основе. Даже для хобби-программирования существует множество движков, которые вы можете использовать прямо с первого дня и построить свою игру на вершине этого, поэтому вопрос на самом деле заключается в том, чтобы построить против покупки.