底层结构
我经常观察一个类型的实例变量,这样我就可以更深入地理解这个类型设计的初衷。一旦你知晓该类型的底层结构,它的用法也就随之浮出水面了。反之亦然:如果你没看过一个对象内部成员的布局情况,那么不可能准确把握该对象的功能。这种情况对于苹果的闭源类型尤其明显。 一个很好的例子是 对我来说,关键的启示是理解
所有的 列举一下单纯依靠这个浮点数能做的操作:比较( 对于其他功能,你必须使用其他的类和对象。例如,要及时地向一个时刻中增加一天的时间,可以选择向一个 因为 当我在编写我自己的 Promise 库时,发现了另一个有趣的例子,通过研究一个对象存储属性的布局来了解该对象的性质。如果查看每个 Promise 对象的存储属性,你会看到三样东西: public final class Promise<Value> { private var state: State<Value> private let lockQueue = DispatchQueue(label: "promise_lock_queue",qos: .userInitiated) private var callbacks: [Callback<Value>] = [] 每个 promise 都有它的当前状态(如 当我写完这个库时,看了一些 public final class Signal<T> { private var value: Result<T>? private var callbacks: [Result<T> -> Void] = [] private let mutex = Mutex() 它包含了存储当前状态的部分,存储回调的部分以及存储线程安全原语的部分。顺序有些不同,他们使用了互斥体而不是队列,但原理是相同的。这两种类型之间的唯一区别是语义上的:promises 可以在完成时清除它们的回调(释放自己以及捕获的变量),而 signals 必须保持它们的回调。 我认为这个原则也可以帮助设计自己的类型。看看你正在处理的对象的属性。每一个属性都有目的性吗?它是否对该对象的整体特性有帮助?是否有些属性在该对象的一些实例中能够用到,而在另一些实例中用不到?如果是的话,这些属性可能属于其他对象。确保类型的实例变量被严格控制并且充分利用,确保我们的每一个对象在应用中都有着明确的定位。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |