如何先梳理业务逻辑再写代码

article/2025/8/21 4:44:12

1.业务逻辑与代码

代码是需求逻辑的一种展现形式

需求文档是业务逻辑的一种展现形式,而代码不过是业务逻辑的另一种表现形式;如果逻辑本身有问题,那么它的各种展示形式自然也是错的,所以写代码前应该先思考清楚业务逻辑。

Review代码很多时候是逻辑问题

在Review代码经验中发现:混乱的代码并不仅仅是代码编写技艺问题,很多时候是因为逻辑没有梳理清楚。逻辑混乱,自然代码也混乱。梳理清楚业务逻辑,就为代码打下了良好的基础。当然业务逻辑梳理清楚后,业务逻辑到代码的映射依然有可能出问题,这是编程技艺要解决的问题。下面通过一个简单的例子来演示这个过程:

2.业务需求示例

我们要做一件事情doSomething:

  • 第一步先做 A,A 过程要先执行 a1, 然后执行 a2, 然后执行 a3 这三个子过程。

  • 第二步再做 B,B 过程需要执行 b1,然后 b2 这两个子过程。

这个示例逻辑的图形表述如下:是一个树,包含树的根,枝干,和叶子。

图片

例子是有通用性的,现实世界的任何事情或业务都可以用类似的树形结构来表述。

3.正确的代码实现

3.1 和逻辑树映射的代码树

正确的代码结构应该是和逻辑映射的,代码结构如下:

图片

我们真实写代码的时候,一般并不会直接写出如上结构,而是会先写出「3.2 代码块 + 注释」的结构来。

3.2 代码块 + 合理注释

如下代码通过代码块来映射逻辑,上面图中的子方法对应代码中的注释。

void doSomething(){//Aa1逻辑伪代码.....;//a1a2逻辑伪代码.....;//a2a3逻辑伪代码.....;//a3//Bb1逻辑伪代码;//b1b2逻辑伪代码;//b2
}

3.3 抽取小方法

可以再上面的基础上更优秀些,对代码块进行抽取小方法,更符合业务描述(更符合业务的树形结构)。推荐阅读:看看人家 SpringBoot + vue后台管理系统,多么优雅...

void doSomething(){doA();doB();
}void doA(){a1逻辑伪代码.....;a2逻辑伪代码.....;a3逻辑伪代码.....;
}
void doB(){b1逻辑伪代码;b2逻辑伪代码;
}

当然你也可以继续对 a1,a2,a3,b1,b2 等小逻辑映射为小方法,以上提到几种写法都是正确的,关于小方法是否抽取,后续单独在《代码长度与母语的关系》中讨论。下面我们来看看不正确的写法。

  1. 不正确的代码实现 ===========

当你看到下面的不正确的写法的时候,你也许会觉得不可思议,真的会写出这样的代码?现实是:项目中我见到很多更糟糕的代码,会把下面提到的问题,以及其他编程技艺的问题排列组合出现。

4.1 第一种问题:不对等

第一种常见的问题不太严重,只对部分逻辑进行了抽取,造成方法中执行不对等;比如只对 b() 逻辑进行了抽取,但对等的 a()逻辑并未抽取;

图片

void doSomething(){a1逻辑伪代码.....;a2逻辑伪代码.....;a3逻辑伪代码.....;doB();
}void doB(){b1逻辑伪代码;b2逻辑伪代码;
}

改进办法参考上面第 3 部分正确的写法,至少可以在doB();之前加空行,并对 a1,a2,a3 加个注释,也会易读很多(当然这是一种妥协写法)。

void doSomething(){//a逻辑a1逻辑伪代码.....;a2逻辑伪代码.....;a3逻辑伪代码.....;//b逻辑doB();
}void doB(){b1逻辑伪代码;b2逻辑伪代码;
}

4.2 第二种问题:部分抽取

第二种是对整体的部分逻辑进行了抽取,这种方法很难命名,会给个词不达意的名字,或使用整体的名字,这个就相对严重了,已经影响到了代码阅读和理解。

比如电脑是一个整体,可以命名是电脑;如果只给你一部分(CPU,主板,显卡)怎么命名让人能明白?电脑部分零件?但电脑部分零件并不能让人明白,因为它不是一个逻辑主体。CPU 是一个逻辑主体,封装了运算。

如下图,只对 a1,a2 进行了抽取,然后名字依然称为 a,看到代码会很疑惑,a3 明显也属于 a。

图片

void doSomething(){doA();a3逻辑伪代码.....;doB();
}
void doA(){a1逻辑伪代码.....;a2逻辑伪代码.....;
}void doB(){b1逻辑伪代码;b2逻辑伪代码;
}

4.3 第三种问题:抽取错误

第三种是最严重的问题,抽取错误,和逻辑不匹配。

如下:把 A 的部分逻辑和 B 的部分逻辑一起抽取。

如果在这个基础上再对抽取的部分起个晦涩的名字(其实这种抽取也起不到好名字),然后应用一些设计模式来把代码更分散(缺点隐藏起来),就成功的完成了只有自己可以看懂的代码(可能表面看起来还很高大上)。

图片

由此得出结论,先别想着抽取小方法或应用设计模式。先能平铺直叙的写出符合逻辑的代码吧。

小方法抽取和设计模式不一定能解决问题,也能隐藏问题。

很多难以读懂的代码都是受《重构》和《设计模式》的包装,质量差的代码不可怕,如果再抽取和包装,可以想想是多恐怖。

  1. 补丁和模式思考 ==========

补丁代码思考,代码的腐烂

很多人看到这里,会觉得自己绝对不会写出这么烂的代码;确实一开始也许不会,但伴随新需求,不同人不断打补丁(为了不影响线上,老代码不让动),最后就会演进未这几个问题综合展现的代码。阅读这样的代码不看到最底层代码,根本不知道代码在做什么,因为方法名已经不可信。

不要急于使用设计模式,写好基础代码

写出一个好的基础代码的过程:

先梳理清楚逻辑树(树形结构,同层对等),然后做到代码符合逻辑树(代码树自然也符合树形结构,同层的方法对等)。

打好基础后,可以再针对基础代码的痛点,应用复杂手段(比如设计模式)来解决,


http://chatgpt.dhexx.cn/article/CkKkbfC9.shtml

相关文章

【web实战-业务逻辑】评论点赞逻辑

前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员&…

SpringBoot框架实现简单业务逻辑

SpringBoot框架实现简单业务逻辑 总述Entity层Dao层Mapper.xml Service层ServiceImpl Controller层完整的业务逻辑实现写法示例Dao层声明方法Mapper.xml具体实现sql语句Service层声明方法ServiceImpl具体实现业务逻辑Controller层调用Service层方法实现 总结 总述 最基本的业务…

java如何优雅的写业务逻辑_java业务逻辑,写在哪里比较好?

java业务逻辑,写在哪里比较好?对于这个问题,我想说的是:规范是死的,人是活的,一般情况下,我们可以根据不同的 java 框架规范的目录来写,特殊情况下也可以自定义。 问题分析 接触过 j…

常见的业务逻辑漏洞-整合篇

笔者前言: 作为一个地地道道的安服仔,每日的工作就是渗透测试,在测试的过程中累积了很多的经验,看到了各种各样奇葩的漏洞,于是乎便有了这样的一篇文章。以下文章均由本人测试发现并打码,侵删 什么是业务逻…

浅谈——业务逻辑漏洞

目录 什么是业务逻辑漏洞产生原因脑图有哪些应用场景?哪些危害?越权支付漏洞靶机案例修改支付金额密码找回绕过越权 防御方式参考 | 提示📝: “业务逻辑"一词仅指定义应用程序操作方式的一组规则。由于这些规则并不总是与企…

订单业务逻辑设计

订单业务逻辑 订单的常见功能: 创建订单功能、查看订单列表、根据订单id查询订单的详细信息、订单修改、订单取消、订单状态、订单评价等功能的实现数据库表的设计 tb_order(订单信息表) tb_order_item(订单详情表) tb_order_shipping&am…

业务安全 –业务逻辑漏洞

目录 业务安全 –业务逻辑漏洞 业务安全概述; 业务安全测试流程: 业务数据安全 商品支付金额篡改 前端JS限制绕过验证 请求重放测试 业务上线测试 *商品订购数量篡改 密码找回安全 注入 业务逻辑 信息泄露 业务安全概述; 简单讲,随着社会发…

不可思议但又无处不在的漏洞,WEB安全基础入门—业务逻辑漏洞

欢迎关注订阅专栏! WEB安全系列包括如下三个专栏: 《WEB安全基础-服务器端漏洞》《WEB安全基础-客户端漏洞》《WEB安全高级-综合利用》 知识点全面细致,逻辑清晰、结合实战,并配有大量练习靶场,让你读一篇、练一篇&a…

业务逻辑安全思路总结

在一些关键的业务场景里,我们最应该关注的安全问题是什么呢? 想到这,发现挺有意思的,于是我重新去梳理了一下业务逻辑方面的内容,做了一张关于业务逻辑安全的思维导图,在整理的过程中,自己的思路…

开发业务逻辑

转自:http://www.uml.org.cn/zjjs/201008021.asp 前言 记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论。就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论。当时金色海洋同学…

Service业务逻辑层

就是功能实现 例:Account类要求编写业务逻辑层AccountServiceImpl类实现一个转账功能 先定义DBUtils类封装数据库连接代码、定义Account类、定义PersonDao类提供增删改查方法 public class AccountServiceImpl{public static void transfer(int fromId,String pwd,…

业务逻辑详解

不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能,给你两个数,让你获取它的和,你所写的如何才能获得任意给定的两个数的和,这个程序实现过程即可…

业务逻辑漏洞

业务逻辑漏洞定义: 业务逻辑漏洞是指由于程序逻辑不严谨或逻辑太复杂,导致一些逻辑分支不能正常处理或处理错误。 业务逻辑漏洞特性: 业务逻辑漏洞只出现于业务流程中(模块功能),也就是说网站的部分都有…

业务逻辑漏洞总结

一、漏洞简介 业务逻辑漏洞产生的最核心原因,就是在编写程序时,只考虑了常规的操作流程,即“当在A情况下,就会出现B,此时执行C即可”,但是开发者却没有考虑当用户执行了意料之外的X时会发生什么。这种对于…

前端业务逻辑

前端业务逻辑 1-关于全选和非全选 Vue3环境下运用ant-design-vue框架 展示效果 全选 非全选 业务逻辑 1、数据结构data const state reactive({cart: , // 购物车信息ids: [], // 删除购物车单个商品的idcartNum: , // 购物车数量checkAll: false, // 是否处于全选状态c…

java业务逻辑_java业务逻辑怎么写?

现在Java项目一般都是用Spring全家桶开发,以web项目来讲结构主要分为Controller层、Service层和DAO层,细分的话有的项目可能还会有一个Manager层。 一个请求到达后端之后会根据请求的路径找到对应的Controller,Controller会调用相应的业务Ser…

什么是业务逻辑?

不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能,给你两个数,让你获取它的和,你所写的如何才能获得任意给定的两个数的和,这个程序实现过程即可…

业务逻辑之终极分析

细说业务逻辑 前言 记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论。就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论。当时金色海洋同学提出了一个话题——“什么是业务逻辑”。当…

Linux中tar命令用法

tar命令:主要用于压缩和解压缩。 tar命令有两种压缩格式 : 1、 gzip格式: 1)、压缩 压缩用法: tar gcvf (压缩包名)文件1 文件2 一般压缩包包名以 .tar.gz作为后缀名,压缩完成之后保留原文件。 压缩前…

linux中tar命令的用法

linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩。 1.命令格式: tar[必要参数][选择参数][文件] 2&…