1

Я задаю этот вопрос, потому что я считаю, что они сделали это по очень веской причине, и что большинство людей не используют его должным образом, а также из моего опыта в отрасли до сих пор. Но если моя теория верна, то я не уверен, почему они включили модификатор частного доступа ...?Почему Java сделал доступ к пакету по умолчанию?

Я считаю, что если доступ по умолчанию используется правильно, он обеспечивает расширенную проверку при сохранении инкапсуляции. И это также делает излишним модификатор частного доступа.

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

Я считаю, поэтому Java использует пакетный доступ как «по умолчанию». Но я не уверен, почему они также включали в себя частный доступ, я уверен, что есть допустимый прецедент ...

+3

private является ключевым, когда классы имеют внутренние методы, которые не должны касаться ни один другой класс. Я не уверен, Что так спорно об этом. Вы полагаете, что у частного нет цели ?! В этом случае я категорически не согласен –

+0

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

+1

да, но как насчет методов, которые должны быть доступны для некоторых тесно связанных классов, но не для всего мира? Кроме того, похоже, вы пытаетесь имитировать конфиденциальность, отбрасывая доступ к пакету. –

ответ

2

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

Для хорошего теста детали реализации не нужны и не должны быть видны вне класса. Чем более «белый ящик» является тестом, тем он более хрупким. Обычно я ограничиваю модификатор по умолчанию полями, которые, как я полагаю, будет установлен с помощью инъекции зависимостей и вручную задан в тесте. (Я мог бы также использовать инъекцию конструктора и избавиться от этого, но это более удобно.)

0

Я предлагаю небольшой мысленный эксперимент. Рассмотрим этот код:

public void promoteUser(User user) 
{ 
    int newRank = computeNew(user); 
    user.setRank(newRank); 
} 

private int computeNewRank(User user) 
{ 
    return user.getRank() + 1; 
} 

Можно чувствовать computeNewRank должны быть проверены (реальная реализация может сделать гораздо больше вещей). Но давайте забудем, что на мгновение и с помощью магии встраивания сделать это:

public void promoteUser(User user) 
{ 
    int newRank = user.getRank() + 1; 
    user.setRank(newRank); 
} 

Красота этого эксперимента является то, что это относится и к частным методам любого размера. Вы всегда можете себе представить себя, вставляя частного участника и спрашивая себя. «Что я действительно хочу проверить здесь?». Является ли это частным методом или, возможно, новым классом/компонентом, обладающим совершенно новыми функциональными возможностями, которые замаскированы под частный метод? Дело в том, что вы должны редко (если когда-либо!) Необходимо проверить личные (или даже пакетные/внутренние) элементы. Для внешнего мира, для ваших контрактных потребителей, это все нерелевантные детали.

Теперь, конечно, мы могли бы заменить все на системные тесты. Но как будет выглядеть ваш обычный рабочий процесс? Что делать, если для проверки кода продвижения ранга вам нужно будет регистрировать пользователя, зарегистрироваться для сеанса, подождать 3 минуты, ввести промокод, получить смс, подтвердить ... Вы видите мою точку зрения.

Хорошо помнить, что юнит-тесты для вас, а не наоборот. Вы можете согнуть их, настроить их, сделать их подходящими, чтобы вы могли поставлять программное обеспечение лучшего качества. Цель Thier не, чтобы помочь вам достичь какой-то магической цели 100% -ый охват, а скорее даст вам немедленную обратную связь о том, что вы делаете, чтобы быстрее реагировать на ошибки и сбои. вы найдете встречу. Или, другими словами, до повысить производительность.

+0

Я понимаю концепцию поддержания контракта, однако, если этот контракт нарушен, лучше не изолировать причину эффективно, и более низкие тесты уровня помогут этому. Реализации могут быть большими и сложными, в идеале они не должны быть, но часто они есть, по крайней мере, доступ по умолчанию позволит разработчикам писать тесты в первую очередь, которые будут выделять ошибки с большей точностью, если реализация должна измениться, а затем изменить ее и писать новые тесты ... – newlogic

+0

Также это означает, что эти реализации могут быть расчленены, поэтому реализация может быть изменена на любом уровне. – newlogic

+0

Я думаю, что частный полезен для полей, но не для методов. – newlogic

Смежные вопросы