Наследование Java или статический метод - PullRequest
2 голосов
/ 07 марта 2012

Существует абстрактный класс AbstractAgent, и в настоящее время существует 27 классов, которые расширяют этот класс.

Я начал разрабатывать несколько агентов, и все мои 5 агентов расширяют класс AbstractAgent.

Теперь я заметил, что есть getFilePath(), который я копирую во всех моих 5 агентах.Затем я понял, что из существующих 27 классов также было много классов, у которых был этот метод.Я подумал, что было бы неплохо поместить этот метод в базовый класс AbstractAgent и позволить всем использовать этот метод.Но я не хочу, чтобы все существующие классы меняли свой код. Я изменил имя метода, чтобы в дальнейшем его мог использовать любой.

Человек, который сделал мой обзор кода, предложил мне не трогать класс AbstractAgent, потому что он уже используется существующими клиентами, и поместил этот метод в некоторый служебный класс.

Я не убежден его аргументом.Кто-нибудь хочет погрузиться в свои мысли.

Ответы [ 5 ]

5 голосов
/ 07 марта 2012

В этом случае, поскольку класс AbstractAgent уже используется другими классами, и, как вы упомянули сами НЕ , все классы реализуют этот метод, вы действительно НЕ должны изменять AbstractAgent.Однако вы можете расширить AbstractAgent в другом абстрактном подклассе с именем say AbstractAgentWithFilePath, который объявляет, что вам нужен дополнительный метод, и затем эти классы расширяют класс AbstractAgentWithFilePath.

3 голосов
/ 07 марта 2012

Если метод getFilePath() абсолютно одинаков для всех подклассов AbstractAgent, тогда непременно доберитесь до абстрактного класса (используйте инструменты рефакторинга в IDE), удалите его из подклассовзатем запустите юнит-тесты (у вас есть есть юнит-тесты, верно?) и убедитесь, что все работает нормально.

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

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

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

3 голосов
/ 07 марта 2012

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

0 голосов
/ 07 марта 2012

Здесь нет правильного ответа.Только вы, ваши коллеги и ваша компания знают, как и где используется AbstractAgent, и как его изменение влияет на различные команды, отделы или клиентов.Решения о том, где размещать код, часто являются более политическими и социальными, чем обусловленные выбором дизайна «чистой комнаты».

С чисто кодовой точки зрения я поддерживаю радикальный рефакторинг: избавьтесь от ВСЕХ дублирующего кода во ВСЕХ подклассахAbstractAgent, и переместите всех в новый getFilePath () в AbstractAgent.

Но у вас может не быть полномочий сделать это, и вы можете получить откат.Или, может быть, getFilePath () иногда немного отличается (вам не совсем ясно). В этом случае любой сделанный вами выбор кажется компромиссом.Ваш обозреватель кода может настаивать на 'getFilePath2 ()' в AbstractAgent, потому что он проливает свет на проблему несовершенного повторного использования кода и чувствует, что он "загрязняет" суперкласс временным обходным решением, которое должно быть действительно решено путем привлечения всехна сегодняшний день с действительно общим кодом в суперклассе.Кто знает.

Возможно, метод статической утилиты будет лучшим выбором до тех пор, пока не будет выполнен полный рефакторинг.

0 голосов
/ 07 марта 2012

если метод тесно связан с классами агента, поместите его в реферат - это хороший вариант, но если это не так, поместите его в другой служебный класс, который обрабатывает все действия, связанные с файлом, будет приемлемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...