架构思考:如何做好分层设计

  在进行程序开发和设计时我们常常提到分层的概念,但是怎么样的分层才是好的分层呢,在这篇我谈谈我在如何分层这个问题上的一些体会,和大家探讨一下

为什么要分层

  系统要分层主要我觉得主要是有两个原因:

  • 存在着不同的利益相关者,有着不同的关注点
  • 软件中的不同的部分,有不同的变化频率
三层架构

  上图是一个常用的三层架构,其中,用户界面层面向用户,变化频率高;业务界面层面向业务,变化频率相对较低;数据库访问层面向基础设施,变化频率低。这样的分层带来有效地隔离了业务逻辑与数据访问逻辑,使得这两个不同关注点能够相对自由和独立地演化

怎样才是好的分层设计

  分层能降低软件设计和开发复杂度,但是不恰当的分层却会导致软件的复杂度的提升,那不好的分层有一个基本的特征就是:相邻的分层间在功能上很相似,增加的层次没有系统带来明显的能力,常常表现为方法透传,及新增加的层次仅仅做了很少的事情,及将相关请求发送到了下层去进行处理,如下面的代码所示:

public class AnimalServiceImpl implements AnimalService {
   
   private static Logger logger = LoggerFactory.getLogger(AnimalServiceImpl.class);

   @Inject
   private AnimalDao animalDao;

   @Override
   public Animal queryById(long id) {
       return animalDao.query();
   }

   @Override
   public boolean update(Animal animal) {
       return animalDao.update(animal);
   }
   
   @Override
   public long insert(Animal animal) {
       return animalDao.insert(animal);
   }
   ........
}

   这种分层方式在我们的日常编码中经常遇到,服务层仅仅是将用户界面的调用传递给数据库访问层,仅仅是方法和参数的透传,这种透传带来的最大的问题就是这种分层没有为软件带来任何的价值,如果这个层次中都充斥着这样的代码,这个层次与其相邻的层次很相似,一般会把这个分层认为是一种架构的坏味道

如何做到好的分层设计

  说到分层,我们一般都会提到iso网络的七层模型,如下图:
ISO网络模型

  从上图中大家可以看到这七层模型中,每一层都其特定的功能,可以说是功能和其提供的价值都是极为明确的,所以如何能做好分层,就是要使每分离出来的层次都有明确的功能和价值

做好分层需要避免方法的透传

  方法的透传在大多数场景下,都有一种没有增加价值,反而增加了坏复杂性的坏味道,除了向dispatch这种分发的场景,往往我们可以通过如下方法来解决方法的透传调用:

  • 直接调用方法的最终提供者,这个有时会破坏层次之间的划分,需要综合考虑
  • 将涉及的函数功能做重新的分布,对此功能所处的层次就行重新的考虑
  • 进行层次的合并,考虑是否层次的划分出现的问题

      在java中,I/O 处理的这套的架构体系遭到的批判是很多的,在I/O 处理中,java使用的装饰模式,实现了方法的透传调用,虽然在每个装饰层次中也提供了一些能力,如:buffer,但是提供的功能相对较少,并且在IO中,提供buffer的能力应该是绝大部分场景都需要的,所以我们对其进行功能的合并,而不是单独的将其功能实现在不同的层次中,增加了整个系统的复杂性
    java IO

做好分层需要避免调用参数的透传

  调用参数在各个层次的透传,会导致一些层次的接口需要了解不是其层次应该处理的知识,这样就会导致增加系统不必要的复杂性,一般来说们可以通过如下方法来解决函数的透传:

  • 使用全局变量,这样每个层次都可以访问到这些参数,避免了参数在各个层次的透传
  • 使用context来传递参数,context通过参数在各个层次中传递,每个层次只需要访问自己所需要的,不会引入不必要的复杂性

总结

  做好分层,我们需要思考各个层次的功能和价值,就像 Robert C.Martin提出的尖叫架构一样,我们也需要尖叫的分层

注:相关图片来自于互联网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容