假设我有一个(伪代码)函数divideTwenty。
fn integer divideTwenty(int divisor) {
return 20/divisor;
}
这个函数很简单,但是容易出错。具体来说,如果
divisor
为 0 呢?处理这个问题的最佳方法是什么?有无数的答案。但现在,我们可以添加一个保护条款。
fn integer divideTwenty(int divisor) {
if(divisor == 0) {
return -1;
}
return 20/divisor;
}
这仍然不太好(除数可以为负数吗?),但让我们只关注该子句。还有一种替代方法可以实现同样的精神。如果我们不通过
int divisor
而通过 NonZeroInteger divisor
呢?
也就是说,
class NonZeroInteger {
int value;
fn void init(int allegedNonZeroInteger) {
if(allegedNonZeroInteger == 0) { throw InvalidArgumentException("Number is zero"); }
self.value = allegedNonZeroInteger;
}
}
fn integer divideTwenty(NonZeroInteger divisor) {
return 20/divisor.value;
}
我的问题很简单。这种设计模式有具体的名称吗?也就是说,我们显式创建类(或类型)是为了对提供给函数的数据建立约束。它只是说明类型化编程、OOP、封装或其他东西的一般用法吗?
谢谢。
这不是故障排除问题。我只是问一个关于代码设计概念的问题。
这称为封装。使用 OOP 将数据和行为(验证和逻辑)封装在对象中。只要将行为封装在对象中有意义,就鼓励使用它。通过使用这种方法:
例如,领域驱动设计战术模式构建块之一是值对象。它用于封装行为并重用它,通过将职责划分为多个连贯的类来降低领域的复杂性。