Вы должны стараться избегать дублирования кода, когда можете. Основная идея в вашем случае состоит в том, чтобы попытаться извлечь все, что кажется выполненным более одного раза, и попытаться «положить» его где-то, где вам нужно написать это только один раз.
В вашем случае, скажем, у нас есть следующее:
public void Bar()
{
...
if (condition)
{
//code for action 1
//code for action 2
}
else
{
//code for action 2
//code for action 1
}
...
}
public void Foo()
{
...
if (condition)
{
//code for action 1
//code for action 2
}
else
{
//code for action 2
//code for action 1
}
...
}
Теперь мы, очевидно, можем видеть, что у вас есть некоторое дублирование кода здесь. Мы можем улучшить это следующим образом:
public void Bar()
{
...
if (condition)
{
Action1();
Action2();
}
else
{
Action2();
Action1();
}
...
}
public void Foo()
{
...
if (condition)
{
Action1();
Action2();
}
else
{
Action2();
Action1();
}
...
}
private void Action1()
{
//code for action 1
}
private void Action2()
{
//code for action 1
}
Это выглядит намного лучше (особенно если код Action1
и код Action2
длинны). Теперь нам удалось написать код для Action1
и Action2
только один раз, независимо от того, сколько методов стиля Foo
или Bar
есть в нашем коде. Но мы все еще можем сделать больше. Вы можете видеть, что мы все еще дублируем некоторый неприятный подробный код. Таким образом, мы можем сделать еще один шаг и сделать следующее:
public void Bar()
{
...
DoAction(condition);
...
}
public void Foo()
{
...
DoAction(condition);
...
}
private void Action1()
{
//code for action 1
}
private void Action2()
{
//code for action 1
}
private void DoAction(bool condition)
{
if (condition)
{
Action1();
Action2();
}
else
{
Action2();
Action1();
}
}
Теперь это ИМХО выглядит намного лучше. Мало того, что нам удалось написать Action1
и Action2
определенный код только один раз, мы теперь также смогли написать эту логику упорядочивания методов только один раз.
Это имеет огромное значение для удобочитаемости и, прежде всего, удобства обслуживания. Например, если ошибка появляется в Action1
, теперь вам нужно всего лишь изменить ее в одном месте. В исходной реализации вам нужно будет проверить весь код и исправить ошибку повсюду.
Кроме того, представьте, что порядок заказов зависит от бизнес-правил, и ваш клиент (о мой сюрприз!) Решает их изменить. В последней версии вам нужно всего лишь изменить код в одном месте.
Правило большого пальца. Избегайте дублирования кода, когда это возможно, это резко сократит код, который вы набираете, и головную боль, которую вы или какая-то бедная душа испытаете в ближайшем будущем.