忍不了,客户让我在一个接口里兼容多种业务逻辑

news2024/11/24 19:08:22

分享是最有效的学习方式。

博客:https://blog.ktdaddy.com/

老猫的设计模式专栏已经偷偷发车了。
不甘愿做crud boy?看了好几遍的设计模式还记不住?那就不要刻意记了,跟上老猫的步伐,在一个个有趣的职场故事中领悟设计模式的精髓吧。还等什么?赶紧上车吧

故事

小猫的风波已经过去了,这几天,小猫在安安心心地撸着系统现状方案,准备着下次月会的分享。

这天,原本静谧而又和谐的办公室却被开放平台老六抱怨声打破了。

“不改,别给我打电话了!说几遍都没用。这是一个研发的底线…”

没过一会,产品老汪担心老六对其"对脸开大",孙子似地提着杯咖啡找到了老六。老汪是明事理的产品经理,为人处事儿这方面没得说。

“这事儿,我也为难,兄弟,帮帮忙,来喝杯咖啡解解乏。我也知道这种客户很难搞,但是我们是乙方,没办法,这年头大环境摆在这里,赚钱不容易,大家互相体谅一下。”

老六接过老汪的咖啡,气呼呼地抿了一口。

“上次发布商品的时候让我把修改商品属性和新增商品信息放到一个接口也就算了,这次还让我干脆把上架到货架直接包到一起?那后面我们这接口还咋维护了?后面是不是把商品添加到活动中也往这一个接口上堆啊?你让我到后面咋维护么?他们公司的lowb研发懂不懂软件设计原则啊…”

产品老汪在旁边连连点头,“兄弟,消消气,消消气”。

“要不这样吧,咱们拉上对面研发一起聊聊吧,看看双方是否都可以让让步…”。

于是老汪和老六一起来到一间会议室,约客户开始了在线会议。

单一职责原则

大家有没有遇到老六一样的遭遇。由于业务要求,接口或者某个模块中耦合了太多可能不相干的事情。在这里你们是如何处理的呢?关于这点咱们要引出单一职责原则这样一个软件设计原则。

对于单一职责原则,官方术语:单一职责原则,英文缩写SRP,全称Single Responsibility Principle。There should never be more than one reason for a class to change。一个类或模块应该有且只有一个改变的原因。如果一个类拥有多个职责,这些职责之间的耦合会导致系统变得不稳定和难以维护。

在OOP里面,高内聚、低耦合是软件设计追求的目标,而单一职责原则可以看做是高内聚、低耦合的引申,将职责定义为引起变化的原因,以提高内聚性,以此来减少引起变化的原因。职责过多,可能引起变化的原因就越多,这将是导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。

可见无论从官方定义,还是对“单一职责”名称的解释,都能很好的理解单一职责原则的意义。其实在软件设计中,要真正用好单一职责原则并不简单。

老猫觉得如果需要遵循这样的原则,最关键的地方还是在于职责的划分。不过说到这个职责划分又是比较偏向于业务性质的,其和产品需求是分不开关系的。咱们就拿老六遇到的这个事情来分析一下。

一个发布商品的例子

说明:下面demo的表现形式,咱们都会用到类图的方式,关于类图的相关知识点,大家有兴趣可以看这里“类图知识点”。

第一版

咱们一起看一下这个例子,如下图:

在这里插入图片描述

上面的图中,我们看到了有一个发布商品的接口类以及实现。在其中,我们看到其中包含了发布商品的基础信息,发布图片信息,发布规格信息,将商品加入商品池,将商品加入售货架,将商品加入某个活动。

我们一起来看一下上述的设计是否存在问题?很多时候其实是有争议的。

单一职责原则要求一个接口或类只有一个原因引起变化,也就是一个接口或类只有一个职责,它就负责一件事情,原则上来说,单纯从客户角度,如果能保证客户后续需求不会变更,以商品发布作为颗粒度,那么它是合理的。因为业务上已经约定好,里面有商品属性信息维护,有商品行为信息维护。如果没有新的业务概念提出来,顶多后续内部改造的也就是属性变更以及上下架和商品池维护变更。这种角度来说是合理的。

但是这种不变更的保证谁能担保呢?另外接口也不是针对这一家客户开放的,当然考虑通用性。

第二版

这不没多久业务又接了一家新客户,他们的要求是发布商品就是商品信息的发布。剩余行为无需做强绑定,上下架行为由对方运营人员选择性执行,没必要新品一发就上架。那现在的这套就打又破了之前的单一原则。因为由于业务的要求,咱们要将行为拆分成下面这种模式:

在这里插入图片描述

上面的业务看起来更加清晰一些,咱们把属性同步设置单独抽离,针对操作商品的行为也单独封装为另外一个行为接口。系统功能可拓展,接口可复用的角度来说,无论是第一个版本还是第二个版本,看起来都比较适用。这么一来,看起来两个客户的业务都遵循了单一职责的原则。虽然这种方案会引来第一个客户的研发的不满,因为对于他们来说可能会调用两次(当然我们也可以通过门面模式将其整合,当然这是后话),但是站在系统本身的设计角度来说,是比较合理的。但是这样的一个抽取方式真的够了么?

第三版

又来了一家客户,由于对方公司有自己的运营想法,对方不希望用我们的活动,他们希望有自己的活动,并且需要我们给其单独定制,那么此时咱们又发现,单一职责的这个设计原则又被打破了,因为我们需要针对活动去做定制,为了遵循职责单一原则,所以这时候需要我们将活动行为单独剥离。然后就有了下面这样的情况。

在这里插入图片描述

这次的接口看起来更加灵活,满足单一模式的同时,满足了以上所有的业务。但是这就够了么?

显然不够,我们还是会遇到各种业务需求的变动,但是上述的抽取在当前的业务下面看起来是比较适用的。能够cover住大部分的场景了。对于后续的业务拓展也比较友好。

总结

上述的例子比较极端,老猫其实主要想和大家一件事情,所谓的单一职责的软件设计模式并不是绝对的,我们会根据业务的需求形态做出动态调整。如何遵循好单一职责的设计原则,其实还是需要我们能够对业务有一个比较精准的领域划分。小伙伴们,你们觉得呢?若有其他看法,欢迎大家留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文掌握SpringBoot注解之@Component 知识文集(8)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

山体滑坡在线安全监测预警系统(解决方案)

在近年来,随着全球气候变化的影响,山体滑坡等自然灾害频发,给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害,许多地方开始在山上安装山体滑坡在线安全监测预警系统(解决方案)。…

【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及的知识点 图论 深度优先搜索 状态压缩 树 LeetCode1617. 统计子树中城市之间最大距离 给你 n 个城市,编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges ,其中 edges[i] …

在 Linux 中挂载新硬盘动态使用

目录 一:添加硬盘并且格式化 二:创建逻辑卷 三:挂载卷到目录 在 Linux 中挂载新硬盘并进行格式化的操作可以按照以下步骤进行: 一:添加硬盘并且格式化 查看现有分区状态和服务器安装的硬盘状态: df -…

开源项目TARZAN-NAV | 基于springboot的现代化导航网站系统

TARZAN-NAV 导航网站 一个基于 Spring Boot、MyBatis-Plus、h2database、ehcache、Docker、websocket等技术栈实现的导航网站系统,采用主流的互联网技术架构、全新的UI设计、支持一键源码部署,拥有完整的仪表板、导航管理,用户管理、评论管理…

操作筛选器的 1 个应用实例:自动启用事务

前言 在数据库操作过程中,有一个概念是绕不开的,那就是事务。 事务能够确保一系列数据库操作要么全部成功提交,要么全部失败回滚,保证数据的一致性和完整性。 在 Asp.Net Core Web API 中,我们可以使用操作筛选器给…

uni-app小程序自定义导航栏

最近在开发一个uni-app小程序,用到了自定义导航栏,在这里记录一下实现过程: page.json 在对应页面路由的style中设置入"navigationStyle": "custom"取消原生导航栏,自定义导航栏 {"path": "…

C++ //练习 3.8 分别用while循环和传统的for循环重写第一题的程序,你觉得哪种形式更好呢?为什么?

C Primer(第5版) 练习 3.8 练习 3.8 分别用while循环和传统的for循环重写第一题的程序,你觉得哪种形式更好呢?为什么? 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /********…

[晓理紫]每日论文分享(有源码或项目地址、中文摘要)--强化学习、模仿学习、机器人

专属领域论文订阅 VX 关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为300名读者提供订阅主题论文服务,只需VX关注公号并回复{邮箱+论文主题}(…

深度强化学习(王树森)笔记10

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

KAFKA高可用架构涉及常用功能整理

KAFKA高可用架构涉及常用功能整理 1. kafka的高可用系统架构和相关组件2. kafka的核心参数2.1 常规配置2.2 特殊优化配置 3. kafka常用命令3.1 常用基础命令3.1.1 创建topic3.1.2 获取集群的topic列表3.1.3 获取集群的topic详情3.1.4 删除集群的topic3.1.5 获取集群的消费组列表…

如何使用 Google 搜索引擎保姆级教程(附链接)

一、介绍 "Google语法"通常是指在 Google 搜索引擎中使用一系列特定的搜索语法和操作符来精确地定义搜索查询。这些语法和操作符允许用户过滤和调整搜索结果,提高搜索的准确性。 二、安装 Google 下载 Google 浏览器 Google 官网https://www.google.c…

Python||1. 使用LSTM模型进行乘客的数目预测;2.对文件rest-api-asr_python_audio_16k.m4a进行语音识别

1. 使用LSTM模型进行乘客的数目预测 数据集 international-airline-passengers.csv(可以不在意精度和loss) import pandas as pd import numpy as np filename rC:\Users\15002\Desktop\data1\international-airline-passengers.csv data pd.read_cs…

科技云报道:新趋势下,国产数据库或“春山可望”

科技云报道原创。 从540亿元到1286亿元——这是中国通信标准化协会大数据技术标准推进委员会针对中国数据库行业给出的一份预测报告。 报告指出,未来五年,中国数据库行业将从百亿级市场跨越成为千亿级市场。 最近两年,中国的数据库行业似乎…

OAuth2的四种授权方式

OAuth2的四种授权方式 OAuth2的作用OAuth2的四种授权方式OAuth2相关名词授权码模式授权码模式的步骤 简化模式简化模式的步骤 密码模式密码模式的步骤 客户端模式客户端模式的步骤 OAuth2的作用 核心作用:颁发token,也就是令牌,token中一般包…

【DB2 流浪之旅】 第一讲 Linux 环境安装 db2 数据库

DB2数据库是IBM开发的一种大型关系型数据库平台。它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。一般DB2是搭配IBM Power系列小机使用的,兼容性好、性能高。当然DB2也有Linux版本的,相对性能会差一些,主要…

密评机构资质和开展业务资料

一、概念 密码:《密码法》定义是指对信息进行加密保护、安全认证的技术、产品、服务。分为:核心密码、普通密码、商用密码。 商用密码:《密码法》定义是指对不涉及国家秘密内容的信息进行加密保护或安全认证所使用的密码技术和密码产品。 …

JVM 内存模型

1 什么是 JVM 内存模型 JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内 存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。 2 JVM 为什么进行内存区域划分 随着对象数量的增加&#xff…

【Python机器学习系列】建立LightGBM模型预测心脏疾病(完整实现过程)

一、引言 前文回顾: 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式(理论源码) 【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制(理论源码…

如何一键导出多张图片二维码?图片批量建码生成的方法

现在很多的物品信息都会生成一张单独的图片,然后生成二维码印刷到包装或者其他地方上使用,那么如何快速将多张图片多批量生码处理,相信有很多的小伙伴都不太清楚该怎么完成。其实,大量图片生成二维码的方法是很简单的,…