C和设计原则
---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和设计原则的更多相关文章
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
- SOLID 设计原则
SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- AngularJS_01之基础概述、设计原则及MVC设计模式
1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- SOA 实现:服务设计原则
http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...
- Apple、Google、Microsoft的用户体验设计原则
轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...
- GOTO Berlin: Web API设计原则
在邮件列表和讨论区中有很多与REST和Web API相关的讨论,下面仅是我个人对这些问题的一些见解,并没有绝对的真理,InnoQ的首席顾问Oliver Wolf在GOTO Berlin大会上开始自己的 ...
- Sql Server系列:索引设计原则及优化
1. 索引设计原则 索引设计不合理或缺少索引都会对数据库的性能造成障碍,高效的索引对于获得良好的性能非常重要. 设计索引时的一些原则: ◊ 索引并不是越多越好,一个表中如果有大量的索引,不仅占用大量的 ...
- oop五大设计原则
一:单一职责原则单一职责有2个含义,一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.减少类的耦合,提高类的复用性. 二:接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接 ...
随机推荐
- Python [Leetcode 345]Reverse Vowels of a String
题目描述: Write a function that takes a string as input and reverse only the vowels of a string. Example ...
- 使用crs_setperm修改RAC资源的所有者及权限
Oracle RAC 集群中,对于各种资源的管理,也存在所有者与权限的问题.crs_getperm与crs_setperm则是这样的一对命令,主要用于查看与修改集群中resource的owner,gr ...
- 将数据库中的表注册到K2服务中,并封装为Smart Object
转:http://www.cnblogs.com/dannyli/archive/2011/08/15/2139550.html K2 blackpearl项目中经常需要将其他数据中的表注册到K2服务 ...
- android 深入研究ratingbar自定义
http://blog.csdn.net/rain_butterfly/article/details/22892879
- 运行Python2.x程序报编码错误的解决办法-UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 7: ordina not in range(128)[0m
Python编码问题的终极解决方案:在python的Lib\site-packages文件夹下新建一个sitecustomize.py文件,输入: import sys sys.setdefaulte ...
- 多态.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- python中pip的安装
1.下载路径如下 https://pypi.python.org/simple/ 在其中查找到pip的安装包:然后找到路径 https://pypi.python.org/simple/pip/ 2. ...
- hadoop是什么?
在如今这个信息高速发展的今天,hadoop也越来越火了,那么到底是什么原因让hadoop如此的火,接下来新霸哥将详细的为了介绍,并让你快速的任何hadoop是什么? hadoop思想起源:Google ...
- remoting blazeds 实施步骤
remoting 实施步骤 1.创建 --web project 和 -- Flex project 2.在web project 下创建 -- com.HelloRemoting: package ...
- proguard 混淆android代码
官网 http://proguard.sourceforge.net/#manual/examples.html android 2.3后,新建的project默认就有一个project.proper ...