当我必须使用嵌套对象结构时,我总是有同样的问题。一个例子:
class Criteria {
filters: Filter[];
}
class Filter {
field: string;
operator: Operator;
value: string;
}
class Operator {
operator: '=' | '!=';
}
我尝试在这种情况下的返回方法中应用德米特定律,但是使用该结构创建步骤的最佳实践是什么?
class Client {
constructor() {
const criteria = new Criteria([new Filter('field1', new Operator('='), 'value1')]);
}
}
class Client {
constructor() {
const criteria = new Criteria([{field: 'field1', operator: '=', 'value': 'value1'}]);
}
}
这取决于对象的用途,因此您可能会在良好的代码中看到两种模式——您的示例剥离了表明一种模式与另一种模式的所有内容。
我认为在好的代码中,第一种模式——客户端创建对象——会更受欢迎。这是因为这些对象将是“注入依赖项”,并且遵循 SOLID 原则,“实现”不应该依赖于所有不同类型的过滤器。如果情况并非如此,那你为什么还要开设Criteria
课程呢?
第一个问题是:嵌套类是 API 的一部分,还是供内部使用?
这样想:您将 API 划分为概念(条件、过滤器、运算符),并且您的用户已经需要熟悉这些概念以及它们如何映射到类。在这些条件下,让他们自己创建嵌套类可以提供最大的灵活性。
要求它们提供原始值并让您为它们构造这些嵌套对象会限制灵活性,并且可能有必要设置这样的限制 - 如果您有理由这样做。