架构设计和代码开发中的常用原则
Posted 码农小助手
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了架构设计和代码开发中的常用原则相关的知识,希望对你有一定的参考价值。
与你一起成长
一、常用的原则
系统依赖转换为数据依赖;
接口依赖,通过底层定义SPI,业务层实现,这种做法其实是不得已为之,同时,我们在设计过程中还是尽可能避免走这条路;
通过事件机制解耦依赖。
优先使用编程式事务:为了更好的控制事务,一般要求使用编程式事务,避免潜在的跨事务问题。
事务更新需要保证顺序一致性:强一致要求还是最终一致,强一致是否会涉及到跨库,事务操作时需要相同记录的更新顺序保证一致。
事务中不进行远程调用。
数据存储安全:敏感数据加密、日志输出脱敏。
数据传输安全:包括加密、传输通道规范,最少字段传输(够用原则),尤其是我们金融部门,需要将数据输出给到外部第三方机构情况比较多,这块上面会控制比较严格。
数据输出展示:前端展示需要防止水平越权,另外,前端的展示可以埋点和方便数据采集。
可核对和可监控:上下游系统的数据模型核对关联关系简单、稳定(具备通用性,和产品无关)。
可熔断:对关键资损链路需要做到可熔断。
悲观锁:代码编码规范——一锁二查三更新。
乐观锁:必须在事务内更新。
区分系统调用错误和业务失败:远程调用失败,不代表下游系统没有接收请求,更不能做为业务失败依据,需要严格区分系统调用错误和业务失败。
可重试:任何一行代码执行时都有可能因系统重启而中断,所以需要支持可重试。
异步处理必须增加核对:最终一致性离不开恢复重试策略,也需要有系统间数据核对用于及时发现数据不一致,同时在核对时需要增加处理时效的监控,及时发现长时间未处理成功的数据。
二、分层架构设计中遵循的原则
最关键的,UI层只能作为一个外壳,不能包含任何业务逻辑(BizLogic)的处理过程;
设计时应该从BLL出发,而不是UI出发. BLL层在API上应该实现所有BizLogic,以面向对象的方式;
不管数据层是一个简单的SqlHelper也好,还是带有Mapping过的Classes也好,应该在一定的抽象程度上做到系统无关;
不管使用COM+(Enterprise Service),还是Remoting,还是WebService之类的远程对象技术,不管部署的时候是不是真的分别部署到不同的服务器上,最起码在设计的时候要做这样的考虑,更远的,还得考虑多台服务器通过负载均衡作集群。
三、代码设计六大原则
单一职责
一个类或者一个接口,最好只负责一项职责。
开闭原则
一个软件实体如类、模版和函数应该对扩展,对修改关闭;
里氏替换原则
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
* 子类可以增加自己特有的方法;
* 当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更佳宽松;
* 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更加严格;
依赖倒置原则
低层模块尽量都要有抽象类或者接口,或者两者都有;
* 变量的声明类型尽量是抽象类或者接口;
* 使用继承时遵循里氏替换原则;
接口隔离原则
* 一个接口只服务于一个子模块或业务逻辑,服务定制;
* 通过业务逻辑压缩接口中的public方法,让接口看起来更加精悍;
* 已经被污染的接口,尽量修改,如果变更风险太大,则用适配器模式进行转化;
* 根据具体的业务,深入了解逻辑,用心感知去控制设计思路;
迪米特原则
定义:一个对象应该对其他对象保持最少的了解,其核心精神就是:不和陌生人说话,通俗之意就是一个对象对自己需要耦合关联调用的类应该知道的少;这会导致类之间的耦合度降低,每个类都尽量减少对其他类的依赖。
四、分层架构
核心点:
单向依赖,一层只依赖一层,不跨层
抽象隔离,分的越开越好,哪怕是异地
好处:
代码结构清晰易于理解
代码复杂度降低,容易理解和开发
层间隔离,利于排查问题
后期的维护升级方便而简单
每一层都可以独立测试,其他层的接口通过模拟解决
不同技能的程序员可以分工,负责不同的层
天然适合大多数软件公司的组织架构
抽象逻辑复用起来简单
五、API相关设计原则
end
看完本文有收获?请转发分享给更多人
关注「码农小助手」,提升技能
每天记得对自己说:你是最棒的!
“转发和在看是对作者最大的支持”
以上是关于架构设计和代码开发中的常用原则的主要内容,如果未能解决你的问题,请参考以下文章