UNIX编程艺术之“模块性”

     本章主要讨论模块划分、接口设计,提出了几个很重要的概念,包括紧凑性、正交性、自顶向下和自底向上的设计、SPOT原则、分层、插件化。下面就这几个概念,谈下我的理解,并在最后给出项目中模块设计的基本原则。

1. 紧凑性

紧凑性最优化的体现是,使用者无需手册和文档,即可放心的使用,而不用担心额外的影响,这便要求接口简洁、清晰,模块功能集中无冗余,体现了接口设计中“高内聚”的思想。

2.正交性

正交性主要的关注点是功能单一、无冗余,即不做“顺带”的事情,同时对一个模块的修改只影响这个模块,不会影响其它模块,这里也体现了软件设计中“低耦合”的思想。符合正交性原则的接口,对调用者而言接口统一,即使代码优化或重构,对上层调用者而言是透明的。正交性也体现了设计模式中“外观”的思想。

    3.自顶向下和自底向上

    自顶向下和自底向下是软件设计中常用的两个原则,二者的适用场景不同。

    自底向上适用于对系统下层设备、数据等的封装,给上层调用者提供统一的接口,比如一个系统需要操作数据,而数据可能存储在文件中也可能存储在数据库上,这时,自底向上基于数据的封装只需要提供给上层读写接口即可。

    自顶向下适用于对系统业务逻辑的分解,在对业务逻辑分析时,习惯的做法是把功能进行细分,划分出各个模块,而模块中的逻辑再进行细分加以实现。

    4.分层

    在软件或系统设计时,通常分为三层,数据层、逻辑层、应用层。数据层实现对数据的操作接口,通常使用自底向上进行封装;逻辑层实现对数据层逻辑操作的进一步封装,把通用的业务逻辑进行抽象封装从而避免代码多次重写;应用层实现经常进行调整的业务逻辑,应用层通过操作逻辑层的接口,可以快速实现客户需求,而无须过多关心底层实现的正确性,因为逻辑层的代码是相比稳定的。

    应用层和逻辑层的界限并不是很清晰,因为都是业务逻辑的实现,区别的原则就是同一段逻辑代码是否会多次被不同的调用者使用,如果是的话就应该考虑抽象出来放到逻辑层。因此应用层的实现是不稳定的,而逻辑层是相对稳定的。

5.SPOT原则

    SPOT原则的核心就是,一个模块只干一件事,而且同一件事只出现在一个模块中。切忌同一份代码在多处出现,以及不要进行代码拷贝,这样,如果一个模块的功能有调整的话,只修改一处就可以。这个原则是保证系统和项目长期稳定的关键。

6.插件

    插件指动态链接库,一种好的软件思想是提供给客户统一的入口,以及要求客户实现统一的接口,框架只需要动态加载链接库,调用接口即可。

    统过本章的学习,我总结在项目中,功能分解和封装的几个要点:

接口设计保证高内聚、低耦合,提供统一、可扩展的视图。

    相同功能保证只有一份代码,且一个模块只负现一个功能,不写异常或冗余的逻辑。

    采用三层结构,数据、逻辑、业务分离。

    关于三层结构,我再举例说明一下,比如一个网站,需要支持用户注册,而网站有时为了营销或推广的需要,在用户注册的时候,可能赠送用户一些虚拟的物品等做为刺激,同时,网站为了控制用户地增长,会制定一些策略对用户注册功能进行限制。

    基于以上功能,先考虑从顶向下设计,对应用功能进行细化,可以分解成几个子功能,包括:创建用户资料、判断用户注册资格以及赠送用户物品三个功能点。

    考虑从底向上设计,首先实现的功能点是“创建用户资料”,数据单元就是用户表,因此,我们需要对用户表进行封装,也就是实现“数据层”。数据层提供的接口就是增、删、查、改;再考虑逻辑层,对于用户注册而言,创建新用户的逻辑是相对稳定不变的,因此,逻辑层需要实现“创建用户”的接口,可能还需要实现“注销用户”的接口;依次可以实现对用户资格判断和赠送接口的封装。

    最后考虑应用层的实现,统过上面的分解,已经实现了逻辑层的接口,因此应用层实现便的十分简单,伪代码如下:

     if(RegNotLimited())

     {

           if (SUCC == CreateUser())

           {

                 SendGift();

           }

     }

    应用层的实现十分简单,同时,如果赠送活动改变策略,或者停止赠送,只需要修改SendGift接口即可;类似的,如果注册限制策略改变,也只需要修改RegNotLimited接口即可;同时,如果其它模块需要创建用户,只需要调用CreateUser接口即可,无需重新开发创建 用户的接口,也不需要进行代码拷贝。

    由此可见,采用这种分层和封装结构,代码的可维护性和灵活度高了很多,因此在项目设计和实现中,要时刻提醒自己,遵循上面的原则,实现稳定、灵活、可扩展性强及可维护的系统。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏社区的朋友们

点播文件防盗链二三事

视频点播为公司大部分流媒体和音视频相关的业务提供上传、存储和下载等需求。所有文件存储在相同的仓库,提供CDN下载服务的oc节点也是共用的,所以存在各个各样的盗链...

8610
来自专栏AI科技大本营的专栏

最新Python学习项目Top10!

【导读】过去一个月里,我们对近1000个Python 学习项目进行了排名,并挑选出热度前10的项目。这份清单涵盖了包括Web App, Geospatial D...

1452
来自专栏大前端开发

从编程小白到全栈开发:数据 (1)

有些事情时刻都在发生,但是我们通常很少意识到它们的存在。比如,当我们使用网页或移动应用的时候,其实在不断的产生着数据:注册一个网站或app的账号、发一条微博、写...

1053
来自专栏PPV课数据科学社区

【数据可视化专题】数据可视化:前端数据之美如何展示?

随着 web 技术的蓬勃发展,前端的展示、交互越来越复杂,在用户的访问、操作过程中产生了大量的数据。由此,前端的数据分析也变得尤为重要。当然,对于站长来说,你可...

59110
来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 1 Eclipse插件开发导盲

在真正接触eclipse插件开发一个月后,对插件的开发过程以及技术要求,也有了一定的了解。遥想之前像无头苍蝇一样乱撞乱学,真心觉得浪费了不少时间。这里就总结...

3979
来自专栏JAVA高级架构

日处理20亿数据,实时用户行为服务系统架构实践

携程实时用户行为服务作为基础服务,目前普遍应用在多个场景中,比如猜你喜欢(携程的推荐系统)、动态广告、用户画像、浏览历史等等。 以猜你喜欢为例,猜你喜欢为应...

1602
来自专栏PHP在线

高并发量网站解决方案

一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性 能的要求都很简单。随...

4918
来自专栏腾讯移动品质中心TMQ的专栏

腾讯TMQ在线沙龙回顾|EP(测试分析+分层自动化测试)实践

答:Hook英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应...

2352
来自专栏Golang语言社区

高并发解决方案——提升高并发量服务器性能解决思路

一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着...

58710
来自专栏高性能服务器开发

1 游戏服务器开发的基本体系与服务器端开发的一些建议

近年来,我身边的朋友有很多都从web转向了游戏开发。他们以前都没有做过游戏服务器开发,更谈不上什么经验,而从网上找的例子或游戏方面的知识,又是那么的少,那么的零...

6573

扫码关注云+社区

领取腾讯云代金券