Я думаю, что, возможно, логика здесь несколько отсталая и вызывает проблему. Что если ваши методы выглядят так:
updateTo1002()
{
if (version != 1001) {
updateTo1001();
}
// do the job
}
updateTo1003()
{
if (version != 1002) {
updateTo1002();
}
// do the job
}
Я не знаю, какой именно у вас сценарий использования, но мне кажется, что чаще всего вы захотите обновить его до самой последней версии, но при этом установите дополнительные обновления по мере необходимости. Я думаю, что при таком подходе эта логика лучше улавливается.
Редактировать: из комментария @ user470379
В данном случае, в основном, это выявление того факта, что у вас есть шаблон копирования / вставки, и его редактирование.
В этом случае проблема связи является едва ли проблемой, но может быть. Я дам вам несколько вещей, которые могут возникнуть в вашем сценарии, которые было бы трудно кодировать, если бы вы делали это следующим образом:
- Каждое обновление теперь нуждается в дополнительном этапе очистки, поэтому после updateTo1001 () вызовите cleanup () и т. Д.
- Вы должны иметь возможность сделать шаг назад, чтобы протестировать более старые версии
- Вам необходимо вставить обновление между 1001 и 1002
Давайте возьмем комбинацию этих двух, сделанную по вашему шаблону. Сначала давайте добавим «undoUpgradeXXXX ()», чтобы отменить каждое обновление и иметь возможность вернуться назад. Теперь вам нужен второй параллельный набор операторов if для отмены действий.
Теперь давайте добавим к этому «insert 1002.5». Внезапно вы переписываете две потенциально длинные цепочки операторов if.
Ключевым признаком того, что у вас будут такие проблемы, является то, что вы кодируете в шаблоне. Обращайте внимание на паттерны, подобные этому - на самом деле, одно из моих первых указаний обычно - когда я смотрю через чей-то код на чей-то код, если я могу увидеть паттерн, даже не имея возможности прочитать что-нибудь написанное так:
********
***
*****
********
***
*****
...
тогда я знаю, что у меня будут проблемы с их кодом.
Самым простым решением, как правило, является удаление различий из каждой «группы» и помещение их в данные (часто это массив, необязательно внешний файл), сведение групп в цикл и итерация по этому массиву.
В вашем случае самое простое решение - сделать каждый из ваших объектов обновления одним способом обновления. Создайте массив этих объектов и, когда пришло время обновить, выполните итерации по ним. Вам также может понадобиться какой-то способ их упорядочить - в настоящее время вы используете число, которое может сработать - или дата может быть лучше - таким образом вы можете легко «перейти» к определенной дате.
Несколько различий:
- Добавление нового поведения к каждой итерации (cleanup ()) будет одной строкой модификации вашего цикла.
- Изменение порядка будет локализовано для изменения ваших объектов - возможно, даже проще.
- Было бы легко разбить обновление на несколько шагов, которые необходимо вызвать по порядку.
Позвольте мне привести вам пример этого последнего. Предположим, что после того, как все ваши обновления были запущены, вам нужно пройти этап инициализации для каждого (в каждом отдельном случае). Если вы добавляете метод инициализации к каждому объекту, то модификация вашего начального цикла будет тривиальной (просто добавьте вторую итерацию через цикл). В исходном дизайне вам нужно будет скопировать, вставить и отредактировать всю цепочку if.
Объедините ПРОСТО отмените и инициализируйте, и у вас будет 4 цепочки если. Просто лучше определить проблемы, прежде чем начать.
Я также могу сказать, что удаление кода, подобного этому, может быть трудным (прямо в зависимости от вашего языка). В Ruby это на самом деле довольно просто, в java это может потребовать некоторой практики, и многие не могут этого сделать, поэтому они называют Java негибкой и сложной.
Проводя час тут и там, размышляя над тем, как сократить код, как это сделало для моих способностей программирования больше, чем любые книги, которые я прочитал или обучил, которые у меня были.
Кроме того, это задача, которая дает вам кое-что, вместо того, чтобы редактировать огромные цепочки if, ища ошибку копирования / вставки, в которой вы забыли изменить 8898 на 8899. Честно говоря, это делает программирование увлекательным (вот почему я потратил так много времени на этот ответ)