Що таке магічне число, і чому воно погано? [зачинено]


514

Що таке магічне число?

Чому цього слід уникати?

Чи є випадки, коли це доречно?


2
Ви б уникали магічних чисел, тому що інші люди, які переглядають ваш код, можуть не зрозуміти, чому ви робите те, що ви робите ... наприклад, const myNum = 22; const number = myNum / 11;зараз моїми 11 можуть бути люди або пляшки пива чи щось таке, натомість я б змінив 11 на постійний наприклад, мешканці.
JuicY_Burrito

Використання магічних чисел в атрибутах неминуче, тому я думаю, що це доречно.
donatasj87

Відповіді:


574

Магічне число - це пряме використання числа в коді.

Наприклад, якщо у вас є (на Java):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }
}

Це має бути відновлено до:

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }
}

Це покращує читабельність коду і його легше підтримувати. Уявіть випадок, коли я встановив розмір поля пароля в графічному інтерфейсі. Якщо я використовую магічне число, кожного разу, коли змінюється максимальний розмір, я повинен змінюватись у двох місцях коду. Якщо я забуду одну, це призведе до невідповідностей.

JDK рясніє прикладами як у Integer, так Characterі Mathкласах.

PS: Інструменти статичного аналізу, такі як FindBugs та PMD, виявляють використання магічних чисел у вашому коді та пропонують рефакторинг.


174
0 і 1 - винятки з цього правила.
Джонатан Паркер

24
@Kirill: Якщо ви очікуєте, що визначення "Сто відсотків" зміниться, то так. Кращим підходом було б мати змінну від того, що вона є, до того, що вона представляє, тобто загальнодоступний статичний фінал MAX_DOWNLOAD_PERCENTAGE = 100. Хоча навіть це не мало б сенсу, оскільки "100 відсотків" дуже добре визначено. З іншого боку, той факт, що паролі можуть бути максимум 7 символами, не визначається глобально і насправді відрізняється, тож це кандидат у змінну.
Michael Stum

40
@Jonathan Parker, за винятком випадків, коли їх немає ( TRUE/ FALSE)
Брендан Лонг

82
Тільки тому, що магічне число ніколи не зміниться, не означає, що його не слід замінювати постійним. Мій код сповнений таких глобальних констант, як HzPerMHz та msecPerSecond. Вони ніколи не зміняться, але роблять сенс зрозумілішим і забезпечують певний захист від помилок.
Жанна Піндар

43
@MarcusJ Ви могли не помилитися більше. Це не питання думки, а важко зароблений досвід багатьох програмістів. Я не можу сказати вам, скільки разів за останні 40 років програмування я прокляв попереднього програміста, який не визначав константу, тому я виявив лише пряме використання числа, яке потрібно було зрозуміти під час обслуговування коду , похований десь у великій кількості коду, значення якого було б зрозуміло, визначивши таку константу. Будь-який інший старший програміст також матиме кілька історій жахів у цьому напрямку.
ToolmakerSteve

145

Магічне число - це жорстко закодоване значення, яке може змінитися на більш пізньому етапі, але це може бути важко оновити.

Наприклад, скажімо, що у вас є Сторінка, яка відображає останні 50 замовлень на сторінці огляду "Ваші замовлення". 50 - Магічне число тут, оскільки воно не встановлюється за допомогою стандарту чи конвенції, це число, яке ви склали з причин, викладених у специфікації.

Тепер у вас є 50 у різних місцях - ваш SQL-скрипт ( SELECT TOP 50 * FROM orders), ваш веб-сайт (ваші останні 50 замовлень), ваше вхід для замовлення (for (i = 0; i < 50; i++) ) та, можливо, багато інших місць.

Тепер, що відбувається, коли хтось вирішить змінити 50 на 25? або 75? або 153? Тепер вам доведеться замінити 50 у всіх місцях, і ви, швидше за все, його пропустите. Пошук / Заміна може не спрацювати, тому що 50 може використовуватися для інших речей, а сліпа заміна 50 на 25 може мати деякі інші погані побічні ефекти (тобто вашSession.Timeout = 50 дзвінок, який також встановлений на 25, і користувачі починають повідомляти про занадто часті очікування).

Також код може бути важко зрозумілим, тобто " if a < 50 then bla" - якщо ви виявите, що посеред складної функції, інші розробники, які не знайомі з кодом, можуть запитати себе "WTF - це 50 ???"

Ось чому найкраще мати такі неоднозначні та довільні числа точно в 1 місці - " const int NumOrdersToDisplay = 50", оскільки це робить код більш читабельним (" if a < NumOrdersToDisplay", це також означає, що вам потрібно змінити його лише в 1 чітко визначеному місці.

Місця, в яких магічні числа підходять, - це все, що визначено за допомогою стандарту, тобто SmtpClient.DefaultPort = 25або TCPPacketSize = whatever(не впевнений, чи це стандартизовано). Крім того, все, що визначено лише в межах 1 функції, може бути прийнятним, але це залежить від контексту.


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

11
Це не завжди незрозуміло. SmtpClient.DefaultPort = 25можливо ясно ер ніж SmtpClient.DefaultPort = DEFAULT_SMTP_PORT.
користувач253751

4
@immibis Я вважаю, що це припущення, що немає абсолютно іншого коду, який використовує концепцію DEFAULT_SMTP_PORT. Якщо порт SMTP за замовчуванням для цієї програми змінено, його потрібно буде оновити в декількох місцях, що спричинить можливість невідповідності.
Russ Bradberry

3
Також важче знайти всі звичаї - вам доведеться шукати в 25усьому додатку і переконайтеся, що ви змінюєте лише випадки, 25що стосуються порту SMTP, а не 25-х, наприклад ширину стовпця таблиці або числа записів для показу на сторінці.
Michael Stum

2
У цьому прикладі я б очікував, що код використовуватиме SmtpClient.DefaultPort, а не 25. Тому вам доведеться просто змінити його в одному місці. І номер порту, ймовірно, залишиться колишнім, це не випадкове магічне число, а число, присвоєне значком IANA.
njsg

34

Ви подивилися на запис у Вікіпедії магічне число?

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

Термін магічне число також відноситься до поганої практики програмування використання чисел безпосередньо у вихідному коді без пояснень. У більшості випадків це ускладнює програми для читання, розуміння та обслуговування. Хоча більшість довідників роблять виняток для чисел нульових і одиничних, хороша ідея визначити всі інші числа в коді як названі константи.


8
Хороший приклад RTFW :)
Єва

Я б сказав, що відповідь далеко не повна.
Skeeve

25

Чарівне число проти Символічний постійний: коли замінити?

Магія: Невідомий семантичний

Symbolic Constant -> Забезпечує правильний смисловий і правильний контекст для використання

Семантичний: сенс чи мета речі.

"Створіть константу, назвіть її за значенням і замініть її числом." - Мартін Фаулер

По-перше, магічні числа - це не просто числа. Будь-яке основне значення може бути "магічним". Основні значення - це маніфестовані об'єкти, такі як цілі числа, числові знаки, парні, плавці, дати, рядки, булеві символи, символи тощо. Проблема полягає не в типі даних, а в "магічному" аспекті значення, яке відображається в нашому тексті коду.

Що ми маємо на увазі під магією? Якщо бути точним: "Магією" ми маємо намір вказати на семантику (значення чи призначення) значення в контексті нашого коду; що це невідомо, незрозуміло, незрозуміло чи заплутано. Це поняття «магія». Основна цінність не є магією, коли її смислове значення або мета буття є швидко і легко пізнаною, зрозумілою та зрозумілою (не збиває з пантелику) з оточуючого контексту без спеціальних допоміжних слів (наприклад, символічна константа).

Тому ми визначаємо магічні числа, вимірюючи здатність читача коду знати, бути зрозумілим та розуміти значення та призначення базового значення з його оточуючого контексту. Чим менш відомий, менш зрозумілий і більш заплутаний читач, тим більш "магічним" є основне значення.

Корисні визначення

  • плутати: викликати (когось) збентеження чи здивування.
  • збентежений: змусити (когось) збентежити і заплутати.
  • здивований: повністю ошелешений; дуже спантеличено.
  • спантеличений: зовсім здивований або здивований.
  • спантеличений: нездатний зрозуміти; здивований.
  • зрозуміти: сприймати призначене значення (слова, мова чи мовця).
  • значення: що означає слово, текст, концепція чи дія.
  • означало: мати намір передати, вказати чи посилатися на (конкретну річ чи поняття); означають.
  • означати: бути вказівкою на.
  • вказівка: знак чи інформацію, яка щось вказує.
  • вказувати: вказувати; шоу.
  • знак: предмет, якість або подія, наявність чи виникнення якого свідчить про ймовірну присутність чи виникнення чогось іншого.

Основи

У нас є два сценарії наших основних магічних цінностей. Тільки другий має головне значення для програмістів і код:

  1. Одиноке базове значення (наприклад, число), з якого його значення невідоме, незрозуміле, незрозуміле або заплутане.
  2. Основне значення (наприклад, число) в контексті, але його значення залишається невідомим, незрозумілим, незрозумілим або заплутаним.

Загальна залежність "магії" полягає в тому, як одиночне основне значення (наприклад, число) не має загальновідомих семантичних (наприклад, Pi), але має локально відомий семантичний (наприклад, ваша програма), який не зовсім зрозумілий з контексту або його можна зловживати. у хорошому чи поганому контексті.

Семантика більшості мов програмування не дозволить нам використовувати одиночні основні значення, за винятком (можливо) в якості даних (тобто таблиць даних). Коли ми стикаємося з "магічними числами", ми зазвичай робимо це в контексті. Тому відповідь на

"Чи замінюю це магічне число символічною константою?"

є:

"Як швидко ви можете оцінити і зрозуміти смислове значення числа (його призначення для перебування там) у його контексті?"

Вид магії, але не зовсім

Маючи на увазі цю думку, ми можемо швидко побачити, як число, подібне Pi (3.14159), не є "магічним числом", якщо розмістити його у відповідному контексті (наприклад, 2 x 3.14159 x радіус або 2 * Pi * r). Тут число 3.14159 розумово розпізнається Pi без символічного постійного ідентифікатора.

І все-таки ми зазвичай замінюємо 3.14159 таким символьним постійним ідентифікатором, як Pi через довжину та складність числа. Аспекти довжини та складності Pi (у поєднанні з потребою в точності) зазвичай означають, що символьний ідентифікатор або константа є менш схильними до помилок. Визнання "Пі" як імені є просто зручним бонусом, але не є основною причиною постійності.

Тим часом: Назад на ранчо

Не відкладаючи звичайних констант, таких як Pi, давайте зосередимося головним чином на числах із спеціальними значеннями, але які ці значення обмежені всесвітом нашої програмної системи. Таке число може бути "2" (як основне ціле значення).

Якщо я використовую число 2 самостійно, моє перше запитання може бути: Що означає "2"? Значення "2" саме по собі є невідомим і не пізнаваним без контексту, залишаючи його використання незрозумілим і заплутаним. Незважаючи на те, що просто "2" в нашому програмному забезпеченні не відбудеться через мовну семантику, ми хочемо побачити, що "2" сам по собі не має жодної особливої ​​семантики чи очевидних цілей бути самотнім.

Поставимо наш одинокий "2" в контекст: padding := 2 де контекст є "Контейнером графічного інтерфейсу". У цьому контексті значення 2 (як пікселів чи іншої графічної одиниці) пропонує нам швидко здогадатися про його семантику (значення та призначення). Ми можемо зупинитися тут і сказати, що в цьому контексті 2 добре, і нічого іншого нам не потрібно знати. Однак, можливо, у нашому програмному Всесвіті це не вся історія. Існує більше, але "padding = 2" як контекст не може його розкрити.

Давайте зробимо вигляд, що 2 як піксельні прокладки в нашій програмі мають різноманітність "default_padding" у всій нашій системі. Тому писати інструкцію padding = 2недостатньо добре. Поняття «дефолт» не виявлено. Тільки коли я пишу: padding = default_paddingяк контекст, а потім і в іншому місці: default_padding = 2чи я цілком усвідомлюю краще та більш повне значення (семантичне та цільове) значення 2 у нашій системі.

Наведений вище приклад досить хороший, оскільки "2" сам по собі може бути будь-яким. Тільки коли ми обмежимо діапазон та область розуміння "моєю програмою", де 2 є default_paddingчастинами GUI UX "моєї програми", ми нарешті маємо сенс "2" у відповідному контексті. Тут "2" - це "магічне" число, яке визначається символічною константою default_paddingв контексті графічного інтерфейсу GUI "моєї програми" для того, щоб використовувати його як можна default_paddingшвидше зрозуміле в широкому контексті додаючого коду.

Таким чином, будь-яке основне значення, значення якого (семантичне та цільове) не може бути достатньо і швидко зрозуміле, є хорошим кандидатом на символічну константу замість базового значення (наприклад, магічне число).

Йдемо далі

Числа в масштабі також можуть мати семантику. Наприклад, зробіть вигляд, що ми робимо гру D&D, де у нас є поняття монстра. Наш об’єкт-монстр має функцію під назвою life_force, яка є цілим числом. Цифри мають значення, які невідомі чи зрозумілі без слів, щоб надати значення. Таким чином, ми почнемо з довільного твердження:

  • full_life_force: INTEGER = 10 - Дуже живий (і без шкоди)
  • minimal_life_force: INTEGER = 1 - Ледь живий (дуже боляче)
  • мертвий: INTEGER = 0 - мертвий
  • нежить: INTEGER = -1 - Мінімум нежить (майже мертвий)
  • зомбі: INTEGER = -10 - Максимум нежить (дуже нежить)

З вищевказаних символічних констант ми починаємо отримувати душевну картину живості, смертності та "нежить" (і можливих наслідків або наслідків) для наших монстрів у нашій грі на тему та розробці. Без цих слів (символічні константи) нам залишаються лише числа, починаючи від -10 .. 10. Просто діапазон без слів залишає нас у місці, можливо, великої плутанини та, можливо, з помилками в нашій грі, якщо різні частини гри залежать від того, що означає цей діапазон чисел для різних операцій, як attack_elvesабо seek_magic_healing_potion.

Тому, шукаючи та розглядаючи заміну «магічних чисел», ми хочемо задавати цілком цілеспрямовані питання щодо чисел у контексті нашого програмного забезпечення та навіть про те, як числа семантично взаємодіють між собою.

Висновок

Давайте розглянемо, які питання нам слід задати:

У вас може виникнути чарівне число, якщо ...

  1. Чи може базове значення мати особливе значення або призначення у вашому всесвіті програмного забезпечення?
  2. Чи може спеціальне значення чи мета, ймовірно, бути невідомими, незрозумілими, незрозумілими або заплутаними навіть у відповідному контексті?
  3. Чи можна належним базовим значенням неправильно користуватися з поганими наслідками в неправильному контексті?
  4. Чи може неправильне базове значення правильно використати з поганими наслідками в потрібному контексті?
  5. Чи має базове значення семантичні чи цільові зв’язки з іншими базовими значеннями у конкретних контекстах?
  6. Чи може базове значення існувати в нашому коді більш ніж в одному місці з різною семантикою в кожному, тим самим викликаючи у нашого читача плутанину?

Вивчіть окремі постійні базові значення в тексті коду. Задайте кожне запитання повільно і продумано про кожен екземпляр такої цінності. Розгляньте силу своєї відповіді. Багато разів відповідь не чорно-біла, але має відтінки неправильно зрозумілого значення та призначення, швидкість навчання та швидкість розуміння. Також потрібно побачити, як він підключається до програмної машини навколо нього.

Врешті-решт, відповідь на заміну - це відповідь мірою (на вашу думку) сили чи слабкості читача здійснити зв’язок (наприклад, "отримати це"). Чим швидше вони розуміють сенс і мету, тим менше "магії" у вас.

ВИСНОВОК: Замініть основні значення символічними константами лише тоді, коли магія є достатньо великою, щоб викликати важкі виявлення помилок, що виникають в результаті плутанини.


1
Дякую. Fwiw інструменти статичного аналізу, які мої колеги продовжують встановлювати, продовжують скаржитися на магічні числа - але як інструмент повинен розуміти семантику? В результаті ВСІ базові значення замінюються символічними константами. Як я згоден з вашим висновком, я вважаю це менш ідеальним.
Чомех

17

Магічне число - це послідовність символів на початку формату файлу або обміну протоколами. Цей номер служить перевіркою здоровості.

Приклад: відкрийте будь-який файл GIF, ви побачите на самому початку: GIF89. "GIF89" - це магічне число.

Інші програми можуть прочитати перші кілька символів файлу та правильно визначити GIF.

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

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

Магічні числа все ще корисні.


13
Я не думаю, що це магічне число, на яке він посилався
Marcio Aguiar

4
Можливо, вам слід видалити додані вами теги "формат файлу" та "мережа", оскільки він чітко не говорить про такі магічні числа.
Ландон

9
Ще дуже корисно знати, що магічні числа можуть стосуватися не просто проблеми з кодом. -Адам
Адам Девіс

3
Якщо суб'єкт читає: "Що таке магічне число з точки зору вихідного коду", теги там не повинні бути. Але він цього не уточнив. Тож мати додаткову інформацію - це добре. Я думаю, що Кайл, Ландон і Марсіо помиляються.
Брайан Р. Бонді

4
Також не було можливості визначити, кого саме шукати. Оскільки я був першим дописом, я не міг здогадатися, який саме він шукав.
Брайан Р. Бонді

12

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

Це погано з тієї ж причини. SPOT (Єдина точка істини) хороша. Якщо ви хочете змінити цю константу пізніше, вам доведеться шукати свій код, щоб знайти кожен екземпляр. Це також погано, тому що іншим програмістам може бути незрозуміло, що це число представляє, звідси і "магія".

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


Чи можете ви бути більш конкретними щодо того, чому усунення чисел maginc НЕ завжди добре?
Marcio Aguiar

У математичних формулах, таких як e ^ pi + 1 = 0
Jared Updike

5
Марсіо: Коли ви робите такі речі, як "const int EIGHT = 8;" а потім вимоги змінюються, і ви закінчуєте "const int EIGHT = 9;"
jmucchiello

6
Вибачте, але це просто приклад поганого іменування або базового використання константи.
Kzqai

1
@MarcioAguiar: На деяких платформах такий вираз (foo[i]+foo[i+1]+foo[i+2]+1)/3може оцінюватися набагато швидше, ніж цикл. Якби замінити 3код без переписування коду як циклу, той, хто побачив, що ITEMS_TO_AVERAGEвизначений як такий, 3міг би зрозуміти, він міг би змінити його 5і мати в коді в середньому більше елементів. Навпаки, хтось, хто подивився на вираз з буквальним 3, зрозумів, що 3являє собою кількість елементів, що підсумовуються разом.
суперкарт

10

Магічне число також може бути числом зі спеціальною, твердо кодованою семантикою. Наприклад, я колись бачив систему, де ідентифікатори записів> 0 оброблялися нормально, 0 сам був "новим записом", -1 - "це корінь" і -99 - "це було створено в корені". 0 і -99 призведе до того, що WebService надасть новий ідентифікатор.

Що поганого в тому, що ви повторно використовуєте пробіл (прописаний цілі числа для ідентифікаторів запису) для спеціальних здібностей. Можливо, вам ніколи не захочеться створювати запис із ідентифікатором 0 або з негативним ідентифікатором, але навіть якщо ні, кожна людина, яка дивиться або на код, або в базу даних, може спотикатися на цьому і спочатку плутати. Само собою зрозуміло, що ці особливі цінності не були добре задокументовані.

Можливо, 22, 7, -12 та 620 теж враховуються як магічні числа. ;-)


10

Проблема, про яку не згадували використання магічних чисел ...

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

І тоді, досить впевнено, потрібно змінити значення ... лише для однієї мети.


Це не виглядає настільки ймовірним, коли говорити про числа (принаймні, не для мене), але я наткнувся на нього за допомогою рядків, і це хіт: спочатку ви повинні прочитати багато коду, щоб побачити, де він використовується, ніж ви повинні помітити, що його використовують для різних речей ... не мого улюбленого проведення часу.
Томіслав Накіч-Альфіревич

4

Я припускаю, що це відповідь на мою відповідь на ваше попереднє запитання. У програмуванні магічне число - це вбудована числова константа, яка з’являється без пояснень. Якщо вона з’являється у двох різних місцях, це може призвести до обставин, коли змінюється один екземпляр, а не інший. З обох цих причин важливо виділити і визначити числові константи поза місцями їх використання.


3

Я завжди використовував термін "магічне число" по-різному, як неясне значення, що зберігається в структурі даних, яке можна перевірити як швидку перевірку дійсності. Наприклад, файли gzip містять 0x1f8b08 як перші три байти, файли класу Java починаються з 0xcafebabe тощо.

Ви часто бачите магічні числа, вбудовані у формати файлів, тому що файли можуть надсилатись досить розбірливо і втрачати будь-які метадані про те, як вони були створені. Однак магічні числа також іноді використовуються для структури даних в пам'яті, наприклад, виклики ioctl ().

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


2

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

У тих рідкісних випадках, коли в мене виникає потреба використовувати такі Магічні Номери, я встановлюю їх у якості коду і документую, чому вони використовуються, як вони працюють і звідки вони з'явилися.


1
На мою думку, магічний запах кодового числа відноситься саме до незрозумілих констант. Поки ви ставите їх у названу константу, це не повинно бути проблемою.
Дон Кіркбі

2

Що щодо ініціалізації змінної у верхній частині класу зі значенням за замовчуванням? Наприклад:

public class SomeClass {
    private int maxRows = 15000;
    ...
    // Inside another method
    for (int i = 0; i < maxRows; i++) {
        // Do something
    }

    public void setMaxRows(int maxRows) {
        this.maxRows = maxRows;
    }

    public int getMaxRows() {
        return this.maxRows;
    }

У цьому випадку 15000 - це магічне число (згідно CheckStyles). Для мене встановлення значення за замовчуванням нормально. Я не хочу робити цього:

private static final int DEFAULT_MAX_ROWS = 15000;
private int maxRows = DEFAULT_MAX_ROWS;

Це ускладнює читання? Я ніколи про це не розглядав, поки не встановив CheckStyles.


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

Я думаю, що static finalконстанти є надмірними, коли ви використовуєте їх одним методом. finalМінлива , оголошена у верхній частині методу є більш зручним для читання ІМХО.
Єва

0

@ eed3si9n: Я навіть припускаю, що "1" - це магічне число. :-)

Принцип, пов'язаний з магічними числами, полягає в тому, що кожен факт, з яким має справу ваш код, повинен бути оголошений рівно один раз. Якщо ви використовуєте магічні цифри у своєму коді (наприклад, приклад довжини пароля, який подав @marcio, ви можете легко дублювати цей факт, і коли ваше розуміння цього факту зміниться, у вас є проблема обслуговування.


5
Код IOW повинен бути написаний так:factorial n = if n == BASE_CASE then BASE_VALUE else n * factorial (n - RECURSION_INPUT_CHANGE); RECURSION_INPUT_CHANGE = 1; BASE_CASE = 0; BASE_VALUE = 1
Томас Едінг

0

Що щодо змінних, що повертаються?

Особливо мені це складно під час впровадження збережених процедур .

Уявіть наступну збережену процедуру (я знаю, неправильний синтаксис, лише щоб показати приклад):

int procGetIdCompanyByName(string companyName);

Він повертає ідентифікатор компанії, якщо він існує в певній таблиці. Інакше повертається -1. Якось це чарівне число. Деякі з рекомендацій, які я читав до цього часу, говорить про те, що мені дійсно доведеться робити щось подібне:

int procGetIdCompanyByName(string companyName, bool existsCompany);

До речі, що він повинен повернути, якщо компанії не існує? Гаразд: він встановить existesCompany як хибний , але також поверне -1.

Варіант Antoher - це зробити дві окремі функції:

bool procCompanyExists(string companyName);
int procGetIdCompanyByName(string companyName);

Отже, умовою другої збереженої процедури є те, що компанія існує.

Але я боюся одночасності, тому що в цій системі компанію може створити інший користувач.

Підсумок до речі: що ви думаєте про використання таких «магічних чисел», які є відносно відомими та безпечними, щоб сказати, що щось не вдається або що щось не існує?


У цьому конкретному випадку, якщо в документації функції зазначено, що від'ємне значення повернення означає, що компанія не знайдена, то немає ніяких причин для використання константи.
Вінсент Фурмонд

-1

Ще одна перевага вилучення магічного числа як константи дає можливість чітко документувати бізнес-інформацію.

public class Foo {
    /** 
     * Max age in year to get child rate for airline tickets
     * 
     * The value of the constant is {@value}
     */
    public static final int MAX_AGE_FOR_CHILD_RATE = 2;

    public void computeRate() {
         if (person.getAge() < MAX_AGE_FOR_CHILD_RATE) {
               applyChildRate();
         }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.