Oop 反if用途:如何检查空值?
我最近听说了一些OOP专家在编写代码时不使用ifs,而是使用多态性。我只是不明白该怎么做,我是说,该怎么做 我已经使用了多态性(不知道反if活动),因此,我对“坏”和“危险”的ifs很好奇,我去看了我的代码(Java/Swift/Objective-C),看看我在哪里使用了最多的if,看起来情况如下:Oop 反if用途:如何检查空值?,oop,design-patterns,null,Oop,Design Patterns,Null,我最近听说了一些OOP专家在编写代码时不使用ifs,而是使用多态性。我只是不明白该怎么做,我是说,该怎么做 我已经使用了多态性(不知道反if活动),因此,我对“坏”和“危险”的ifs很好奇,我去看了我的代码(Java/Swift/Objective-C),看看我在哪里使用了最多的if,看起来情况如下: 检查空值。这是我使用ifs时最常见的情况。如果一个值可能为空,我必须以正确的方式管理它。要使用它,我必须检查它是否为null。如果没有ifs,我看不出多态性如何补偿这一点 检查正确的值。这里我将举
所以,我知道根本不使用ifs可能不是有史以来最聪明的想法,但我只是想问一下,在OOP程序中是否可以有效地使用ifs,以及如何有效地使用ifs 如果s,你永远无法完全摆脱
,但你可以最小化它们
关于空值检查,一个本来会返回空值的方法可以返回一个空值,一个不代表实值但实现了与实值相同行为的对象。它的调用者只需调用Null对象上的方法,而不用检查它是否为Null。方法中可能仍然有一个if
,但调用方中不需要有任何
关于正确的值检查,最好的方法是防止使用错误的属性实例化对象。然后,对象的所有用户都可以确信,他们不必检查对象的属性就可以使用它。类似地,如果对象可以具有有效或无效的属性,那么它可以通过提供对当前属性值执行正确操作的更高级别方法来向用户隐藏该属性。同样,在对象内部仍然有一个if
,但是调用方中不需要有任何if
关于错误检查,有几种策略比返回调用方可能忘记检查的可能为空的错误值更好。一个是提出一个例外。另一种方法是返回一个类型的对象,该对象可以保存一个结果或一个错误,并在适当的时候提供类型安全的、不受限制的、对任一结果进行操作的方法,如Java的可选的或Haskell的可能的
还请注意,case
语句只是连接了if
s(事实上,我会在活动主页上用开关编写代码,而不是if
/else if
),还有一些模式将case
替换为多态性,例如。最好使用if
检查null
,而不是引发异常。同样,在常见情况下,检查null
有助于我们防止使用未初始化变量进行操作。使用if
检查null
比引发异常要好,因为异常比简单的if
检查浪费更多内存。使用开关
加固体。这是一个很好的问题,我参加过的每一个OO训练营都会问这个问题。首先,我们需要理解为什么带有大量ifs的代码是“坏的”或“危险的”:
- 它们增加了代码的难度,使其难以理解
- 它们使测试的编写更加复杂。确保测试被测方法中的每个分支流对于每个条件都变得越来越困难,并且使测试设置变得繁琐
- 它们可能表明您的代码没有被分解成足够小的方法
- 它们可能表明您的方法没有得到很好的封装
然而,有一件重要的事情需要记住——ifs不能(也不应该)从代码中完全消除。但是,我们通常可以使用多态性、提取小行为并将这些行为封装到适当的类中等技术将它们抽象出来
既然我们知道了一些我们应该避免ifs的原因,那么让我们来解决您的问题:
检查空值:帮助您消除代码中的空检查(多态性FTW)。不是返回null,而是返回预期对象的NullObject表示形式。此NullObject具有与实际对象相同的接口,您可以安全地调用该对象的任何方法,而无需担心引发null指针异常
检查值的正确性:有很多方法可以做到这一点。例如,您可以为每个验证创建一个单独的ValidationRule类,然后在需要验证对象时将对它们的调用链接在一起。请注意,ifs仍然存在,但它们被抽象为各个ValidationRule实现。请查阅和查找,以获取想法
这不是我问题的重点。。。我不是说移除类型安全性,而是用另一种方式。在Swift中,例如使用optionals,您可以确保如果您有一个非可选类型,那么它不可能为null,除非