两个位置带来的小启示

news/2024/12/15 16:30:27/文章来源:https://www.cnblogs.com/lovesqcc/p/18608126

小问题也能收获有益启示。

例子一

请看下面的代码(实际工程代码简化而来)。从字符串中解析出反弹 IP。

这段代码原意是,对reverseFuncNames 里的 New-Object 元素做特殊处理,然后对除 New-Object 之外的其它元素做其它相同处理。这段代码有什么问题?

var (reverseFuncNames = []string{"[Net.Sockets.TcpClient]::New", "Connect", "New-Object"}noPort           = "-1"
)// ParseReverseShellInfo 解析反弹IP
func ParseReverseShellInfo(str string) []string {if string_utils.IsNotEmpty(str) {var otherConditions boolvar otherConditions2 boolif str == "New-Object" && otherConditions {// do something and return}reverseFuncNamesRest := reverseFuncNames[:len(reverseFuncNames)-1]if slice_utils.SliceContains(reverseFuncNamesRest, str) && otherConditions2 {// do something and return}}return make([]string, 0)
}

不错,这段代码确实实现了它的原意。那么,问题在哪里呢?细心的读者应该看出来了:假设 reverseFuncNames 在 New-Object 之后 新增了元素,那么最后一个元素将不能被处理。

问题不会在当前出现,而是在新增元素之后出现。从这个小例子可以得到什么启发?

  • 当代码处理与数组中的位置关联起来,且数组可能会在未来变化时,代码处理可能会出问题。这是写代码时欠缺可扩展性考量导致的。合理的写法是什么?把 "New-Object" 放在第一个位置,然后修改为 reverseFuncNamesRest := reverseFuncNames[1:]。 这样,即使后面新增元素,也能正常处理。
  • 这确实只是编程的一个小例子。不过,它告诉我们的是,即使很微小的问题,也应当考虑可扩展,使得未来新增元素无需做任何改动。不同的实现方式有着不同的效果。不适当的实现方式会隐藏导致未来出错的坑。

例子二

我喜欢代码重构。代码重构能够让代码更加整洁,也能是提升代码技艺的一种有效手段,同时也不失为一种消磨时间的方式(我没有摸鱼哦!)。即使是小小的挪动代码,也能带来“爽感”。

移动代码,将一段逻辑从流程中抽离放在一个函数里,然后在流程中调用这个函数。通常是一种不会出错的重构方式。不过,最近我踩了一个坑。简而言之是这样的:

func fillBase() {// do something// set score
}func fillbaseInfo() {fillBase()// set severity
}

然后我做了个什么事情呢?把 set score 的代码抽离到 c() 方法,然后变成了这样:

func fillBase() {// do something
}func fillbaseInfo() {fillBase()// set severitysetScore()
}func setScore() {// set score 
}

这有什么问题 ? 我改变了 set severity 和 set score 的顺序,而 severity 的值是依赖 score 的!当然,从简化的代码来看,似乎非常明显,不过,加上中间一大段代码隔着,然后方法名又如此相似,且当时我并没有意识到 severity 和 score 是有关联的,因此移动代码出了错,踩了坑。

这个小例子能带给我们什么启示?

  • 即使是最基本的移动代码,也不是全然安全的。如果移动的代码所操作的变量和流程中的代码的变量有依赖关系,那么一定要保证移动代码之后,顺序依赖关系也不变。
  • 关联关系一定要注意处理。就像你改动了长方形的宽,就要同时更新长方形的周长和面积。道理虽然浅显,但深入到错综复杂的业务之后,不明显的关联关系很容易导致问题,尤其是你所处理的模块和其它不熟悉的模块产生关联关系的时候。一方面,要有全局视野,避免只看到局部;另一方面,要有意识去处理这种关联关系。而处理的前提是记录。由此看来,软件开发的协作还是比较复杂的。

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

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

相关文章

Buffer

Buffer(缓冲器)1. 概念 Buffer 是一个类似于数组的 对象 ,用于表示固定长度的字节序列 Buffer 本质是一段内存空间,专门用来处理 二进制数据 。2. 特点 1. Buffer 大小固定且无法调整 2. Buffer 性能较好,可以直接对计算机内存进行操作 3. 每个元素的大小为 1 字节(byte)…

夜莺监控V6版本如何升级到V7

升级目的 为了使用新版本的一些功能特性,故此进行升级。 注意事项 软件升级通常关键三个点:二进制替换 配置文件按照最新的格式调整 数据库表结构所以,在做升级之前,一定要先做好备份,备份的内容对应变更的内容,即:二进制、配置文件、数据库。 升级过程这里演示以二进制…

数据采集与融合综合实践

综合设计——多源异构数据采集与融合应用综合实践这个项目属于哪个课程 2024数据采集与融合技术实践组名 数据"融合炖" 异构 "大杂绘"队项目简介 项目名称:味谱魔法 项目logo: 项目介绍:智能购物菜谱助手是一款结合AI技术的智能化应用,旨在为用户提供…

交易系统:退款单模型设计详解

大家好,我是汤师爷~ 和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。 售后域核心概念模型1、退款单 退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织 退款单ID:退款单的唯一标识 原订单ID:关联的原始订单 业务类型…

DDPM论文解读

Denoising Diffusion Probabilistic Models论文解读DDPM(Denoising Diffusion Probabilistic Models) 论文研究背景扩散概率模型(Denoising Diffusion Probabilistic Models, 简称DDPM)是近年来生成建模领域的重要发展之一。 生成模型的目标是学习数据分布并能够从中采样,…

AtCoder Beginner Contest 384 Solution

AtCoder Beginner Contest 384 (A-E) 题解A - aaaadaa (abc384 A) 题目大意 给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。 解题思路 一个循环判断一下就行了。 代码 #include<bits/stdc++.h> using namespace std; int main() {int n…

vs编译cpp时设置排除项

cpp编译排除 一个c++文件不需要被编译但还保留在工程中(阅读),可使用ExcludedFromBuild,有两种方法实现:图形化操作 改vs的项目配置文件图形化操作 在vs的资源管理器选中文件 - 右键 - 属性 - 切到当前的编译配置项(debug/release),有个选项【从生成中排除】,选择为是…

纪念程云大侠

与程云兄的缘份,起始于Delphi大富翁论坛,因 “程云的一堆SQL”而结缘,在论坛发起的第二次(玉渊潭)和第三次(香山)大富翁聚会中逐渐相熟。自2002年5月3日那场坛友初聚起,加上中间各种小聚,至近年来的4年多共事时光,不经意间,二十余载岁月已悄然流逝,往昔匆匆,仿若弹…

css第三天案例练习

案例一:新闻详情 字体颜色:color 字体大小:font-size 段落开头空两行:font-indent:2em 水平居中:图片(出错点)/文字text-align:center 字体粗细:font-weight:400(取消加粗)案例二:css简介 超链接设置格式

DVR4 pg walkthrough Intermediate window

nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A -sS 192.168.219.179 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-15 04:22 UTC Stats: 0:00:22 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 34.76% d…

计算机网络课程笔记

计算机网络课程 该笔记于 2024年12月15日15:14:02 编写 常用命令以及简写完整命令 简写形式 解释configure terminal conf t 进入全局配置模式enable en enableexit ex 退出当前模式hostname host 重启设备interface int 进入接口配置模式shutdown shut 禁用接口no shutdown no…

监测预警智能分析中心建设项目方案

随着科技的不断进步,地理信息与遥感技术在国家治理、环境保护、灾害预警等领域发挥着越来越重要的作用。监测预警智能分析中心的建设,旨在通过集成先进的遥感技术、地理信息系统(GIS)、大数据分析和人工智能(AI)技术,实现对环境变化、灾害风险的实时监测和智能预警。本文…