瑞典禁止中国参与5G建设?
2. 脆弱的基类问题 如果已经成功地将另一个项目中的类重用于新代码,那么基类会发生怎样的变化? 它可能会破坏整个代码,而你甚至可能都没有碰过它。也许有一天你手上的项目熠熠生辉,而第二天却被打回原形,因为有人更改了基类中的一个细微细节,而该细节最终对项目至关重要。
使用继承的次数越多,潜在的维护工作就越多。因此,即使在短期内重用代码似乎非常有效,但从长远来看,它可能会带来很大的代价。 面向对象编程中的五大问题 面向对象编程一问世便改变了开发人员查看代码的方式。在1980年代以前,面向过程编程通常以机器为中心,开发人员需要非常了解计算机如何工作才能编写好的代码。 通过封装数据和方法,面向对象的编程使软件开发更加以人为中心。与人类的直觉相符,方法drive()属于数据组 car,但不属于teddybear组。当继承产生时,这也很直观。Hyundai是car的一个子类,并且具有相同的属性,但PooTheBear却不是,这是完全合理的。 这听起来像是一台强大的机器。但问题在于,只懂面向对象代码的程序员将会用这种思维方式思考他们所做的一切。就像人们到处看到钉子一样,因为他们只有锤子。正如我们将在下面看到的那样,当你的工具箱只有锤子时,可能会导致致命的问题。 1. 大猩猩丛林香蕉问题 如果你正在设置一个新程序,并且正在考虑设计一个新类。你可能会回想起为另一个项目创建的简洁的小类,并且意识到这对当前正在尝试的工作非常适合。没问题!可以将旧项目中的类重用于新项目。 除了该类实际上可能是另一个类的子类之外,因此现在还需要把父类包括在内。然后你意识到父类也依赖于其他类,并且最终包含了代码堆。 Erlang的创建者Joe Armstrong的这句话非常著名:“面向对象编程语言的问题在于,它们具有随身携带的所有隐式环境。你想要香蕉,但是得到的是一只拿着香蕉的大猩猩和整个丛林。”
这对此方法进行了很好的说明。可以重用类,实际上,这可能是面向对象编程的主要优点。但不要走极端,有时最好编写一个新类,而不是为了写重复代码而添加大量依赖项。要灵活变通,不要死板地遵从某个范式。 总结CPU 在读写数据的时候,都是在 CPU Cache 读写数据的,原因是 Cache 离 CPU 很近,读写性能相比内存高出很多。对于 Cache 里没有缓存 CPU 所需要读取的数据的这种情况,CPU 则会从内存读取数据,并将数据缓存到 Cache 里面,最后 CPU 再从 Cache 读取数据。 而对于数据的写入,CPU 都会先写入到 Cache 里面,然后再在找个合适的时机写入到内存,那就有「写直达」和「写回」这两种策略来保证 Cache 与内存的数据一致性:
当今 CPU 都是多核的,每个核心都有各自独立的 L1/L2 Cache,只有 L3 Cache 是多个核心之间共享的。所以,我们要确保多核缓存是一致性的,否则会出现错误的结果。 要想实现缓存一致性,关键是要满足 2 点:
基于总线嗅探机制的 MESI 协议,就满足上面了这两点,因此它是保障缓存一致性的协议。
MESI 协议,是已修改、独占、共享、已实现这四个状态的英文缩写的组合。整个 MSI 状态的变更,则是根据来自本地 CPU 核心的请求,或者来自其他 CPU 核心通过总线传输过来的请求,从而构成一个流动的状态机。另外,对于在「已修改」或者「独占」状态的 Cache Line,修改更新其数据不需要发送广播给其他 CPU 核心。 (编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |