通常我们所谓的程序设计,其实包含编码与设计两个部分,编码行为一般为人们所熟知,被称为coding,然而设计过程却容易为大家所忽视。
设计的作用
日常生活中优秀的设计产品很容易被人所铭记。iPhone就是一个经典的设计案例。当人们还在使用复杂的布满按键的小屏幕Nokia手机的时候,苹果用一款简洁的设计征服了用户的心。
手机本质上是人们完成日常办公的工具,大家之所以热爱iPhone,是由于iPhone的设计让使用者更加的方便,更加的高效。
现在的程序系统日趋庞大和复杂,程序员们通常用类似搭积木的方式完成更高级功能的开发,我们所编写的每一段程序都可能是另一端代码实现其功能的工具。
设计优秀的程序,会让使用它的人事半功倍,而设计糟糕的程序往往会让使用者手忙脚乱,摸不着头脑。
以下是W3C标准委员会设计的文档对象模型(DOM)中早期用来访问元素的一些API。最后的代码动态的创建了一个div元素,设置样式属性,并把它追加到了页面文档中
光是复杂而冗长的命名就足以令人生畏,我们再看看一款优秀的前端框架jQuery的API设计
同样的功能,是不是简单易懂的多。
设计的层级
优秀的设计通常并不能一蹴而就,需要精细的思考。有一个合理的思维过程更有助于我们做出良好的设计决策。这就是设计的层级。大胡子习惯把它分成以下几个部分:
需求
在需求阶段,我们需要明确程序要解决的问题和使用场景。最好的办法是尽早开始使用你的程序,甚至在他们还没有被设计出来之前。比如:“测试驱动” 就是一个比较不错的办法。
结构
在结构设计阶段,我们会设计出程序需要哪些信息、分为哪些模块以及如何组织他们。其中比较有帮助的两个工具是:
- 信息架构分析
- 领域模型
信息架构模型有助于帮你分析出你的程序需要获取那些类型信息,需要什么样的功能,如何表达。
以一个IO库的设计为例分析信息架构
领域模型有助于你更好的组织你的程序模块
领域模型的例子
接口
在接口设计阶段,我们则需要更加具体的明确我们接口的定义:即命名,参数、返回值、调用流程等。
其中值得注意的点是:
- 命名是否足够清晰,容易理解和记忆。
- 参数应该以合理而一致的顺序组织,便于记忆和了解。
- 返回值是否传达了足够的信息。
- 调用流程是否合理,能否简化。
在这个例子里 string.h 中 strcopy 和 bcopy 就是糟糕的例子,不看文档很难记住参数的顺序,而java的Collections和concurrent包里的设计则要好的多
链式调用可以很好的解决复杂的调用流程,尤其是在IDE工具的支持下,我们几乎可以不用看文档就可以完成大段代码的编写。
非链式调用
链式调用
总体的原则就是:
- 容易学习
- 自说明,甚至不需要文档就可以使用
- 防呆设计,很难出错
- 容易维护和扩展
实现
在实现阶段更多的是算法与具体逻辑的选择,更多的就是大家所熟知的coding过程了,可能需要根据性能考虑一些设计方案的取舍。不在赘述。
小结
设计优秀的程序对于公司来说是一笔价值连城的资产,对于程序员自身来说就如同给深处地狱的我们送上一杯清凉的冰水。以上是大胡子对于程序设计方面的一些思考,希望能够帮助到大家。