Суть в том, что вопрос кажется следующим: «Как я могу вернуть две несвязанные части информации из метода, который возвращает единственное целое число? Я никогда не хочу проверять свои возвращаемые значения, а нулевые значения плохие, не используйте их».
Давайте посмотрим на то, что вы хотите передать. Вы передаете либо int, либо non-int обоснование того, почему вы не можете дать int. Вопрос утверждает, что будет только две причины, но любой, кто когда-либо делал перечисление, знает, что любой список будет расти. Сфера, чтобы указать другие обоснования просто имеет смысл.
Сначала, похоже, это может быть хорошим поводом для создания исключения.
Когда вы хотите сообщить вызывающей стороне что-то особенное, чего нет в типе возврата, исключения часто являются подходящей системой: исключения не только для состояний ошибок, и позволяют вам возвращать много контекста и обоснования, чтобы объяснить, почему вы просто можете не сегодня.
И это ЕДИНСТВЕННАЯ система, которая позволяет вам возвращать гарантированно действительные целочисленные значения и гарантирует, что каждый оператор int и метод, принимающий целочисленные значения, могут принимать возвращаемое значение этого метода без необходимости проверять недопустимые значения, такие как нулевые или магические значения.
Но исключения на самом деле являются только верным решением, если, как следует из названия, это исключительный случай, а не нормальный ход бизнеса.
А try / catch и handler - это такой же шаблон, как и нулевая проверка, против которой прежде всего возражали.
И если вызывающая сторона не содержит try / catch, то вызывающая сторона должна и так далее.
Наивный второй проход - сказать: «Это измерение. Отрицательные измерения расстояния маловероятны». Так что для некоторого измерения Y, вы можете просто иметь констант для
- -1 = неизвестно,
- -2 = невозможно измерить,
- -3 = отказался отвечать,
- -4 = известный, но конфиденциальный,
- -5 = варьируется в зависимости от фазы луны, см. Таблицу 5а,
- -6 = четырехмерный, измерения приведены в заголовке,
- -7 = ошибка чтения файловой системы,
- -8 = зарезервировано для будущего использования,
- -9 = квадрат / куб, поэтому Y такой же, как X,
- -10 = - экран монитора, поэтому не используются измерения X, Y: используйте X в качестве диагонали экрана,
- -11 = записал результаты измерений на обратной стороне квитанции, и она была отмыта до неразборчивости, но я думаю, что это было либо 5, либо 17,
- -12 = ... ты понял.
Именно так это делается во многих старых C-системах и даже в современных системах, где есть подлинное ограничение для int, и вы не можете связать его со структурой или монадой какого-либо типа.
Если измерения могут быть отрицательными, тогда вы просто увеличиваете свой тип данных (например, long int) и получаете магические значения выше диапазона int, и в идеале начинаете с некоторого значения, которое будет четко отображаться в отладчике.
Однако есть веские причины иметь их в качестве отдельной переменной, а не просто иметь магические числа. Например, строгая типизация, ремонтопригодность и соответствие ожиданиям.
В нашей третьей попытке мы рассмотрим случаи, когда обычным делом является использование не-int-значений. Например, если коллекция этих значений может содержать несколько нецелых записей. Это означает, что обработчик исключений может быть неправильным подходом.
В этом случае это выглядит хорошим случаем для структуры, которая передает int и обоснование. Опять же, это обоснование может быть просто константой, подобной приведенной выше, но вместо того, чтобы держать оба в одном и том же int, вы сохраняете их как отдельные части структуры. Первоначально, у нас есть правило, что, если обоснование установлено, int не будет установлен. Но мы больше не привязаны к этому правилу; мы можем предоставить обоснования для действительных номеров, если это необходимо.
В любом случае, каждый раз, когда вы звоните, вам все еще нужен шаблон, чтобы проверить обоснование, чтобы увидеть, является ли int действительным, а затем вытащить и использовать часть int, если это позволяет обоснование.
Вот где вам нужно исследовать ваши аргументы "не используйте ноль".
Как и исключения, null предназначен для обозначения исключительного состояния.
Если вызывающая сторона вызывает этот метод и полностью игнорирует часть «логического обоснования» структуры, ожидая число без какой-либо обработки ошибок, и получает ноль, то она будет обрабатывать ноль как число и ошибаться. Если он получит магическое число, он будет воспринимать его как число и будет ошибочным. Но если он получит нулевое значение, он упадет , как, черт побери, должно быть.
Поэтому каждый раз, когда вы вызываете этот метод, вы должны проверять его возвращаемое значение, однако вы обрабатываете недопустимые значения, будь то внутриполосные или внеполосные, попробуйте / перехватите, проверив структуру для компонента «обоснование», проверив int для магического числа, или проверка int на нулевое значение ...
Альтернативой для обработки умножения выходных данных, которые могут содержать недопустимое значение int и обоснование, например «Моя собака съела это измерение», является перегрузка оператора умножения для этой структуры.
... А затем перегрузите все остальные операторы в вашем приложении, которые могут быть применены к этим данным.
... А затем перегрузите все методы, которые могут принимать целочисленные значения.
... И все эти перегрузки должны по- прежнему содержать проверки на недопустимые целые числа, просто чтобы вы могли обрабатывать возвращаемый тип этого одного метода, как если бы он всегда был действительным int в момент, когда вы вызываете его.
Таким образом, первоначальная предпосылка ложна по-разному:
- Если у вас есть недопустимые значения, вы не можете избежать проверки этих недопустимых значений в любой точке кода, где вы обрабатываете значения.
- Если вы возвращаете что-то кроме int, вы не возвращаете int, поэтому вы не можете рассматривать его как int. Перегрузка оператора позволяет вам притворяться , но это только притворство.
- Int с магическими числами (включая NULL, NAN, Inf ...) больше не является int, это структура бедняка.
- Исключение пустых значений не сделает код более устойчивым, оно просто скроет проблемы с целыми числами или переместит их в сложную структуру обработки исключений.