面向协议的编程

时间:2015-08-11 13:55:40

标签: ios swift model protocols

当我们将大脑从Object Oriented Programming转换为Protocol Oriented Programming时,我该如何做?

让我说我有一个代表JSON的{​​{1}}对象有{created_time,updated_time,type,...},这些值在5个模型对象中很常见。

是否正确使协议包含以下所有属性,如下所示

Model

然后所有5个结构符合此协议

2 个答案:

答案 0 :(得分:7)

我会说这是一个非常好的解决方案。另一种方法是拥有一个具有这些属性的基类,并且所有这五个模型都继承自基类,但没有特别的理由在这里使用继承。

协议只是一个“合同”,保证一个类具有某些属性或行为。对我来说,这里的例子非常“契约”。

相反,继承意味着“is-a”关系(例如福特是一辆汽车)。对我来说,这感觉更像是契约,而不是“是一个”的情况。当然,这两种选择都不对,但认为你的协议想法很好。

答案 1 :(得分:1)

说到面向协议的编程Swift 2具有允许默认实现的协议扩展。这也取代了许多使用超类的情况。

在这种情况下:

// extension of your example protocol
extension xxx {
   var type : String { return "a type" }
   var updatedTime : String { return "00:00" }
   var createdTime : String { return "00:00" }
   //...//
}

// struct which conforms to it
struct Astruct: xxx {}

// using the properties
Astruct().type
Astruct().updatedTime

如果所有属性和方法都有协议扩展的默认实现,则您不必自己提供。但是,只有实现它们才能“覆盖”它们。

所以你的决定是正确的,你应该尽可能多地使用协议。

唯一的缺点是没有super可以显式调用默认实现。解决方法(请参阅此answer)将需要一个超类,这使得协议几乎是多余的。