架构思考

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

2019-12-23  本文已影响0人  narry

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

为什么要分层

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

三层架构

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

怎样才是好的分层设计

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

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这种分发的场景,往往我们可以通过如下方法来解决方法的透传调用:

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

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

总结

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

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

上一篇下一篇

猜你喜欢

热点阅读