封装类是否反映了Swift 3范例?

时间:2017-01-22 05:00:49

标签: swift design-patterns

物业:

  • 理想情况下,语言中的一个程序应该尝试匹配语言所归属的范例。
  • 在Swift中,这些范例主要是面向协议的编程,其次是函数式编程。
  • 出于兼容性和互操作性的原因,Swift还支持面向对象的编程。
  • 引用类型(Classes)是OOP的惯用语,而值类型(结构,枚举,基元)与协议相结合,是POP的惯用语。

结论:只要有可能,就应该使用值类型和协议,并且仅在完全必要时才恢复为Classes。

查询:那么,包含值类型的类的作用是什么?这些封装类是否与Swift范例一致,或者它们是否来自OOP?

基本案例:Swift中有以下好的或坏的做法:

struct Attribute {
    let name: String
    var value: Int
}

final class AttributeManager {
    var attributes: [Attribute] = []
    func add(attribute: Attribute) { self.attributes.append(attribute) }
}

1 个答案:

答案 0 :(得分:1)

您声明的部分场所位于错误的轨道上。

Swift是一种多范式的通用语言。由于兼容性和互操作性,它没有OOP。多范式语言允许开发人员为特定工作选择最合适的编码范例。

此外,一些概念与单一范式并不严格相关。值类型不仅仅是功能性的,它们在结构语言中形成基类型。许多非功能性的OOP语言也支持基本原语之外的值类型。

所谓的面向协议编程只是基于接口的编程的另一种形式和扩展 - 面向对象编程的核心概念之一。

你的问题,关于是否将价值类型包装到课堂中的好坏实践都无法回答,因为这取决于你将如何使用该课程。

类和结构的行为略有不同。有时候这种差异并不重要,所以你可以在它们之间自由选择,有时也可以,你必须使用符合你需要的那个。

在您的代码示例中,将AttributeManager定义为与struct相对的类的主要区别在于共享对其attributes字段的更改。如果您处理类实例,则可以将其作为参数传递,并且可以跨代码创建和保留对attributes字段所做的更改。使用值类型变量执行此操作会更复杂,并且需要使用输入输出参数或通过函数返回值返回更改的结构。类在这里提供了更多的灵活性。同样使用结构与Singleton模式相矛盾,你需要有一个且只有一个可以改变其状态的实例。

每个编程范例和相关概念都为特定问题提供了解决方案,但它们也引入了一些其他问题。当您选择一种编码范例而不是另一种编码范例时,您应该在您尝试解决的问题的上下文中选择它。

进一步阅读:Swift Is Not Functional