Почему закрытый доступ к методам предпочтительнее, чем закрытый пакет?

Разработчики Java всегда используют частный уровень доступа для методов, которые не используются за пределами этого класса. Это дает известные преимущества, но с другой стороны мы увеличиваем сложность модульных тестов. В большинстве случаев наш код не используется какими-либо другими сервисами /API, и мы фактически не заботимся о "частных" преимуществах. Но я считаю, что мы заботимся о том, чтобы создавать удобочитаемые простые модульные тесты. Учитывая это, почему бы не создать все методы в классе как "пакетно-приватные" по умолчанию и сделать их "приватными" только в том случае, когда нам это действительно нужно?

1 ответ

Почему закрытый доступ к методам предпочтительнее, чем закрытый пакет?

Я бы не сказал, что это предпочтительнее.
Обе практики приемлемы и не шокируют меня.
Сейчас private следует отдавать предпочтение как можно большему, поскольку это предотвращает нежелательное package-private это создает немного больше связи должны быть использованы с уместностью.

В большинстве случаев наш код не используется какими-либо другими сервисами /API, и мы фактически не заботимся о "частных" преимуществах.

Даже если вы разрабатываете библиотеку для использования некоторыми клиентами, использование модификатора пакета неплохо, так как классы в package-private не входит непосредственно в API.

Но я считаю, что мы заботимся о том, чтобы создавать удобочитаемые простые модульные тесты. Учитывая это, почему бы не создать все методы в классе как "пакетно-приватные" по умолчанию и сделать их "приватными" только в том случае, когда нам это действительно нужно?

И наоборот, модульное тестирование и private Модификаторы не являются несовместимыми вообще.
Я согласен, что с помощью package-private модификатор вместо private позволяет легко тестировать / макетировать / переключать членов классов.
В некоторых случаях такая практика является приемлемой.
Обобщая это, прежде всего выбор дизайна.
Лично я пользуюсь package-private модификатор только как действительно актуальный (реальная проблема для тестирования или внутренней обработки, чтобы разделить его с другими классами того же пакета), потому что помимо упрощения модульного тестирования (что является хорошим моментом), я думаю, что такая практика может способствовать дизайну это связывает классы сильнее, чем требуется.
Например, предположим, что в B класс вы можете получить доступ к полю / методу A экземпляр класса, потому что они находятся в одном пакете.
Предположим, что концептуально это поле является частью очень внутренней части A реализация и то, что это не было известно другим классам, что позволяет изменить его позже.
Но так как это поле / метод является закрытым для пакета, теперь ничто не мешает вам сделать это так, как вы можете.
Мне это не нравится

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

Другие вопросы по тегам