Я и моя команда R & D поддерживаем большую базу кода. Мы разделили нашу бизнес-логику на несколько пакетов. некоторые из которых имеют классы с одинаковыми именами .
Как вы можете догадаться, имена конфликтуют, когда на оба класса ссылаются в одном и том же файле Java.
Например:
com.myapp.model (package)
- Device (class)
- ...
com.myapp.data (package)
- Device (class)
- ...
У нас была дискуссия о том, как лучше всего лечить эти случаи, и были предложены следующие варианты:
1-й вариант
Переименование класса, добавление префикса
ModelDevice DataDevice
2-й вариант
Использование полного пакета + имя класса, когда на оба ссылаются
com.myapp.model.Device com.myapp.data.Device
Что более правильно с точки зрения управления кодом и масштабируемости?
в настоящее время мы смешиваем оба подхода и начинаем иметь противоречие
java
coding-style
coding-standards
naming
conventions
Йосеф Харуш
источник
источник
java.util.Date
иjava.sql.Date
- тем более, что онjava.sql.Date
является подклассомjava.util.Date
и поэтому прекрасно выскальзывает из слоев данных (и не очень хорошо сериализуется в JSON).Ответы:
Используйте имя пакета. Именно из-за этого типа проблем Java использует соглашение об именовании пакетов. Это предотвращает такого рода проблемы, будь то две команды в одной компании или две команды по разные стороны земли.
источник
На данный момент у вас есть один класс ModelDevice (Устройство в пакете модели). Что если у вас есть другой такой ModelDevice для другой классификации? Проблема может сохраняться, и накладные расходы также будут увеличиваться.
Хотя в настоящее время вы можете обнаружить, что переименование классов может помочь, в долгосрочной перспективе предлагаемый альтернативный вариант заключается в добавлении префиксов к именам пакетов, что и является отраслевым стандартом.
источник
Просто чтобы добавить один аспект, который еще не был упомянут:
Посмотрите на шаблоны использования, то есть источники Java, которые ссылаются на один или оба класса.
ИМХО, в большинстве случаев исходные файлы должны ссылаться только на один из конфликтующих классов, и из контекста должно быть ясно, имеют ли они дело с моделью или миром данных. Если по какой-либо причине это сложно, я бы переименовал классы, так как я обычно не люблю имена классов с префиксом пакета в исходном коде (это ухудшает читаемость).
Если у вас есть исходные файлы, которые имеют дело с обоими мирами, они могут связывать классы с возможностью переводить между двумя различными взглядами на мир, и здесь я бы предпочел найти имена классов с префиксом пакета.
Но видение обоих классов устройств в одном источнике также может служить намеком на то, что источник нарушает принцип единой ответственности, смешивая задачи из модели и мира данных.
источник