Как бороться с классами с одинаковыми именами (разные пакеты)

9

Я и моя команда 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

Что более правильно с точки зрения управления кодом и масштабируемости?

в настоящее время мы смешиваем оба подхода и начинаем иметь противоречие

Йосеф Харуш
источник
Если это случайно, это, вероятно, не имеет значения - если это повторяющийся шаблон, я бы, вероятно, назвал классы более точно, чтобы он не превратился в беспорядок.
assylias
Вы не представляете, насколько я ненавижу java.util.Dateи java.sql.Date- тем более, что он java.sql.Dateявляется подклассом java.util.Dateи поэтому прекрасно выскальзывает из слоев данных (и не очень хорошо сериализуется в JSON).
Вариант 2.1 Всегда используйте полное имя, даже если на другое не ссылаются
Caleth

Ответы:

18

Используйте имя пакета. Именно из-за этого типа проблем Java использует соглашение об именовании пакетов. Это предотвращает такого рода проблемы, будь то две команды в одной компании или две команды по разные стороны земли.

Брайан Оукли
источник
1

На данный момент у вас есть один класс ModelDevice (Устройство в пакете модели). Что если у вас есть другой такой ModelDevice для другой классификации? Проблема может сохраняться, и накладные расходы также будут увеличиваться.

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

itsraghz
источник
0

Просто чтобы добавить один аспект, который еще не был упомянут:

Посмотрите на шаблоны использования, то есть источники Java, которые ссылаются на один или оба класса.

ИМХО, в большинстве случаев исходные файлы должны ссылаться только на один из конфликтующих классов, и из контекста должно быть ясно, имеют ли они дело с моделью или миром данных. Если по какой-либо причине это сложно, я бы переименовал классы, так как я обычно не люблю имена классов с префиксом пакета в исходном коде (это ухудшает читаемость).

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

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

Ральф Клеберхофф
источник