博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第五章——结构体与类(实体和值)
阅读量:6352 次
发布时间:2019-06-22

本文共 1394 字,大约阅读时间需要 4 分钟。

感谢提供翻译

在领域模型驱动设计(Domain Driven Design)[1]中体现了实体的区别,每个实体都有惟一的身份(identity),而值由它的属性所决定。

NSFileHandle是一个实体的例子:它封装了一个文件描述符。如果我们想知道两个NSFileHandle类型的对象是否相同,我们可以检查他们是否引用同一个对象。文件的句柄有生命周期,会随着时间改变。如果我们有两个不同的文件句柄(各自的文件描述符不相同),即便其他属性相同,我们也要对它们区别对待,应该分别关闭这两个文件描述符。

比如NSURL就是一个——它是一种不可变的对象,通过属性确认身份。如果两个NSURL对象表示的URL相同,那么这两个对象就是相同的。URL是固定的,不会随着时间改变。

当我们要在实体和值之间做出选择时,一个最重要的问题就是:*“它需要确定的身份吗?”*在文件句柄的例子中,回答是肯定的,我们需要分开管理每个文件句柄的生命周期。而在URL的例子中,我们关心它们表示的是否是同一个URL而非同一个引用。

在几乎所有的程序中,有许多的实体扮演者重要的角色。文件描述符、通知中心、网络接口、数据库记录、输入设备、应用以及缓存都是实体,因为它们都有自己的生命周期和惟一的身份。

值在软件中也有很多的用处。URL、二进制数据、日期、错误、字符串、通知以及数字只定义了它们的属性,它们不随着时间改变。使用了不可变值的代码更好理解,不可变性直接确保了他们是线程安全的:任何不可变的的东西在线程之间共享时都是安全的。

当我们需要区分值和引用时,应用的领域是决定因素之一。举个例子,在一个展示联系人信息的应用中,地址应该被定义为值类型,它的身份就是它的值。如果有很多联系人共用一个地址,我们必然不希望改动一个人的地址信息时也改动其他人的地址。然而在拼车的应用中,我们应该会用实体来表示地址:如果多人共用一个地址,我们希望它们拼一辆车。

在Swift中定义新类型时,我们可以在结构体、枚举和类中选择。类在大多数情况下最适合实体:类在默认情况下时可变的,而且类的实例会随着时间改变它们的状态

使用值类型时,结构体通常是最适合的。我们可以通过编译器强制结构体不可变。换句话说,编译器可以保证我们的类型有值语义。在某些情况下,类也可能是值类型的最佳选择——比如我们需要与Objective-c连接。不过这时候我们需要自己保证不可变性。

当你需要在结构体和类之间做出选择时,我们建议你考虑等价性(equality)。是否根据引用比较实例是否相同,换句话说,两个有一样数据的实例会被认为是不同的吗?如果答案是肯定的话,类更加适合。 我们还可以思考一下,是否能通过包含的数据判断实例是否相同?是的话,则结构体更适合。

当与Cocoa和Objective-C对接时,我们几乎总是需要使用类。举个例子,当实现一个table view的代理时,我们只能用类,别无选择。许多的苹果框架也严重依赖于子类。然而,面对不同领域的问题,我们可能仍需要设计具有值语义的类。举个例子来说,在Core Image框架中,CIImage对象是不可改变的:他们表示了一个再不能改变的图像。

在本章的剩余部分,我们会说明结构体和类在行为上的不同,这让你更容易决定把你的类型设计为类还是结构体。

##译者注 [1]:领域模型驱动设计参考的博客

转载地址:http://pxmla.baihongyu.com/

你可能感兴趣的文章
《Python网络数据采集》读书笔记(六)
查看>>
Linux必学的60个命令
查看>>
iptables 学习笔记 (上)
查看>>
Windows Server 2012 R2 Active Directory(活动目录)实验一
查看>>
android viewpager 无限左右滑动
查看>>
linux下SSH远程连接服务慢解决方案
查看>>
利用mic visual studio 2010 编译器执行wincap获取网络适配器的代码
查看>>
HTML
查看>>
CENTOS7下编译安装PHP-5.4以及配置phpMyAdmin
查看>>
磁盘显示无法访问拒绝访问,里面的资料怎样找到
查看>>
Java之品优购课程讲义_day07(5)
查看>>
Java的新项目学成在线笔记-day3(八)
查看>>
路由简单的实验
查看>>
好程序员web前端教程分享js reduce方法使用教程
查看>>
零基础学习大数据Hadoop需要什么准备?Hadoop如何发展起来的?
查看>>
前端程序员需要具备的几个软实力,你具备了吗
查看>>
RHEL系列网络配置2015083101
查看>>
c# 基本值类型及其默认值
查看>>
服务器端解决JS跨域调用问题
查看>>
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
查看>>