---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. php最新出现的函数

    1. 数据过滤函数 filter_var:  filter_var — Filters a variable with a specified filter 过滤的类型有: Validate filt ...

  2. Ensemble Learning 之 Bagging 与 Random Forest

    Bagging 全称是 Boostrap Aggregation,是除 Boosting 之外另一种集成学习的方式,之前在已经介绍过关与 Ensemble Learning 的内容与评价标准,其中“多 ...

  3. [转] gc tips(3)

    原文地址:http://kevincao.com/2011/08/actionscript-garbage-collection-2/ 谈谈ActionScript垃圾回收(下) 前文我们介绍了GC的 ...

  4. Aviary 滤镜 教程 照片编辑器

    Aviary是一个国外的非常强大的照片编辑器,各种功能,但是是以静态库的形式存在的,不开源,但是很好用. 1.到官网上面下载sdk https://github.com/AviaryInc/Mobil ...

  5. 【转】Android端与Android端利用WIFI进行FTP通信

    原文网址:http://www.cnblogs.com/zhangkai5157/p/4303188.html 一.客户端通信工具类: import java.io.File; import java ...

  6. mac 下用 brew 安装mongodb

    转自:mac 下用 brew 安装mongodb 经过这位仁兄的文章指导,终于连上了mongodb. 启动mongo数据库,就是打开一个终端sudo mongod,然后打开另一个终端sudo mong ...

  7. JVM内存结构之三--持久代

    本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了. 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令. ...

  8. Windows下配置使用WinPcap

     0.前提 windows: win7 x64 WinPcap版本:4.1.3 WinPcap开发包:4.1.2 目标:在VS2010中配置使用winpcap 获取目标计算机中安装的网卡列表  1.下 ...

  9. 图Graph

    存储结构: 1.邻接矩阵存储 typedef struct { char vex[MAXVEX];//顶点数 int arc[MAXVEX][MAXVEX];//邻接矩阵 int numVextexe ...

  10. Window nginx+tomcat+https部署方案 支持ios9

    客户端和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接. 下面是详细的配置(Nginx 端口 80/443,Tomc ...