我的架构经验系列文章 - 后端架构 - 设计层面

简介: 回到索引 http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html   设计层面:   分层架构 分层架构是项目设计中很重要的一点,从根本的目的上来说就是为了职责的分离。

回到索引 http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html

 

设计层面:

 

  • 分层架构

分层架构是项目设计中很重要的一点,从根本的目的上来说就是为了职责的分离。最经典的三层架构,到四层五层六层,甚至有人开玩笑说十八层的分层,根据项目的需要可以分不同的层。这里说的层其实是逻辑层,从物理层的角度来说也有三层、四层五层的分层架构。之所以三层架构这么流行是因为它的分层把大的关注点进行了分离,层数恰到好处,表现层、业务逻辑层和数据访问层,分别处理面向用户呈现的、面向逻辑处理的和面向数据库存取数据的三大关注点。

  1. 在分层架构中除了分层之外还需要对每一层都提取出自己需要的模型,比如表现层的视图模型、业务逻辑层的业务模型或领域模型以及数据访问层的实体,当然如果还有服务层的话还有服务层的契约或数据传输对象。带来的一个问题就是这些实体或模型之间怎么进行转换,当然最简单可靠的办法就是手写代码进行赋值,如果对象中的字段属性超过10个的话就会让人崩溃,因此现在有很多映射Mapper类库可以用来实现各个不同模型之间的转换。
  2. 分层分的好不好直接影响了系统代码的清晰性和可读性。有的人会问,我使用了三层结构无非就是上层调用下层,改了数据库字段的话还要同时改三层这是多麻烦的事情啊?其实之所以会有这样的疑问是因为:首先,你的项目不够大,或者说逻辑实在是太简单了,导致你的代码中就是上下级的调用。其次,即使你把所有的代码都混在了一起,改了数据库的字段也是需要修改SQL语句的也是需要修改参数校验规则的也是需要修改界面来多呈现这个字段的,其实要改的东西没有少改只不过代码都混在了一起,觉得好像改的地方不多罢了。第三,修改数据库字段这种操作其实对于一个稳定的系统来说不会经常发生,往往我们会改界面会改逻辑,这样的话如果有分层我们只需要修改相应层的代码就可以了,如果每一层是单独分程序集或分jar包编译的话,那么我们甚至只用进行组件的替换。
  3. 虽然说三层架构很简单,但是要真正落实三层架构的分离理念其实不是这么容易的。举一个例子,同样是对字段判断必须是数字的这个操作,应该在表现层写还是业务逻辑层写还是数据库层写?我们要明确,每一层都只是做自己层职责上的事情,不应该去越权,并且要做的事情一定要做好。首先这个判断每一层都要进行,表现层脚本和代码验证,履行好表现层的职责,业务逻辑层也不能因为表现层验证了就不验证,业务逻辑层不关心表现层做了什么,参数不符合类型就提出了,同样数据访问层对于数字类型的参数就要确保是数字类型的确保在为参数设置了正确的类型。心理很清楚每一个层需要负责的事情,也要很清楚每一层只关心自己的事情,这样就能把正确的代码写在正确的位置了。

 

  • 高内聚低耦合

高内聚低耦合是一个很重要的设计理念,其实这个理念大家都知道但是怎么样能让这个理念在代码中落实?我觉得可以抓住下面几个原则,这几个原则始终记在脑子里面即可:

  1. 任何一个方法都检查一遍是不是只做了一件事情。如果一段代码又在做界面展现,又有SQL语句,或是又在处理员工的工资又在处理员工的考勤,那么往往表示这段代码做了过多不是自己的事情了。它或许应该分成两个方法,甚至是不同类型的两个方法。
  2. 任何一个类型都检查是不是只做了一件事情。这是非常重要的一个检查,如果一个类型做了太多的事情,很明显你没有对类型的职责进行一个明确的划分(当然这个类型就是来负责协调的作为门面类型例外),请检查类中的所有功能是不是符合类名,如果一个类型叫做NetworkingAdapter而其中有处理XML的代码的话显然不合适,是否应该使用其它继承的类型来处理XML,或者是使用类似于策略模式来处理不同的数据?
  3. 任何一段代码都检查是不是只在一个地方出现。这也是非常重要的一个检查,往往我们可以用这一条金标准来做重构。如果一段代码在多处出现要么这是一段和业务无关的代码,可以AOP解决,要么就有大问题了,一段相同的业务逻辑在多个地方出现,一旦业务逻辑有改有多少人知道要改两个甚至更多的地方,很明显应该把代码提取出来封装在一个地方。
  4. 任何一个类型都检查是不是依赖过多的类型。除非是门面类型否则一个类型应该不会依赖过多的类型,暂且不说类型的依赖可以通过IOC来解决,如果一个类型依赖了过多的类型,它就会和其它类型进行比较多的强耦合。可以考虑使用门面模式来梳理类型之间的关系,尽量减少和太多的类型之间发生关联。
  5. 如果一个类型都检查是不是依赖的类型也同样依赖自己。如果产生这种双向依赖的话,建议使用中间人来处理两个类型之间的依赖,不要让两个类型相互调用相互依赖。在有的时候我们可以考虑类型A把数据写到一个地方,类型B从这个中间点去获取数据然后进行处理处理后还是把结果存在这个中间点,类型A再从这个中间点获取结果。这样的话A和B其实没有很强的依赖,大家都依赖中间点获取结果,即使把B替换成C只要它最终输出的东西是大同小异的那么A就不需要修改。

 

  • 设计模式

所有的设计模式其实都是前人在大量的编程实践后总结出来的,每一个模式都有适用的地方,每一个模式都是解决一个问题的,因此针对设计模式我的建议如下:

  1. 应该对每一个设计模式都了解,然后你自然可以想到在合适的时候使用合适的模式。
  2. 不要去滥用设计模式,好的设计模式可以增强代码的高内聚低耦合也可以让代码对扩展友好,但设计模式滥用可能会导致代码的性能问题以及不必要的编码。
  3. 作为开发gof的设计模式应该熟读,只是读还不够,自己想办法去在今后的编码过程中体会应用设计模式,如果一个设计模式没用那么他就在书上,如果用了那么他就在你脑子里。

 

  • 面向对象

面向对象的三大要素许多人也是熟读在心了,但是个人认为要彻底明白面向对象三大要素是需要大量OO实践积累的。对于过程式的开发其实是结果导向的,这比较容易理解。但OO开发其实是维护导向的,通过OOD后开发出来的代码是比较容易进行扩展的,也是可以支撑复杂业务的。对一套好的OO代码进行扩展可能门槛会比较高,因为每一个对象都有自己的职责,需要理清楚对象之间的关系,一旦入手了就会发现非常爽的感觉。可以大量利用系统内已经实现的类型,如果继承和重写实现自己的需求,然后还可以通过实现接口把自己的实现插到原有的OO体系中去,也就是可能只需要几行代码就可以对系统进行改造。对于没有OO的代码改造上手不一定很困难,因为代码很直白,但是一旦进行几十次改造之后代码就没有可维护行了,因为所有的代码都交织在一起,而且会有大量的硬编码(面向结果的代码特点就是可能从上到下很多地方都可以改,而且可以实现相同的效果,一旦这么做了可能就会导致原来的逻辑被破坏,代码可维护性降低)。对于OO的学习我的体会是:

  1. 可以从设计模式入手,设计模式是OO的一个总结,学习了设计模式有助于理解OO的三大理念。
  2. 可以多阅读优秀的框架或类库的代码,优秀的开源框架一定是对扩展友好的,因此它的设计往往是非常OO的,通过阅读改造开源代码可以提升OOD的能力。
  3. 多重构多思考,根据上面提到的高内聚低耦合中说的那些问题想办法去重构代码,你会发现很多优化只能通过OO的手段进行,思考重构然后再重构来进步。

 

 

作者: lovecindywang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
6天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
2天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
3天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
21 2
|
7天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
43 4
|
12天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
7天前
|
设计模式 人工智能 API
后端开发中的微服务架构实践与挑战#### 一、
本文将深入浅出地探讨微服务架构在后端开发中的应用实践,分析其带来的优势与面临的挑战。通过具体案例,展示如何有效地构建、部署和管理微服务,旨在为读者提供一份实用的微服务架构实施指南。 #### 二、
|
8天前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
20 0
|
12天前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
44 0
|
4天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
2天前
|
存储 关系型数据库 Java
探索后端开发:从基础到进阶
【10月更文挑战第33天】在这篇文章中,我们将深入探讨后端开发的各个方面,包括基本概念、关键技术和最佳实践。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。我们将通过代码示例来展示一些常见任务的实现方法,并分享一些实用的技巧和策略,帮助你提高后端开发的效率和质量。无论你是想学习新的编程语言还是想了解最新的后端技术趋势,这篇文章都会为你提供有益的指导和灵感。让我们一起开启后端开发的探索之旅吧!