Покладаючись на ініціалізацію поля за замовчуванням - це поганий стиль програмування? [зачинено]


20

Мені було надано посилання на офіційну документацію на oracle: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

де сказано:

Значення за замовчуванням

Не завжди потрібно присвоювати значення, коли поле оголошується. Поля, які оголошені, але не ініціалізовані, компілятором встановлять прийнятний за замовчуванням. Взагалі кажучи, це значення за замовчуванням буде нульовим або нульовим, залежно від типу даних. Однак, покладаючись на такі значення за замовчуванням, як правило, вважається поганим стилем програмування.

Я хочу наголосити на цій частині:

Однак, покладаючись на такі значення за замовчуванням, як правило, вважається поганим стилем програмування.

Але, о, хлопче, це, я б сказав, фундаментальна частина мовної специфікації, знаючи, що змінні екземплярів мають значення за замовчуванням. Чому на землі це погана практика програмування, якщо вона широко використовується навіть у вихідному коді бібліотек Java SE?


5
Ага. Я ніколи не знав, що це твердження там. Я насправді вважаю хорошою практикою покладатися на них. private int count = 0;це код, який нічого не робить, а код, який нічого не робить, - це захаращення. Це як імпортувати класи з java.lang, або оголошувати клас за допомогою extends Object.
VGR

2
... або має public abstractметод в інтерфейсі.
mumpitz

1
що не так з публічним рефератом?
Джон Кітс

1
Шматочок головоломки може надходити від C ++. Це популярна мова, і обробка ініціалізації за замовчуванням проти нульової ініціалізації є безперервним джерелом помилок. У C ++ - це погана ідея покладатися на параметри за замовчуванням у всіх, крім найбільш виняткових випадках. Це, можливо, просочилося в Яву культурно.
Корт Аммон

@JohnKeates - Моя Java трохи іржава, але privateметоди в інтерфейсі не мали б сенсу, і abstractмаються на увазі.
Скотт Сміт

Відповіді:


6

Цитований текст:

"Однак, покладаючись на такі значення за замовчуванням, як правило, вважається поганим стилем програмування."

Цинічно: "загалом вважається, що" часто є способом сказати, що автор не намагався знайти авторитетне джерело для викладеного твердження.

У цьому випадку твердження явно сумнівне. Докази: 5 із 5 посібників для стилів Java, відібраних у Зразок, НЕ говорять про те, слід чи слід покладатися на значення за умовчанням:

(Зауважте, моя методологія вибірки полягала в тому, щоб переглянути перші 5 чітких пошукових запитів Google для "керівництва стилем Java". Потім я шукав кожен документ як "за замовчуванням". Це не є ретельним аналізом, але він служить для того, щоб зробити мою думку. )


ДОБРЕ. Так чи справді це допомагає читати код Java?

Це дискусійно.

З одного боку, початківець Java-програміст, який не дізнався про ініціалізацію за замовчуванням, може бути заплутаним щодо того, звідки беруться нулі або нулі. Але якщо вони намагаються шукати явну ініціалізацію і виявляють, що її немає, цього має бути достатньо, щоб вони змусили прочитати підручник або книгу, щоб дізнатися про ініціалізацію за замовчуванням. (Ви сподіваєтесь!)

З іншого боку, ми зазвичай не очікуємо, що початківці програмісти Java підтримуватимуть виробничі кодові бази. Для досвідченого програміста Java надмірна ініціалізація не покращує читабельність. Це (в кращому випадку) шум.

На мій погляд, єдине, що досягається надмірною ініціалізацією поля, - це повідомити майбутньому читачеві вашого коду, що ви подумали про початкове значення. (Як висловив @GhostCat, ініціалізація за замовчуванням не повідомляє про наміри.)

Але навпаки, якби я був цим читачем, я б не обов'язково довіряв думці автора коду. Тож значення цього "сигналу" також сумнівне.


А як щодо надійності?

У Java це не має різниці. JLS вказує , що ініціалізація по замовчуванням це відбувається для полів. І навпаки, для локальних змінних помилка компіляції намагається використовувати змінну, яка не була визначена ініціалізована.

Якщо коротко, поведінка змінної, яка не ініціалізується явно, цілком передбачувана.

На відміну від таких мов, як C або C ++, де змінні не можуть бути ініціалізовані, поведінка не визначено і може призвести до збоїв і відмінностей у поведінці на різних платформах. Справа для завжди явно ініціалізації змінних тут набагато сильніша.


А як щодо продуктивності?

Це не має значення. Компілятор JIT повинен мати можливість розглядати надлишкову ініціалізацію та ініціалізацію за замовчуванням як однакову.


19

Просто: покладання на значення за замовчуванням не повідомляє про наміри.

Ви дійсно хотіли, щоб це поле починалося з 0, або ви забули призначити значення ?!

І звичайно, нульова посилання - це половина двох речей, які вам знадобляться для виключення з nullpointer.

Нарешті, використання значень за замовчуванням означає, що у вас є неповні поля. Якого ви уникаєте, де це можливо.

Єдиний протилежний аргумент: чому записувати речі, які вам не потрібно? Але я думаю, що перераховані недоліки труби, що, таким чином, призначати 0 явному полі краще, ніж залишати його компілятору.


3
тобто re: не повідомляє про наміри - що робити, якщо "Manny the supporter" дивиться на ваш код і не знає, що таке типовий тип даних за замовчуванням. Він припускає, що це 0, коли це дійсно НУЛЬ, і це вся помилка під час перевірки === (або як би не було еквівалентної перевірки рівності значення та типу у java, дорівнює ()?). Години пошуку (для недосвідченого програміста) можуть бути результатом чогось такого простого. PS намагається зіграти захисника диявола. Я кажу, що за умовчанням використовуйте цілий день (хоча я ніколи цього не роблю), і будьте розумніші (або принаймні більшу увагу до деталей), щоб підтримувати свій код.
TCooper

@TCooper, коли керівник компанії Мані настільки мало знає про Java, тоді він не має стосунків до реального світу коду Java. Але я погоджуюся з основним поняттям. Це полегшує справи для новачків.
GhostCat вітає Моніку К.

12

Чому на землі це погана практика програмування

Ідея полягає у тому, що якщо ви покладаєтесь на значення за замовчуванням, то комусь, хто читає код, не відразу зрозуміло, чи навмисно ви залишили його як значення за замовчуванням або просто забули його призначити.

... якщо він широко використовується навіть у вихідних кодах бібліотек Java SE ??

Вихідний код Java насправді не є тим, на що слід покластися як приклад зразкової практики кодування. Існує багато випадків, коли такі правила порушуються (іноді навмисно для незначних покращень продуктивності, а іноді випадково або через те, що прийнятий стиль змінювався протягом багатьох років).


2
Це, мабуть, правильно, хоча я з цим не згоден.
VGR

3
@VGR Наскільки я схильний погоджуватися з твердженням про те, що покладання на значення за замовчуванням є неоптимальним, я з цього приводу обережно ставив її до нейтрального шляху. Якість коду є суб'єктивною, і я добре знаю, що це аж ніяк не загальновизнаний погляд.
Майкл Беррі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.