Чи є переваги жорсткого кодування значень даних у програмі?


13

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

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

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

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

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

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



Чи мають перехресні вкладки звіту, значення значень у рядках відображаються як стовпці?
Тулайн Кордова

1
@Brendan - Якщо у звіті встановлено жорсткі значення коду, вам потрібно буде змінити список у ДВОХ місцях (джерело даних та звіт), тоді як якщо звіт динамічний, вам потрібно змінити його лише в одному місці (звіт) .
kwah

1
@Brendan, чому б ти закінчив три місця? Можливо, моє розуміння невірно, але я передбачаю запит sql для отримання даних з бази даних, додаток агрегує / групує повернені значення за допомогою, наприклад, відділу. Якщо ви бажаєте мати накладні витрати на декілька db-запитів, ви можете вибрати окремі підрозділи / заголовки ролей, якщо цього дійсно хочете. Дані не мають даних, які існують у більш ніж одному місці - звіт ведеться за даними.
kwah

1
@Brendan Я також не погоджуюся з вашим визначенням того, що він знаходиться в одному місці - так, як ви описуєте його в декількох місцях, розкиданих по вихідному коду.
kwah

Відповіді:


9

Вікіпедія:

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

Жорстке кодування вважається антипатерном.

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

Іноді цього не вдається уникнути, але це має бути тимчасово.

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

  • Жорстке кодування повідомлень ускладнює інтернаціоналізацію програми.
  • Шляхи жорсткого кодування ускладнюють адаптацію до іншого місця.

Єдиною перевагою жорсткого кодування, здається, є швидка доставка коду.


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

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

Жорстке кодування повинно бути життєво важливою частиною вашого процесу, і, вважаючи, що анти-модель застаріла в епоху мікро-сервісів, підручник Angular Tour of Heroes є чудовим прикладом величезного програмного дому, що безпосередньо втягує або навіть вимагає як проміжний крок. Більше того, коли ви переходите до динамічних даних, ви все одно повинні зберігати жорсткі кодовані дані як резервні дані, можливо, керовані змінною оточення або навіть булевим перемиканням самого коду, щоб помилки та проблеми безпеки могли бути належним чином виділені вниз рядок.
Що знаходиться в пошуку Google

24

Дійсно? Немає можливих дійсних випадків використання?

Хоча я погоджуюся, що жорстке кодування - це, як правило, антидіапазон або, принаймні, дуже поганий запах коду , є багато випадків, коли це має сенс:

  • простота ( YAGNI ),
  • вхід фактично постійний і ніколи не змінюватиметься (тобто являє собою природну чи ділову константу або наближення до одного. Наприклад, 0, PI, ...),
  • вбудоване програмне забезпечення (пам'ятають про обмеження пам'яті та розподілу),
  • захищене програмне забезпечення (ці значення не є доступними та / або простими для декодування чи реверсивної інженерії, наприклад, криптографічні маркери та солі),
  • згенерований код (ваш препроцесор або генератор налаштовується, але випливає з жорстко кодованими значеннями),
  • і, мабуть, ще кілька.

Все-таки анти-візерунок ? Так само і Over-Engineering ! Йдеться про тривалість життя вашого ПЗ !!

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

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

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

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


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

@Tom: Ви кажете, що простіше і швидше реалізувати (або навіть повторно використовувати) бібліотеку пошуку конфігурації, ніж використовувати жорстко закодоване значення? Чудово для вас. Крім того, я не бачу, як ваше останнє речення відповідає визначенню надмірної інженерії. Це було б очевидно безладним, і, очевидно, якщо це жорстко закодовано і дублюється, це ще гірше (що не було сенсом вашого запитання, я, мабуть, неправильно зрозумів, але мені здалося, що ви мали на увазі, що значення не було жорстко закодовано на місці щоразу, але в єдиному пункті програми).
haylem

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

1
@Том, не продавай себе занадто коротко. Ви напевно на чомусь. Написати швидкий алгоритм для впорядкування даних звучить простіше і забирає менше часу, переглядаючи поля Департамент та Назва роботи на відміну від жорсткого кодування Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']. Так само було б набагато складніше підтримувати жорстко закодований масив у випадку, якщо буде введено новий відділ чи титул.
Кріс Г

1
Ви можете мати більш складні речі, які все ще чутливі до жорсткого коду. Одне, що спадає на думку, що я писав кілька років тому, - це всі можливі перестановки набору значень. Мені потрібно було знайти випадковий дійсний напрямок, вибравши випадкову перестановку, а потім взяти перший дійсний результат, безумовно, було найефективнішим рішенням, і оскільки це було в ефективності циклу O (N ^ 3).
Лорен Печтел

4

Значення жорсткого коду буває нормально. Наприклад, є деякі числа, такі як 0, або одне або різні n ^ 2-1 значення для бітових масок, які повинні бути певними значеннями для алгоритмічних цілей. Допуск таких значень до налаштування не має значення і лише відкриває можливість виникнення проблем. Іншими словами, якщо зміна значення лише порушить речі, це, мабуть, має бути жорстко закодовано.

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


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

1
Слід зазначити, що керування усім цим у БД є одним із варіантів. Ви також можете використовувати конфігураційні файли чи інші рішення, але жорстке кодування виявляється поганим вибором. Опція БД часто використовується, тому що легко створити інтерфейс, щоб дозволити користувачам керувати параметрами. Є також такі інструменти , як це , які спеціально для цієї мети.
JimmyJames

-1

Реалізація надійного рішення, яке дозволяє для значень, які в іншому випадку могли бути жорстко закодовані, замість того, щоб їх можна було налаштувати кінцевим користувачам, вимагає надійної перевірки цих значень. Вони поставили в порожній рядок? Чи помістили вони щось нечислове, де воно повинно було бути числом? Вони роблять ін'єкцію SQL? І т.д.

Жорстке кодування дозволяє уникнути багатьох цих ризиків.

Що не означає, що жорстке кодування завжди, а то й часто, є гарною ідеєю. Це лише один із факторів, який слід враховувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.