首页 > 其他分享 >从接口设计看业务分层

从接口设计看业务分层

时间:2023-09-19 11:34:35浏览次数:34  
标签:显示 代码 业务 接口 分层 逻辑 设计

最近在做功能更改时,发现一个接口设计很有趣,其中涉及一些代码设计方面的值得思考的内容。

背景

以下是一个相对简单的优惠券列表功能。不同的优惠券具有不同的描述,而描述内容会受到一定的业务规则影响。例如,满5元可用的兑换券将显示为"满5.01可用",而无订单限制的兑换券将显示为"仅支付0.01元"。

image-20230919100504959

用户模型大致如下所示

image-20230919102434397

从后端的角度,查询接口提供统一的数据接口,按照业务模型将数据返回,前端特殊的显示需求由前端进行处理,但是这样处理存在两个问题,一是如果多种移动端(iOS、android、小程序)那么就需要各个移动端各自处理,导致逻辑分散且无法统一;二是如果显示需求发生变更,iOS和Android需要升级新版本才能获得新功能。

基于以上两个问题,决定通过后端接口直接返回所需的显示数据,让前端根据数据进行显示。这样,如果显示需求变更,只需后端进行相应更改即可。

代码实现

按照经典三层架构来设计,请求层,业务处理层,数据层各领其责,显示相关逻辑在服务层中进行处理,经过上线测试,功能符合预期,没有出现任何问题。

image-20230919104244446

但是上面的代码隐隐透漏出坏味道,因为显示逻辑侵入了优惠券查询业务中。如果以后有其他显示业务逻辑,必然也会在同一处进行处理,导致代码逻辑越来越复杂。

那么如何解决类似的问题呢?回归到我们的代码设计,我们既希望保证查询逻辑的职责单一,又要实现显示逻辑。合理的业务分层可能是一个解决方案。

从领域驱动设计的角度来看,我们的核心业务是用户优惠券的查询,而额外功能是与显示相关的需求。因此,我们可以按照以下方式进行代码分层:

image-20230919110113680

按照以上代码分层,既能确保核心业务逻辑的职责单一,又能隔离显示相关需求的实现。当然,领域驱动中各层的命名并不重要,但这种分层隔离的思想值得在业务代码中借鉴。

当然肯定还有其他的方式可以对上面的代码进行一些优化更改,但是回过头来再看我们的代码实现,有一个原则需要贯穿始终,那就是职责单一,接口的职责单一某种程度上意味着代码腐化程度的高低。

标签:显示,代码,业务,接口,分层,逻辑,设计
From: https://www.cnblogs.com/wrxiang/p/17714196.html

相关文章

  • 【API接口工具】postman-Workspaces工作空间 VS Scratch Pad草稿面板
    ScratchPad是一个可以在未连接到Postman服务器的情况下工作的空间。当您未登录或没有网络连接时,您仍然可以离线访问某些Postman功能,例如创建集合和请求,或发送请求。ScratchPad中的所有工作都存储在本地,不会与Postman在线同步。在便笺簿中工作后,您可以稍后在登录后将工作移......
  • 【Android】折叠效果CoordinatorLayout+AppBarLayout首页效果&& CoordinatorLayout抖
    亲测效果如下:布局结构<?xmlversion="1.0"encoding="utf-8"?><android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto&qu......
  • 9-微信小程序的网站的接口调用(直接调用)
    微信小程序除了在第三方调用接口,还可以直接从网站调用接口,但是每个网站都有保护措施,所以要寻找那些没有防护的,可以来直接调用的网站。 案例:豆瓣电影的接口调用1.百度豆瓣电源,找寻需要调用的页面 2.右键检查,或F12 3.回车,再次发起请求,查看网站接口 微信小程序作为新兴......
  • C#中的高级主题:设计模式和架构
    简介:欢迎来到C#语言入门指南的第十四篇博客!在之前的博客中,我们已经学习了C#的基础和一些高级编程概念,包括内存管理、性能优化和安全性。今天,我们将深入研究C#中的高级主题,包括设计模式和架构,以帮助您构建更可维护和可扩展的应用程序。让我们开始吧!1.设计模式:设计模式是一些被广......
  • 设计模式(六)适配器
    一、定义将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。适配器模式是一种结构型模式。二、描述包含以下三个角色:1、Target(目标抽象类):目标抽象类定义了客户所需要的接口,可以是一个抽象类或接口,也可以是一个具体的类,由于C#不支持多继......
  • 界面控件DevExpress的VS报表设计器 v23.1——启动速度全面提升
    本文主要介绍在DevExpressv23.1这个版本发布周期中对VisualStudio报表设计器所做的改进,包括优化的启动时间、新的全局选项对话框等。屡获大奖的界面控件套包DevExpress 今年第一个重要版本v23.1正式发布,该版本拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应......
  • 2022年中国大学生程序设计竞赛女生专场 ACEGHIL
    2022年中国大学生程序设计竞赛女生专场目录2022年中国大学生程序设计竞赛女生专场概况A-减肥计划C-测量学E-睡觉G-排队打卡H-提瓦特之旅I-宠物对战L-彩色的树概况因为女生赛,要给女队找找题,我又试了下2022女生赛,题目很多小细节需要注意,不然会wa很多发,前\(3\)题......
  • 数据库设计三范式
    数据库表的设计依据,教我们怎么进行数据表的设计。第一范式:要求任何一张表都必须有主键,每一个字段原子性(单一性)不可再分。第二范式:建立在第一范式的基础上,要求所有非主键字段完全依赖于主键,不要产生部分依赖。第三范式:建立在第二范式的基础上,要求所有非主键字段完全依赖于主键,不......
  • 8-微信小程序的网站的接口调用
    案例:查询天气预报1.需要使用到的接口网址,在百度搜索聚合数据:https://www.juhe.cn/  聚合数据是一个请求接口的网站 准备工作做好后,就开始打开微信小程序编译器wxml:<view class="top" >    <text>查看天气预报</text></view><form bindsubmit="submit" >......
  • 《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
    前言大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户......