架构分层方法指导

在《不过时的经典层架构》里讲了经典的四层架构怎样对易变性做封装。咱们实际项目中,如果没有足够的实践和关键性思考,还是很可能使用名义上科学的分类理论,却在按照功能进行架构分层。今天咱们就通过一些简单的指导来尽量减少这种风险。

四问

在架构分层中,分层设计松散地对应着who、what、where、how这四个问题。

who是客户端交互的系统,what是在Manager服务中需要的系统,how是Engine服务中需要的系统,how是访问数据层的工作,where在系统表述中指资源。按照四问重新画一下经典四层架构的架构图是这样的:

aa8390140c347dd6555970d249440566.png

问及回答这四个问题,在启动设计及验证设计的时候都很有用。

关键最佳实践

易变性递减原则

在一个设计良好的系统中,易变性应该是层递减的。客户端是最易变的,Manager管理层根据用例而变化,Engine引擎比管理层稳定。引擎层变化必须是业务行为变了,比如支付行为了,这比Manager管理层的从先支付再增加积分这种组合的变化要更少一些。资源访问层的变化就更少了,增删改查这种原子操作不怎么变。资源层,理论上是要最少修改的。咱们经常提到的重构、重写,无论如何大改,也很少连数据库也一锅端了吧。

整体设计增量构建原则

这个原则无论什么领域和产业都适用。例如,你买了一块地打算盖个别墅。就算最好的架构师也不能一次性搞定整个设计,必须反复的和你讨论资金、使用人、风格、时间和风险。构建的时候也是先建设一层,再往上建。如果这时候用户想要加一层呢?这就看设计时地基等设施是否可以承载了。

命名

服务名和设计图一样,是与他人交流设计的一种方式。在业务层和数据访问层,描述性的命名方式非常重要。下面是推荐的习惯性命名方式:

1、服务名(为了好理解,服务名可以理解为类名)是至少两部分组成的复合词,采用帕斯卡命名法。

帕斯卡命名法指当变量名和函式名称是由二个或二个以上单词连结在一起,每个单词首字母大写。规则是单字之间不以空格断开或连接号(-)、底线(_)连结,第一个单词首字母采用大写字母;后续单词的首字母亦用大写字母,例如:FirstName、LastName。源自于Pascal语言的命名惯例,也有人称之为“大驼峰式命名法”(Upper Camel Case),为驼峰式大小写的子集。

2、服务名的后缀永远是服务的类型,例如:Manager、Engine、Access或者ResouceAccess.

3、服务名的前缀会根据服务类型而变化。比如Manager类型的,前缀往往是封装了易变的用例的名词;再比如Engine类型的,前缀往往是定义封装了什么事件的名词;ResourceAccess类型的,前缀往往说明了用例访问了什么数据资源。

4、只有在Engine类型的服务中,前缀才能用动名词。动名词就是ing形式的。如果把动名词用到了其他类型的服务中,很可能预示着这是按照功能分解的。

举个例子:在银行设计中,AccountManager(账户管理)和AccountAccess(账户访问)是可接受的命名,但是BillingManager(收单管理)和BillingAccess(收单访问)就有点功能分解的味道了。因为它传达了一种做什么而不是关于易变性的编排和访问的。CalculatingEngine是一个不错的选择,因为引擎做的一般都是聚合、校验、计算、转换、定位和搜索这些。

5、原子操作性的动词,比如Get、Put不应该用作服务前缀,应该用作数据访问层的接口名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4956.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF转换软件有哪些?分享免费好用的PDF转换工具!

PDF是在办公和学习中常用的文件格式,它包含文字、图片、数据等各种信息,可以说是功能丰富。然而,有时我们需要将PDF转换为PPT格式以便于演示,或者将其转换为Word格式以节省内存空间。这时候就需要使用PDF转换软件。下面我将介绍一…

java投票管理系统小程序

投票管理系统小程序 演示视频 技术: 基于springbootvue小程序的投票管理系统的设计与实现 运行环境: JAVA版本:JDK1.8 IDE类型:IDEA、Eclipse都可运行 微信开发这工具 数据库类型:MySql(8.x版本都可&am…

#10048 「一本通 2.2 练习 4」Censoring(内附封面)

[USACO15FEB] Censoring S 题面翻译 Farmer John为他的奶牛们订阅了Good Hooveskeeping杂志,因此他们在谷仓等待挤奶期间,可以有足够的文章可供阅读。不幸的是,最新一期的文章包含一篇关于如何烹制完美牛排的不恰当的文章,FJ不愿…

机器学习6:使用 TensorFlow 的训练线性回归模型

纸上得来终觉浅,绝知此事要躬行。前面 5 篇文章介绍了机器学习相关的部分基础知识,在本章,笔者将讲解基于 TensorFlow 实现一个简单的线性回归模型,以便增强读者对机器学习的体感。 目录 1.环境准备 1.1 安装 Python3 1.2 安装…

尚硅谷微信小程序开发 仿网易云音乐App 小程序 后端接口服务器搭建

小程序学习 尚硅谷微信小程序开发 项目网易云小程序学习地址: 01-尚硅谷-小程序-课程介绍_哔哩哔哩_bilibili 视频相关的教程文档与笔记分享 链接:https://pan.baidu.com/s/1aq7ks8B3fJ1Wahge17YYUw?pwd7oqm 提取码:7oqm 配套服务器 老师…

品牌方的brief怎么写,注意事项

我们都知道,对于产品传播来说,达人起着重要的作用。可又是什么影响着达人的传播结果呢?今天给大家分享下,品牌方的brief怎么写的注意事项。 一、什么是brief 可能有的朋友,还不太清楚,到底什么是brief。Brief&#xf…

用python实现调用百度图片搜索的API

前言:这段代码是一个简单的图片爬虫程序它可以通过输入关键词,在百度图片中搜索相关图片,并返回一张随机的图片。代码使用Flask框架搭建了一个简单的Web应用,将用户输入的关键词作为参数传递给爬虫程序,然后从百度图片…

linux 资源包安装详细教程

linux 资源包安装详细教程 一、离线下载安装1.1 下载1.2 安装1.3 错误:依赖检测失败 - 解决方案1.4 查看安装的包情况 二、在线安装 一、离线下载安装 1.1 下载 点击进入网页:linux资源包下载链接:pkgs.org在搜索栏输入需要的包&#xff0c…

7.3 SpringBoot整合MyBatis分页插件github.pageHelper:实现图书列表API

文章目录 前言一、自己实现分页第一步,count 查询 总记录数(totalCount),计算总页数(totalPages)第二步,limit 查询 指定页数据 二、不考虑分页的查询图书列表MapperBookServiceImplBookListPar…

CSS_高度自动过渡 auto height

方法一 grid 布局中的 fr 单位&#xff08;推荐使用&#xff09; <div class"wrap"><button class"trigger">鼠标放上来试试</button><div class"grid"><div><p>高度自动过渡</p></div></d…

Linux服务器同步Windows目录同步-rsync

前言 最近需要&#xff0c;Linux的服务器同步Windows的一个目录。查了下&#xff0c;大概有三种方法&#xff1a;网盘同步&#xff1b;rsync同步&#xff1b;挂载目录。 网盘同步&#xff0c;可以选择搭建一个Nextcloud 。但是问题在于&#xff0c;我需要的是&#xff0c;客户…

LangChain-Agent自定义Tools类 ——输入参数篇(二)

给自定义函数传入输入参数&#xff0c;分别有single-input 参数函数案例和multi-input 参数函数案例&#xff1a; from langchain.agents import Tool from langchain.tools import BaseTool from math import pi from typing import Union from math import pi from typing …