重构有助于减少重复

时间:2014-12-08 14:40:47

标签: swift uiviewcontroller refactoring

我有几个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()
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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()样式函数的问题,但根据我的经验,这是一个完全不同的蠕虫。我看得越多,我就越觉得这一切都取决于你作为开发者必须要知道的其他一些因素 - "我会添加更多参数吗?" "哪些对象知道其他对象是什么?" "我是否应该限制访问?"