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

设计层面:

  • 分层架构

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

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

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

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

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

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

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

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

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

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

框架层面: SOA 在这一篇中会逐个介绍一下自己对这些XXX的理解,其实每一个理念都不是莫名其妙产生的而是有产生背景的,这些时髦的名词不是用来炫耀的,而是真正要理解它们是干什么的,并且框架千万不能乱用理念也千万不能乱用,并不是把所有的这些都用上你的系统才是一个牛逼的系统,一定要适合才是最好的,并且要保持简单可靠的原则.所谓SOA,字面上来说是面向服务的架构.有的人不说SOA其实他已经SOA了,有的人大谈SOA但其实只是在用Web服务,SOA可大可小.你可以认为服务调用就是SOA了,也可以认为服务

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

架构层面: 日志集中 所谓日志集中就是把程序的所有日志和异常信息的记录都汇总到一起,在只有一台服务器的时候我们记录本地文件问题也不是最大,但是在负载均衡环境下再记录本地日志的话就出现问题了.在想查看网站日志的时候到哪台机器去查都不知道,难道有100台机器就100台机器逐一远程连上去看?因此,把这些数据汇总在一起保存对于大型网站系统来说是很必要的,这样我们就可以直接进行查看.搜索,也很明确可以知道是哪台机器的业务出了问题.至于这种日志数据是写到RDBMS还是NOSQL甚至是搜索引擎这就看需要了,总

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

系统层面: 高可用性 所谓高可用性也就是通过避免单独故障加上快速故障转移实现一旦某台物理服务器出现故障能实现故障快速恢复.一般来说,可以采用两种方式,如果可以做业务可以做负载均衡则通过负载均衡实现集群,然后针对每一台服务器进行监控,一旦发生故障则从集群中移除:如果业务只能有单点入口那么可以通过实现Standby机加上虚拟IP机制,实现Active机在出现故障之后虚拟IP转移到Standby的快速故障转移.一般可以使用KeepAlived或HeartBeat实现高可用(当然,硬件手段实现也可以,这

我的架构经验系列文章 - 后端架构 - 性能层面

性能层面: 性能分析 我觉得性能分析的话要注意几个要点: 不要去猜:对于自己写的代码你是否知道你的代码要执行多久,是不是还在用时间相减来测试代码执行时间?现在有很多自动化的工具可以在程序运行的时候,测试代码中每一句语句的执行时间,可以有效分析出代码的性能瓶颈.对于比较重要的业务逻辑建议采用类似的工具来进行性能分析,有的时候性能慢的代码不一定是自己写的还可能是框架内提供的,如果没有一个丰富的编码经验是不太可能知道这些点的,但是通过这样的分析工具你就能知道这个地方会慢,虽然框架的代码我们不能改,但是

我的架构经验系列文章 - 后端架构 - 语言层面

语言层面: 运行时元数据获取 所谓运行时元数据获取也就是在程序 运行的时候通过代码动态 获得类型.方法.属性的信息,然后可以动态获得属性的值,执行方法等等,在有的语言中称为反射.反射不一定是高效的,但是在写框架程序的时候反射是一种很有用的技术 ,并且反射的性能开销往往是可以通过诸如缓存等手段来最小化的.比如在ORM中,根据实体类的信息动态获得所有的属性,然后取得其值,生成要到数据库 中执行的SQL语句.理解反射熟练掌握反射的使用以及性能优化是编写框架类代码很重要的一点. 错误处理 任何后端语言都

我的架构经验系列文章 - 后端架构 - 安全层面

安全层面: SQL注入 SQL注入是一个古老的安全问题,现在任何程序都不应该再出现这样的问题了,其原理非常简单,在过去大多数程序都是直肠子通数据库的,因此如果拼接SQL并且在参数上没有做好过滤或者没有使用参数形式来生成SQL语句的话可能会导致用户在页面上输入的恶意代码直接在数据库中执行.SQL注入的危害点在于整个网站有1000个数据点,如果其中有1个点有漏洞那么整站的数据其实都有危险了,很多开发会注重资金相关的模块但是忽略新闻相关的模块,如果都是使用一套数据库的话那么一个不重要模块的漏洞就会影响

我的架构经验系列文章 - 前端架构

框架层面:近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越来越多框架性的东西出现了.越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情. MVC MVC实现职责分离是很好的,大多数网站在后端都会引入MVC框架,对于一个前端负责所有呈现和前端业务逻

mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)

一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/redhat-release 操作系统用户名和密码 root  js*2015 IP地址 172.168.18.201 ip addr 网关Gateway 172.168.18.1 cat /etc/sysconfig/network-scripts DNS 172.168.16.11 mysql 版本

NET架构设计、框架设计系列文章总结

NET架构设计.框架设计系列文章总结 从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以在发挥点价值作用. 架构设计: ElasticSearch大数据分布式弹性搜索引擎使用 (推荐) DDD实施经验分享-价值导向.从上往下进行(圈内第一个吃螃蟹DDD实施方案)(推荐) 软件工程-思考项目开发那些事(一)(推荐) SOA架构设计经验分享-架构.职责