【问题标题】:Not rewriting a method just to add a single line of code?不重写方法只是为了添加一行代码?
【发布时间】:2017-01-17 22:26:24
【问题描述】:

这一次又一次发生在我身上:我们有 CLS 类和 init 这样的方法:

init {
    // do A

    // do B

    // do C
}

现在,在某些情况下,我们需要在 BC 之间精确地执行 X。创建CLS 的子类并用插入的X 重写整个init 方法对我来说似乎不是一个好的解决方案(它与DRY 相反),有没有更好的解决方案发生在我身上?

请注意,ABC 是小代码片段,它们会进行诸如调整 UI 之类的小调整,因此将它们放在单独的方法中可能不是一个好主意。我目前正在使用 JavaScript 进行编码,但我认为这个问题也适用于其他 PL。

【问题讨论】:

    标签: javascript dry subclassing


    【解决方案1】:

    我们通常在父类中添加钩子,我们期望在其中进行扩展。我不记得它叫什么了。也许是template method pattern

    class Foo {
      init() {
        console.log("A");
        console.log("B");
        this.doX();
        console.log("C");
      }
      doX(){}
    }
    
    class Bar extends Foo {
      doX() {
        console.log("X");
      }
    }
    
    new Bar().init();

    【讨论】:

    • 不错。但是我看不到在doX 中访问init 的局部变量的方法。关于这件事有什么想法吗? (作为参数传递,return 是有限的,你必须为子类的每一个新需求更新超类)
    • @user3702014 可以将相关变量传递给doX,但不能这样修改。如果您有如此复杂的功能,我会考虑将整个功能提取到一个新类中(字段是当前局部变量)。如果您向我们提供更多背景信息,我们可能会提出更符合您需求的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2020-12-30
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多