函数的参数类型强制约束以避免保护子句的设计概念有一个名称吗?

问题描述 投票:0回答:1

假设我有一个(伪代码)函数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、封装或其他东西的一般用法吗?

谢谢。

这不是故障排除问题。我只是问一个关于代码设计概念的问题。

function design-patterns typed guard-clause
1个回答
0
投票

这称为封装。使用 OOP 将数据和行为(验证和逻辑)封装在对象中。只要将行为封装在对象中有意义,就鼓励使用它。通过使用这种方法:

  • 您遵守SRP
  • 它带来了高凝聚力的设计
  • 您实现了更高的可重用性

例如,领域驱动设计战术模式构建块之一是值对象。它用于封装行为并重用它,通过将职责划分为多个连贯的类来降低领域的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.