Language agnostic 使用一种以常数为参数的方法与几种方法相比

Language agnostic 使用一种以常数为参数的方法与几种方法相比,language-agnostic,Language Agnostic,在肯特·贝克的书房里,人们可以阅读 “常量的一个常见用法是 在中传达消息的变体 接口。例如,到中心 可以调用的文本 设置对齐(对齐.居中)。 这种API风格的一个优点是 您可以添加的新变体 通过添加新的 不间断常数 但是,这些消息 不要在交流的同时拥有一个 每种变化的单独方法 这种风格,上面的信息是 justifyCentered()。一个接口,其中 方法的所有调用都具有 作为参数的文字常量可以是 通过给它单独的方法进行改进 对于每个常量值。” 为什么会这样?一般来说,当我编写代码时,我注意到我

在肯特·贝克的书房里,人们可以阅读

“常量的一个常见用法是 在中传达消息的变体 接口。例如,到中心 可以调用的文本
设置对齐(对齐.居中)
。 这种API风格的一个优点是 您可以添加的新变体 通过添加新的 不间断常数 但是,这些消息 不要在交流的同时拥有一个 每种变化的单独方法 这种风格,上面的信息是
justifyCentered()
。一个接口,其中 方法的所有调用都具有 作为参数的文字常量可以是 通过给它单独的方法进行改进 对于每个常量值。”

为什么会这样?一般来说,当我编写代码时,我注意到我有两个类似的无参数方法,可以简化为一个,带有一个参数,如下面的示例中所示

void justifyRight()
void justifyLeft()
void justifyCentered()
我通常会做与肯特建议的相反的事情,那就是把它分组

setJustification(Justification justification)
你通常如何处理这种情况?这完全是主观的,还是真的有一个非常强烈的理由,我看不出有利于肯特对这件事的看法


谢谢,我想这是主观的。有些人可能会争辩说,justifyLeft比justify(justify.LEFT)更清晰。将其全部折叠到一个方法中可能会产生更好的API—更少的混乱—模式可以存储在一个变量中,只需将其输入到单个setXY方法(每个方法都有不同的方法,您必须根据值手动决定调用哪个方法)。所以我通常喜欢这种方式。虽然通常只是:

void justify(Justification justification) {
    switch(justification) {
        Justification.RIGHT: this.justifyRight();
        Justification.LEFT: this.justifyLeft();
        Justification.CENTERED: this.justifyCenter();
    }
}

当然,只有当所有这些方法密切相关时,才建议这样做。

文件访问方法通常具有有关读/写模式、是否创建不存在的文件、安全属性、锁定模式等的参数。想象一下,如果为每个有效的参数组合创建一个单独的方法,您将拥有多少方法

我强调了支持单独方法的最大论点;它是故障安全的,因为您对API有严格的控制。如果不公开这些参数,调用方无法传入无效参数或无效的参数组合。这也意味着不太复杂的参数验证

然而,我不赞成这种做法。API应该设计得很好,并且应该。Kent Beck打破API变化:

[parameterized methods]的一个优点是,您可以通过添加新常量来添加现有方法的新变体,而不会破坏实现者

他支持不同方法的论点是:

然而,[参数化方法]并没有像为每个变体使用单独的方法那样进行通信


我不同意。方法参数也可以是可读的。特别是与命名参数结合使用时,一种由多种语言支持的功能。此外,单独的方法会导致API混乱。

我认为,当您试图通过代码复制获得更好的性能时,这是一种老式的编程。稍后,当您需要向该方法添加另一个参数,如margin类(大小为left、right、bottom、top margin)时,您将得到大量代码重复。我认为这与性能无关(至少与本书/作者有关)。