Думайте о ваших общедоступных методах как о функциональности, которую вы хотите разрешить кому-либо использовать.
Некоторые из этих функций могут быть сложными, и вы правы, эта функциональность должна быть разделена на разные методы.Вопрос в том, «Какой у них доступ?»
Ну, если они общедоступны, теперь внешние классы могут получить доступ к вашей внутренней функциональности, которая вам действительно не нужна.Даже если это ничего не сломает, когда вы начнете работать над большими проектами (с большими группами людей), сделав их общедоступными, другие программисты могут использовать эту функцию, которая теперь не позволяет вам ее изменять.
Например, взять аналогию с автомобилем.Скажи, что твой метод accelerate()
.Это, вероятно, позвонит releaseGas()
.Однако вы не хотите, чтобы кто-то извне выпускал газ.Его следует вызывать только в контролируемой среде.
Тогда есть защищенный доступ.Защищенный доступ предназначен для методов, которые могут быть переопределены путем расширения классов.Это должны быть методы, выполняющие определенную часть работы, связанной с внутренней функциональностью.Снова беря пример с автомобиля, может быть RaceCar clas, который использует особый тип газа, и поэтому он хочет предложить свой собственный метод выпуска газа.Это может послужить причиной защиты releaseGas
.
Что касается тестов, то вы должны тестировать, прежде всего, свой публичный контракт. Это то, что используют другие классы, и в концевот что действительно имеет значение.Ваши внутренние методы являются внутренними для вашей функциональности и будут проверены путем тестирования вашего публичного контракта.Это также означает, что ваш класс должен быть спроектирован в первую очередь на основе его внешнего использования, а тесты построены на этом.(Даже при разработке через тестирование это становится легче по мере накопления опыта.)
Конечно, иногда эти внутренние методы достаточно сложны, чтобы гарантировать свои собственные модульные тесты.Однако вам не нужно делать их защищенными.В этом случае вы можете сделать их доступ по умолчанию.(Ни публично, ни защищено).Пока ваш юнит-тест находится в одном пакете, вы сможете вызывать его.
Еще лучше, если вы знаете, что не хотите, чтобы кто-то его продлевал, но вам нужно, чтобы он был протестирован, сделайте это protected final
или просто final
.Это по-прежнему позволяет вызывать его, но, по крайней мере, предотвращает его переопределение.
Редактировать:
Комментарий Райана ниже мертв.Если ваш класс становится достаточно сложным, что требует тестирования его внутренних методов, его, вероятно, следует выделить в свой собственный класс, который затем можно будет независимо тестировать модулем.
В целом, ваши тесты должны тестировать общедоступныеконтракт ваших отдельных подразделений.