【问题标题】:Refactoring help to reduce duplication重构有助于减少重复
【发布时间】:2014-12-08 14:40:47
【问题描述】:

我有几个 ViewControllers 都有几个方法,如下所示(这些实际上是类中唯一的方法。)

@IBAction func witnessNameAction(sender: RoundCornerButton) {
    presentTextEntryFromViewController(self, initialText: incidentReport.witnessName, completion: { [unowned self] text in
        self.incidentReport.witnessName = text
    })

    sender.setTapped()
}

@IBAction func witnessDescriptionAction(sender: RoundCornerButton) {
    presentTextEntryFromViewController(self, initialText: incidentReport.witnessDescription, completion: { [unowned self] text in
        self.incidentReport.witnessDescription = text
    })

    sender.setTapped()
}

请注意,上述两种方法之间的唯一区别是正在获取/设置哪个文本变量。我愿意接受有关如何重构这些方法的任何想法。

【问题讨论】:

  • MVVM 架构可以干掉这个。但是,由您来决定重构这是否是项目范围内的高优先级。
  • 我很想听到更多@mattt。上面的代码来自一个 ViewModel。 (Apple 称它们为 ViewController,但据我所知,它们的用途相同。)
  • iOS 视图控制器不是视图模型。如果你在 iOS 上搜索 MVVM 架构,会有很多关于这个主题的好博文。

标签: swift uiviewcontroller refactoring


【解决方案1】:

来自 Java 并阅读了一些微软为他们在 MSDN for C# 上建议的方法的一些借口,我可以通过几种方法看到这种方法。

如果该方法只有两个参数,请创建一个允许两个参数的方法:

function witness(paramA, paramB) {
    if (paramA != null) {
        // Target A
    }
    if (paramB != null) {
        // Target B
    } 
}

这让我觉得“我有对象 A,需要在对象 B 中创建一个统一的概念”

否则,枚举或静态整数也可以工作:

function witness(target, param) {
    switch (target) {
        case TARGET_A:
            // Target A
            break;
        case TARGET_B
            // Target B
            break;
    }
}

这让我觉得“我有一个对象,其中包含我希望外部访问更改的字段”

您甚至可以使用允许您指定多个目标的 if 语句:

function witness(targets, param) {
    if (targets.contains(TARGET_A) {
        // Target A
    }
    if (targets.contains(TARGET_B) {
        // Target B
    }
}

这与上面的方式相同。

最后但并非最不重要的一点是,您可以将概念分开,并将 self.incidentReport.whatYouNeed 作为目标:

function witness(target, param) {
    target = param;
}

但对我来说,这更像是“我有一个必须通过验证或预操作设置的对象的未定义概念”,这可能是代码本身的味道。在 Java 世界中,我认为 setIfValid() 或 prepareForSet() 样式函数没有问题,但与我的经验完全不同。我越看越觉得这一切都取决于你作为开发人员必须知道的一系列其他因素——“我会添加更多参数吗?” “什么物体知道什么其他物体?” “我还是应该限制访问吗?”

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多