求索

Make Something Different

类是如何定义出来的

Object Oriented是多种软件设计方法中的一种,其核心目标是为了降低系统的复杂性,以及代码复用。在OO里,一个类(Class)代表了一组具有共同结构和行为的一组对象(Objects),是OO语言的基础。而类又是又如定义出来的呢?

2015-10-20 22:35:57

阅读数:1814

评论数:0

[OOD-More C++ Idioms] 律师与委托人 (Attorney-Client)

律师与委托人 (Attorney-Client)目的控制访问类实现细节的粒度。C++中的friend会开始类内部的所有细节,也因此破坏了封装性。C++没有提供可以选择性使用某一部分私有成员的方式,要么全部开放,要么全部拒绝。 如果能选择确定需要使用到的一组成员,而不是全部,就可以降低耦合性。而这个...

2015-10-17 23:57:47

阅读数:2519

评论数:0

Google C++ Style Guide的哲学

Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。以下主要摘自GSG负责人Titus Wi...

2015-09-30 01:45:12

阅读数:2385

评论数:1

[OOD]违反里氏替换原则的解决方案

关于OOD的几个设计原则,大家耳熟能祥了,不再展开,可以参考设计模式的六大设计原则之里氏替换原则。这里尝试讨论常常违反的形式和解决方案。违反里氏替换原则的根源是对子类及父类关系不明确。我们在设计继承关系常常受一些主观认识的左右,比如Robert C. Martin提到的线段与线的关系,以及被大家说...

2015-09-24 01:00:14

阅读数:2812

评论数:4

为什么浏览器采用多进程模型

为什么浏览器采用多进程模型这个问题的答案似乎是非常清楚的,可以概括为:为了安全、稳定、性能,只是要牺牲点内存作为代价。对于安全和稳定,利用系统的进程机制就可以完成。但是多进程下的进程间通讯(IPC)很慢,而分为多进程后,一些协作任务就要分开到两个进程,如何能保持良好的性能,更不说比单进程模型更高的...

2015-08-14 01:31:38

阅读数:3123

评论数:0

名不符实的读写锁

有一种单一写线程,多个读线程并发的场景,比如测量数据的读取与更新,消费者会比较多,生产者只有一个。以下图为例: 左侧是一种经典的解法,对数据整个操作加锁。为了一个写数据线程,于将所有读线程也进行加锁显然有点浪费了。于是提出读写锁(Reader/Writer Lock), 即使是使用了读写锁,...

2015-08-07 00:12:51

阅读数:1740

评论数:0

线程安全的观察者模式的设计

观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类ObserverListThreadSafe。

2015-08-05 01:12:28

阅读数:3087

评论数:0

Google C++ Coding Style:右值引用(Rvalue Reference)

Google C++ Coding Style: Rvalue Reference 右值引用是一个C++11特性,标记为T&&。GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用。并且不要使用std::F...

2015-08-04 00:14:41

阅读数:1518

评论数:0

Google C++ Coding Style:引用参数

Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。即如下形式:void Foo(const string &in, string *out);在如下情况下...

2015-07-29 00:43:55

阅读数:1857

评论数:1

大型项目开发: 隔离 (《大规模C++程序设计》书摘)

书中第六章 隔离。 主要在撰述什么需要定义在头文件?什么应当移到编译单元中? 核心仍然是先区分接口定义与实现细节。实现细节的改变会导致客户代码的重新编译,从逻辑上也表示与客户代码间可能存在着强耦合。实现细节与隔离主要考察以下实现细节,它们会在接口中引入实现细节,也是需要考虑进行隔离的内容: 继承...

2015-07-20 00:47:06

阅读数:2250

评论数:0

大型项目开发:谨慎使用智能指针

智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点: 1.性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。2. 对象释放的时机不明确。比...

2015-07-13 00:30:37

阅读数:3823

评论数:0

大型项目开发: 头文件顺序

经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<<大规模C++程序设计>>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例说明。

2015-07-09 00:25:17

阅读数:3312

评论数:2

技术债务管理以及Firefox/Chromium的债务评价

现在的软件开发是在遍地敏捷,人人讲唯快不破的时代,哪有人有时间思考代码质量,设计的质量? 哪个又不是从一堆代码中杀出血路来实现另一个功能?一个产品都存活不了几年,何必考虑什么可维护性?我们追求进度的时候,总是要牺牲些东西,或是破坏了一些东西等着后面补。这就是技术债! 管理不好,债台高筑,即使不破产...

2015-07-04 01:12:41

阅读数:2235

评论数:2

如何避免类的膨胀

类的膨胀(Bloating)指的是类中成员过多,甚至出现无序增加的情况。过大的类,会使得复杂度急剧增加,维护会变得更为困难。所以需要控制类的增长。本文总结了一下,简单介绍四种解决的方式,我故意用四个来讲,主要为了介绍最后一种方式。

2015-06-25 02:11:29

阅读数:2882

评论数:4

API的设计与实现

关于API的设计与实现API的设计是软件开发中一个独特的领域。最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces。所以相对于依据软件设计的原则,考虑用户的”体验”会更加重要。许多著名的工具和库的作者都写过相关的著作,详细的论述他们在A...

2015-06-24 00:09:17

阅读数:9031

评论数:1

软件设计的复杂度

什么是软件设计的复杂度软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。本文介绍通过分解、改善依赖关系,以及抽象的方式来降低复杂度。

2015-04-30 00:57:32

阅读数:5160

评论数:1

[OOD] 隔离变化-桥接模式

使用一个抽象的接口隔离变化,既提高了各层的内聚性,又降低它们间的耦合。符合OO原则中的: 1. 封装变化 2. 针对接口编程,而不针对具体的实现。 3. 降低交互对象的耦合度。

2015-04-21 00:45:18

阅读数:1925

评论数:0

[OOD] 适配器模式

适配器模式常常与桥接模式相比较,两者最大的不同在于解决的问题不同。适配器用于对接两个不同的接口,而桥接则主要为了隔离变化。从应用上来说,一个是被动的,一个是主动的。 所谓被动的,就是当前的接口的差异是无法轻易改变的,必须引入一个中间层来解决。而中间层的引入往往带有性能、以及不必要的数据拷贝等开销,...

2015-04-21 00:10:27

阅读数:1739

评论数:0

[OOD] 为什么单一职责原则(SRP)是最难运用的

RP是所有设计原则最简单的,但也是最难运用的。现实工作中,关于一个类是否符合SRP,或者是否有必要符合SRP的讨论是经常发生的。争论的关键在于职责的定义,但我理解SRP真正的核心是关注于变化。

2015-04-18 23:53:47

阅读数:2363

评论数:1

[架构设计] 组件和模块的区别

组件(Component)和模块(Module)又是一对容易混淆的名词,也常常被用来相互替换。个人总结,从设计上来看,组件强调复用,模块强调职责(内聚),或者说组件是达到可复用要求的模块。

2015-04-17 00:04:55

阅读数:16489

评论数:1

提示
确定要删除当前文章?
取消 删除
关闭
关闭