前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNIX编程艺术之“模块性”

UNIX编程艺术之“模块性”

作者头像
王亚昌
发布2018-08-03 15:48:51
6430
发布2018-08-03 15:48:51
举报
文章被收录于专栏:王亚昌的专栏王亚昌的专栏

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

1. 紧凑性

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

2.正交性

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

    3.自顶向下和自底向上

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

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

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

    4.分层

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

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

5.SPOT原则

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

6.插件

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

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

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

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

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

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

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

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

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

     if(RegNotLimited())

     {

           if (SUCC == CreateUser())

           {

                 SendGift();

           }

     }

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年07月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档