要点是如果问题似乎是“我如何从返回单个int的方法中返回两条不相关的信息?我从不希望检查我的返回值,并且null不好,请不要使用它们。”
让我们看看您想通过什么。您正在通过一个int或一个非int的基本原理来解释为什么不能给出int。这个问题断言只有两个原因,但是任何曾经做过枚举的人都知道任何列表都会增长。指定其他原理的范围是有意义的。
最初,然后看来,这可能是引发异常的好案例。
当您想告诉调用者一些特殊的东西(不是返回类型)时,异常通常是合适的系统:异常不仅用于错误状态,还允许您返回很多上下文和理由来解释为什么您可以今天不是。
这是允许您返回保证有效的整数的唯一系统,并保证每个采用整数的int运算符和方法都可以接受此方法的返回值,而无需检查无效值(例如null或magic值)。
但是,正如其名称所暗示的那样,例外实际上仅是一种有效的解决方案,这是一种例外情况,而不是正常的业务过程。
而try / catch和handler和null检查一样,都是最初的目的。
如果呼叫者不包含try / catch,则呼叫者的呼叫者必须如此,依此类推。
天真的第二遍是说“这是一个测量。不可能进行负距离测量”。因此,对于某些测量值Y,您可以只为
- -1 =未知,
- -2 =无法测量,
- -3 =拒绝回答,
- -4 =已知但机密,
- -5 =取决于月相,请参见表5a,
- -6 =三维,尺寸以标题给出,
- -7 =文件系统读取错误,
- -8 =保留以备将来使用,
- -9 =平方/立方,因此Y与X相同,
- -10 =是监视器屏幕,因此不使用X,Y测量:使用X作为屏幕对角线,
- -11 =将尺寸写在收据的背面,被洗得难以辨认,但我认为它是5或17
- -12 = ...您明白了。
这是在许多旧的C系统中甚至在对int有真正约束的现代系统中完成的方式,您不能将其包装到某种类型的struct或monad上。
如果测量结果可能为负,则只需将数据类型设置为更大(例如,long int),并且魔术值大于int的范围,并且理想情况下应从将在调试器中清楚显示的某个值开始。
有充分的理由将它们作为一个单独的变量,而不是仅仅具有幻数。例如,严格的键入,可维护性和符合期望。
然后,在第三次尝试中,我们将具有非整数值的正常业务活动作为案例。例如,如果这些值的集合可能包含多个非整数条目。这意味着异常处理程序可能是错误的方法。
在这种情况下,对于通过int和其原理的结构来说,这是一个很好的例子。同样,此原理可以像上面一样是一个const,但是您不必将它们都保存在同一int中,而是将它们存储为结构的不同部分。最初,我们有一个规则,即如果设置了基本原理,则不会设置int。但是我们不再局限于这个规则。如果需要,我们也可以提供有效数字的依据。
无论哪种方式,每次调用它时,您仍然都需要样板,以测试基本原理以查看int是否有效,然后在基本原理允许的情况下退出并使用int部分。
这是您需要调查“请勿使用null”背后的原因的地方。
像异常一样,null表示异常状态。
如果调用者正在调用此方法并完全忽略结构的“ rationale”部分,期望一个没有任何错误处理的数字,并且它得到零,那么它将把零作为数字来处理,这是错误的。如果它得到一个幻数,它将把它当作一个数字,这是错误的。但是,如果它为null,它就会倒塌,这真是该死的。
因此,每次调用此方法时,都必须检查其返回值,但是您将处理无效值(带内或带外),尝试/捕获,检查“合理”组件的结构,检查int输入一个魔术数字,或检查一个int是否为空...
处理可能包含无效int和“我的狗吃了这个度量”等基本原理的输出的乘法的另一种方法是,对该结构的乘法运算符进行重载。
...然后重载应用程序中可能会应用于此数据的所有其他运算符。
...然后重载可能采用int的所有方法。
...而且所有这些重载将仍然需要包含对无效int的检查,只是为了使您可以将此方法的返回类型视为在调用它时始终是有效int。
因此,原始前提在各种方面都是错误的:
- 如果您有无效值,那么您将在处理这些值的代码中随时避免检查那些无效值。
- 如果返回的不是int,则不返回int,因此不能将其视为int。运算符重载让您假装,但这只是假装。
- 具有魔术数字(包括NULL,NAN,Inf ...)的int不再是真正的int,它是穷人的结构。
- 避免使用null不会使代码更健壮,它只会隐藏int问题,或者将它们移到复杂的异常处理结构中。