分类 技术志 下的文章

经典设计原则背后的本质

近一段时间重读了一些经典书籍,诸如《敏捷软件开发:原则、模式与实践》、 《程序员修炼之道》、《Unix编程艺术》等。这些书中关于如何衡量或评价一个类或函数设计好坏的几个原则(Principle)让人印象深刻。《敏捷软件开发》中谈到了SRPOCPDIP; 程序员修炼之道则以DRY、“正交性”为话题展开;《Unix编程艺术》围绕紧凑性、SPOT、分离等阐述作者立场。这么多经典原则,如何学习把握?我们不妨来挖掘一下这些新设计原则背后的本质。

追本溯源,从计算机编程语言的发展历史来看,成熟的结构化程序设计语言(如C语言、Pascal等)要先于成熟的OO设计语言(C++、Java等)出现,那么其成熟的设计理论显然也是要早于后者的。这里就不能不提到经典结构化设计的代表作:《Structured Design: Fundamentals of a Discipline of Computer Program and System
Design
》,这本书出于1975年(年份来自维基百科,Amazon上卖的是1979年版)。说实话我也没有看过此书原版,不过书中的内容和思想早已被其他后继书籍引用和借鉴,我们在市面上能看到的关于结构化设计方面的书籍,尤其是中文书籍,多照搬了此书内容和思想,所以也算是间接学习到了。

书中对抽象、模块化、信息隐藏(黑盒)作了阐述,并介绍了数据流/控制流图、结构图等设计方法。特别是书中关于内聚(Cohesion)与耦合( Coupling)的讲解对之后的程序设计评价方法影响至深。我们一直常说高内聚低耦合的模块是良好的设计,这里的内聚和耦合概念的提出者恰是这本书的作者Larry L.Constantine。内聚和耦合这两个概念是用来评价一个module设计好坏的。module一词中文意为“模块”,模块一词的范围让人很难界定,关于module这个概念,书中给出了这样的解释:"A module is a lexically contiguous sequence of program statements, bounded by boundary elements, having an aggregate identifier.  Another way of saying this is that a module is a bounded, contiguous group of statements having a single name by which it can be referred to as a unit." 显然类或子程序(函数)是符合module的定义的。用内聚和耦合来评价类或子程序(函数)的设计是适合的。

关于Cohesion(CC2e 7.2小节)和Coupling(CC2e 5.3小节)的具体内容,这里就不细说了,《代码大全2》作者说的肯定比我好多了,另外维基百科中对coupling和cohesion的描述也很详尽。

以上所说的内聚和耦合其实就是我认为的以上诸多经典设计原则背后本质的东西。诸多设计原则应该可以看作是耦合和内聚概念在不同语言范式上下文情境下的延伸、再包装或升华。虽然有些原则说法发生变化了,但是本质却是一样的。比如: 单一职责原则(Single Responsibilty Principle, SRP) 显然是"功能内聚(Functional cohesion)"的另一种表述; 有些原则虽然无法直接与内聚耦合概念进行直接对号,比如依赖倒置原则(Dependency Inversion Principle,DIP),但是可以理解成追求低耦合的一种设计技法!

把握好内聚和耦合的核心理念,你将以不变应万变,你也会更深刻理解诸如OCP、DIP等新原则了。

俗话说“物以类聚”,这句同样适用于程序设计!一个module的设计如果有一处优点,那常常这个module也具备其他优点; 反之,如果发现这个module设计的一个缺点,那么离发现其他缺点也就不远了。

内聚与耦合的概念不仅仅适用于程序设计领域,在所有其他设计领域似乎同样普适!考虑对比一下一个具备电加热除霜功能的后视镜与一个普通后视镜在设计层面上的优点与不足吧!

发觉题目似乎有些夸张^_^。

使用Ubuntu文档模板

每次安装Ubuntu后,主文件夹(你的$HOME目录)下都会默认建立起一些目录,诸如:下载、音乐、图片等,这些目录的用途通过其名字都可以猜个八九不离十,只有一个叫作“模板”的目录一直让我摸不到头脑。直到这次彻底迁移到Ubuntu,我才发现这个“模板”目录的妙用!

平时工作中常常需要新建一些文档,以前用Windows时都会使用右键菜单,点击“新建”,然后选择不同的文档类型。但在Ubuntu上却发现右键快捷菜单中“创建文档”的二级菜单项中默认只有"空文件”这一种文档类型,这显然不能满足我的需求!

在网上Google如何将更多文档类型添加到右键快捷菜单中。首先得到的答复是:Ubuntu Tweak可以做到。

启动Ubuntu Tweak,选择“个人设定”-> "管理模板“。这里有一堆"未启用的模板",诸如.odt、.ods、Html文档等模板类型,你可以把你需要的模板拖到左侧”已启用模板“列表中。选择完后,你在右键菜单“创建文档”中就可以看到这些类型的文档模板了。

不过如何添加Ubuntu Tweak里没有包含的文档模板类型呢?继续Google!在Ubuntu中文论坛上我找到了最终答案:将你期望的文档模板放入“模板”文件夹即可。恍然大悟,原来“模板”目录的用途是这样的啊。

打开$HOME目录下的模板文件夹,发现刚刚使用Ubuntu Tweak拖拽过来的文档模板都存放在这里。把一个word_template.doc的Ms Word文件作为文档模板放入此文件夹,打开右键菜单,果然看到了"word_template.doc"的菜单项。点击该菜单项,一个新doc文件就创建成功了,其实Ubuntu就是将“模板”目录下的word_template.doc文档模板复制了一份供你使用。

这种灵活性让人大呼过瘾!因为你完全可以将自己定制的文档模板放入右键菜单中!比如:公司一般都有很多办公或设计的模板文件,需要时要么在本机找到这些模板文件Copy一份,要么到公司办公网络上下载一份新的。这样一来很多人(包括我^_^)常因无法找到存储模板文件的位置或记不住下载地址而浪费了很多时间!使用Ubuntu文档模板后你只需要将文档模板放入“模板”目录,下次你就可以通过右键菜单创建新文档了!如果你是C程序员,你也可以将一份定制好的.h或.c或Makefile文件放到右键菜单中。如果你的公司模板文件太多,都放在“模板”目录下会导致右键菜单显示过长,你可以通过在“模板”目录下建立分类子目录来解决这个问题。这些子目录也将出现在右键菜单中,并可级联打开下一级菜单,显示子目录下的文档模板列表。如此灵活的功能是Windows所无法提供的(起码我目前还不知道Windows中有类似功能^_^)。

这里顺便将近期使用Ubuntu时学到的一些技巧叨咕叨咕:
* 关于Ubuntu剪切板
与Windows上全局一个剪切板不同的是,Ubuntu上提供两个剪切板:一个叫Primary clipboard,通过标准的Ctrl+v(终端用Ctrl+Shift+c)/Ctrl+v复制和粘贴。而另外一个是Selection Clipboard,顾名思义,选择即复制,鼠标中键粘贴。遗憾的是这两个剪切板居然不能混合使用。Primary Clipboard的内容无法通过敲击鼠标中键粘贴,反之亦然。安装Parcellite(GTK+剪切板管理器)可以在一定程度上解决这个问题。安装后,在其"首选项"配置中将以下三项均选上:
    -> Use Copy (Ctrl-C)
    -> Use Primary (Selection)
    -> Sync clipboards
这样两个剪切板的内容就可以共享了,即通过选择复制的内容,可以使用Ctrl+v粘贴了。

* apt-get代理设置
在单位通过公司代理上网,使用Ubuntu 9.04的时候,只需在.bashrc中配置http_proxy环境变量即可,apt-get可以顺利连接到Internet。但是换了Ubuntu 10.04后,http_proxy即使设置了,apt-get也无法连接到Internet。这个问题曾经一度无解,直到近期才找到答案:通过配置/etc/apt/apt.conf(若无此文件,则新建)达到为apt-get设置代理的目的。在apt.conf中添加如下一行:
Acquire::http::Proxy "http://user:pass@server:port";

* Gconf-editor
Ubuntu下也有一个类似注册表编辑器的工具:gconf-editor,用来对Gnome桌面环境和相关应用配置。其设置项目甚多,目前了解不多,这里就不深叨咕了^_^。

后记:短短两周的时间,部门内部已经相继有三位同事在各自的电脑中安装了Ubuntu 10.04,看来Ubuntu的魅力还是"不可小觑"的^_^。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats