Суть, якщо питання, здається, "Як я повертаю два непов'язані фрагменти інформації з методу, який повертає єдину цілу? Я ніколи не хочу перевіряти свої повернені значення, а нулі погані, не використовуйте їх".
Давайте подивимось, що ви хочете пройти. Ви передаєте або int, або не-int обґрунтування, чому ви не можете дати Int. Питання стверджує, що буде лише дві причини, але кожен, хто коли-небудь зробив перерахунок, знає, що будь-який список зростатиме. Область застосування інших обґрунтувань просто має сенс.
Тоді спочатку це виглядає так, що це може бути гарним випадком для кидання винятку.
Коли ви хочете сказати абоненту щось особливе, що не відповідає типу повернення, винятки часто є відповідною системою: винятки не є лише для станів помилок, і дозволяють повернути багато контексту та обґрунтування, щоб пояснити, чому ви просто можете сьогодні не ін.
І це ТІЛЬКА система, яка дозволяє повернути гарантійно-дійсні вставки та гарантувати, що кожен оператор int та метод, який приймає вставки, можуть прийняти значення повернення цього методу, не маючи необхідності перевіряти наявність недійсних значень, таких як нульові чи магічні значення.
Але винятки - це лише прийнятне рішення, якщо, як випливає з назви, це винятковий випадок, а не звичайний хід бізнесу.
І спроба / улов і обробник - це стільки ж котла, скільки і нульова перевірка, на що в першу чергу заперечували.
І якщо абонент не містить спроби / лову, то абонент, що викликає, повинен викликати і так далі.
Наївний другий прохід - сказати "Це вимірювання. Негативні вимірювання відстані навряд чи". Так що для деякого вимірювання Y, ви можете просто мати витрати на
- -1 = невідомо,
- -2 = неможливо виміряти,
- -3 = відмовився відповісти,
- -4 = відомий, але конфіденційний,
- -5 = змінюється залежно від фази місяця, див. Таблицю 5a,
- -6 = чотиривимірні вимірювання, наведені в заголовку,
- -7 = помилка читання файлової системи,
- -8 = зарезервовано для подальшого використання,
- -9 = квадрат / кубічний, тому Y такий же, як X,
- -10 = це екран монітора, тому не використовується вимірювання X, Y: використовувати X як діагональ екрану,
- -11 = записував вимірювання на звороті квитанції, і це було відмито до невідбірливості, але я думаю, це було 5 або 17,
- -12 = ... ви отримаєте ідею.
Це робиться так, як у багатьох старих системах C, і навіть у сучасних системах, де існує справжнє обмеження для int, і ви не можете зафіксувати його на структурі чи монаді якогось типу.
Якщо вимірювання можуть бути негативними, ви просто збільшите тип даних (наприклад, довгий int) і магічні значення будуть вищими за діапазон int, і в ідеалі починаєте з деякого значення, яке буде чітко відображатися в налагоджувачі.
Однак є вагомі причини мати їх як окрему змінну, а не просто мати магічні числа. Наприклад, суворий набір тексту, ремонтопридатність та відповідність очікуванням.
Тоді в нашій третій спробі ми розглядаємо випадки, коли нормальним ходом бізнесу є неінтимні значення. Наприклад, якщо колекція цих значень може містити кілька нецілих записів. Це означає, що обробником винятків може бути неправильний підхід.
У такому випадку це виглядає непоганим випадком для структури, яка передає int, та обґрунтування. Знову ж таки, це обґрунтування може бути просто такою, як вище, але замість того, щоб обидва вони трималися в одному і тому ж, ви зберігаєте їх як окремі частини структури. Спочатку у нас є правило, що якщо встановлено обґрунтування, int не буде встановлено. Але ми більше не прив’язані до цього правила; ми можемо надати обґрунтування і для дійсних чисел, якщо буде потреба.
У будь-якому випадку, кожен раз, коли ви його називаєте, вам все-таки потрібна котельна плита, щоб перевірити обґрунтування, щоб перевірити, чи є дійсний int, а потім витягніть та використовуйте частину int, якщо обґрунтування дозволяє нам.
Саме тут вам потрібно дослідити свої міркування щодо "не використовувати нуль".
Як і винятки, "null" означає винятковий стан.
Якщо абонент викликає цей метод і повністю ігнорує "обгрунтування" частини структури, очікуючи число без будь-якої обробки помилок, і він отримує нуль, то він буде обробляти нуль як число і помиляється. Якщо воно отримає магічне число, воно сприйме це як число і помиляється. Але якщо він отримує нуль, він буде падати , так як це , чорт забирай, треба робити.
Тому щоразу, коли ви закликаєте цей метод, ви повинні встановити чеки на його повернене значення, однак ви обробляєте недійсні значення, вхідні чи поза діапазону, спробуйте / ловити, перевіряючи структуру на "обґрунтування" компонента, перевіряючи int для магічного числа або перевірки int на нуль ...
Альтернативно, для обробки множення результату, який може містити недійсний int та обґрунтування типу "Моя собака з'їла це вимірювання", - це перевантажувати оператора множення для цієї структури.
... А потім перевантажуйте кожного іншого оператора у вашій програмі, який може застосувати ці дані.
... А потім перевантажуйте всі методи, які можуть приймати вставки.
... І всі ці перевантаження повинні все-таки містити перевірки на недійсні вставки, тільки щоб ви могли обробити тип повернення цього одного методу так, ніби він завжди був дійсним int у точці, коли ви його викликаєте.
Тож оригінальна передумова є помилковою різними способами:
- Якщо у вас є недійсні значення, ви не можете уникнути перевірки цих недійсних значень у будь-якій точці коду, де ви обробляєте ці значення.
- Якщо ви повертаєте щось, окрім int, ви не повертаєте int, тому не можете ставитися до цього як до int. Перевантаження оператора дозволяє прикидатися , але це лише прикидатися.
- Інт з магічними числами (включаючи NULL, NAN, Inf ...) більше не є int, це структура бідолахи.
- Уникнення нулів не зробить код більш надійним, він просто приховає проблеми з ints або перемістить їх у складну структуру обробки винятків.