---DO NOT REPEAT YOURSELF---

建设性的懒惰,是程序员的第一美德。最简单的懒惰就是不要重复自己,简单到一个命名规则,例如C语言中:
int osip_list_init (osip_list_t li)
void osip_list_special_free (osip_list_t
li, void (free_func)(void ))
void osip_list_ofchar_free (osip_list_t
li)
int osip_list_size (const osip_list_t li)
int osip_list_eol (const osip_list_t
li, int pos)
int osip_list_add (osip_list_t li, void element, int pos)
void * osip_list_get (const osip_list_t li, int pos)
int osip_list_remove (osip_list_t
li, int pos)

这是一个原型,但它重复的太厉害。osip是软件包名,它应该是一个范围声明,说明所有代码都是它的一部分。list是一个模块名,事实上它也是首参数的类型名,它应该只保留一个。这事实上非常接近于Oberon的模块定义. 加上类型缩写,即与C++的定义完全一致。
C语言的派生语言基本都采用这个形式。

namespace osip {
class list_t {
int init ()
void special_free (void (free_func)(void ))
void ofchar_free ()
int size () const
int eol (const int pos)
int add (void
element, int pos)
void * get (const int pos)
int remove (int pos)
}
}

---CLOSE TO MODIFY, OPEN TO EXTEND---

C语言缺少复杂数据结构,以及数据隐藏的能力. 良好的API设计不得不使用Opaque data这样的数据结构来表示复杂抽象, 隐藏可能的模型变化。C语言中的容器类型事实上只有数组,如果是迭代结构,例如map,hash,jumplist,只能由多个API(begin,next,end)来表示。

C++比C进一步,但头文件的纯文本方式公开的模型内部结构,但由于静态编译,类型已经在编译时在程序中确定,相对要好一点。

这一点上脚本语言做得更好,最常用的复杂数据结构被内置于语言,甚至做为语言的基本结构。如lua的Table,它即是数组,也是映射表,还是对象结构。

更重要的是,这些复杂数据结构,方便领域模型到代码的映射,使代码表达领域模型更加直观。而在C语言中,我们需要最大限度的简化领域模型,过多个层次和模型包裹只会导致混乱的代码。最明显,也许不被大家知晓的例子是文件IO,在C语言层次只提供了FILE这一个整体抽象,它的内部结构不公开。而C++中提供ostream/istream,filebuf这三个对象的一个相对复杂结构。不论模型的好坏,C++的模型如果用C来实现,肯定是一场灾难。

一句话来说,由于C语言的基础设施比较少,由这些基础设施实现的代码有较高的耦合性,因此几乎马上就到了必须以内聚性接口来封装的地步。而面向对象的语言如C++等,由于有类的支持,低层代码耦合性被控制的比较好。因此,可以设计相对复杂模型。

C和设计原则的更多相关文章

  1. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  2. SOLID 设计原则

    SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...

  3. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  4. AngularJS_01之基础概述、设计原则及MVC设计模式

    1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...

  5. UML类图与面向对象设计原则

    1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...

  6. SOA 实现:服务设计原则

    http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...

  7. Apple、Google、Microsoft的用户体验设计原则

    轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...

  8. GOTO Berlin: Web API设计原则

    在邮件列表和讨论区中有很多与REST和Web API相关的讨论,下面仅是我个人对这些问题的一些见解,并没有绝对的真理,InnoQ的首席顾问Oliver Wolf在GOTO Berlin大会上开始自己的 ...

  9. Sql Server系列:索引设计原则及优化

    1. 索引设计原则 索引设计不合理或缺少索引都会对数据库的性能造成障碍,高效的索引对于获得良好的性能非常重要. 设计索引时的一些原则: ◊ 索引并不是越多越好,一个表中如果有大量的索引,不仅占用大量的 ...

  10. oop五大设计原则

    一:单一职责原则单一职责有2个含义,一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.减少类的耦合,提高类的复用性. 二:接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接 ...

随机推荐

  1. NSThread小笔记

    接口 Initializing an NSThread Object – init – initWithTarget:selector:object: Starting a Thread + deta ...

  2. 平时学习HTML5及其安全相关的一些站点资源

    http://www.w3.org/ -- HTML5一切标准都来自这里,如果你是发烧级HTML5患者,就读这个http://www.whatwg.org -- 和W3分分合合,最终共同指定HTML5 ...

  3. OpenGL学习之路(四)

    1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器 ...

  4. 使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是“ for 每一个”的意思,那 ...

  5. ios ViewController 页面跳转

    从一个Controller跳转到另一个Controller时,一般有以下2种: 1.利用UINavigationController,调用pushViewController,进行跳转:这种采用压栈和 ...

  6. C# winform 自定义控件

    近来因为项目的问题,开始研究winform自定义控件,这篇主要是将自定义控件的属性在属性编辑器中可编辑,如果你对自定义控件比较了解的,就不用继续往下看了 首先,我创建了一个类UserButton,继承 ...

  7. php5.2转向 PHP 5.3 的 PHP 开发

    PHP 5.3 开始,为了更好的向 PHP 的未来版本(PHP6) 过渡,将未来不再支持的函数标记为 DEPRECATED.在代码中使用这些函数,将毫不留情的在页面中显示警告信息:“使用了过时的函数… ...

  8. 我常用的VBS方法(QTP)

    这些是4年前在HP用QTP做自动化测试时候总结的一些,现在贴出来,说不准以后会不会用到 当初花了2天时间写的一个自动生成的Excel Report Public Function Report (st ...

  9. 将数字映射到字母上 .xml

    映射成 A1------A20               B1------B20               ...               Z1------Z20 这种形式   数字从0开始编 ...

  10. python 数字和字符串转换问题

    一.python中字符串转换成数字 (1)import string tt='555' ts=string.atoi(tt) ts即为tt转换成的数字 转换为浮点数 string.atof(tt) ( ...