2010-07-05 2 views
2

У нас есть устаревшая система, состоящая из классов A, B и C. A является ужасной и большой. Так и Б. И С тоже! (Это признано в компании, и мы пытаемся перефразировать их в будущем).Добавить изменение устаревшего кода

Более страшная вещь A и B расширяет C, которой они действительно не должны, поскольку они на самом деле не то же самое. Разработчик (позвоните ему X), который сделал кодирование, признал, что он сделал это таким образом, чтобы A и B могли использовать «НЕКОТОРЫЕ» методы C!

Теперь клиент хочет обновить устаревшую систему, и для изменения требуется, чтобы я добавил одно и то же изменение в A и B. То, что я могу сделать, это добавить изменение на C, чтобы A и B могли его видеть. Но если я это сделаю, я буду делать то же, что сделал Х.

Что я имею в виду, это написать еще один класс D, поэтому A и B могут иметь собственный D и получать изменения. Как вы думаете?

Заранее благодарен!

Sarah

ответ

4

Имеет смысл. Джош Блох также рекомендует в эффективной Java использовать состав над наследованием. Пока вы на нем проверяете, не можете ли вы переместить еще пару общих подпрограмм. Многие небольшие шаги покрывают большое расстояние.

+1

Если вы можете добавить некоторые модульные тесты раньше, было бы лучше, чтобы быть увереннее в вашем рефакторинге ... –

1

Трудно дать определенный ответ на вопрос, который сформулирован в таких общих терминах.

Идея перемещения общих (без гражданства) методов в вспомогательный класс может быть хорошим. Точно так же делегирование вызовов одного класса на вызовы другого класса может быть хорошим способом уменьшить размер классов, которые раздулись.

Однако трудно сказать, являются ли вспомогательные классы или делегирование наилучшим решением в данном конкретном случае. Например, если методы ваших существующих классов тесно связаны друг с другом, может быть сложно разделить их на отдельные классы.

Возможно, лучшим решением было бы перевести рефакторинг существующих классов и избавиться от неуместного (как вы сообщаете) базового класса.

+0

Да, что именно я хотел бы сделать - чтобы перевести рефакторинг. Однако реальность заключается в том, что мы должны сначала перенести изменения ... :( – sarahTheButterFly

+0

@sarahTheButterFly Будьте осторожны с этим отношением: убедитесь, что каждое изменение, которое вы делаете, оставляет код чище, чем до того, как вы начали. Не отпустите свой код, прежде чем он станет чистым Это не должно быть безупречным, просто менее сложным. Помните слова: «Если вы окажетесь в яме, первое, что нужно сделать, это остановить копание». –

+0

@Peter Да, я понимаю, что вы имеете в виду. Я полностью согласен с предложением Стивена C о продвижении процесса рефакторинга.Однако я не принимаю решение. Я бы хотел, чтобы я был! Я пытаюсь оставить код чище до того, как я начал. Вот почему я задаю вопрос здесь. – sarahTheButterFly

0

Сара,

Трудно дать конкретные советы, не зная точного отношения между A, B и C. Я буду считать A и B должны быть одинаковыми по каким-то образом, если они требуют точного такой же изменение. Таким образом, если A и B схожи, но отличаются от C, вы можете выполнить следующие действия:

  1. Создайте родительский класс D, из которого как A, так и B простираются. Этот родитель содержит функциональность, разделяемую A и B (которую вы планируете изменить).
  2. Либо создайте отдельный класс, который содержит функции A, B и C, и у C и D есть экземпляр его ИЛИ создайте другой родительский класс E для C и D, который содержит функции, которые A, B , и C имеют общий характер.

Опять же, мой совет может быть недействительным, если мои предположения ошибочны. Не могли бы вы дать нам лучшее представление о том, как связаны A, B и C?

+0

Спасибо Джейку за ответ Да, я думаю, что существует вероятность того, что A и B могут иметь родительский класс D. Однако оба класса должны быть переупознаны и разбиты на множество небольших классов. Мне хотелось бы четко изложить, что A, B, C похожи на как они связаны, но я просто не могу, потому что они слишком грязные и сложные. Мы думаем переписывать их, но я помню статью Джоэля о рассказе Netscape ... Я думаю, что этот пост должен быть закрыт, чтобы я не путал больше людей. – sarahTheButterFly

+0

Не проблема, Сара. Я думаю, мы все были в той же позиции, что и сейчас. Вам просто нужно сделать то, что вам дано, и, надеюсь, сделать систему немного лучше в этом процессе. –

Смежные вопросы