网站开发面板昆明seo博客南网站建设

news/2025/9/27 3:43:43/文章来源:
网站开发面板,昆明seo博客南网站建设,怎样用电脑和网訨自己做网站,辽宁省建设厅证书查询网站网上有个段子#xff0c;说建筑工程师不会轻易答应会给摩天大楼增加一个地下室#xff0c;但代码开发工程师却经常在干这样的事#xff0c;并且总有人会对你说“这个需求很简单”。到土里埋个雷#xff0c;这确实不复杂#xff0c;但我们往往面临的真实场景其实是“在一片… 网上有个段子说建筑工程师不会轻易答应会给摩天大楼增加一个地下室但代码开发工程师却经常在干这样的事并且总有人会对你说“这个需求很简单”。到土里埋个雷这确实不复杂但我们往往面临的真实场景其实是“在一片雷区的土里埋一个雷”。而雷区里哪里有雷任何人都不知道。 回到我们日常的写代码的场景我们一直在说系统很复杂那到底什么是系统复杂度呢最近几个月蚂蚁代码力平台注是蚂蚁的代码评价平台进入大家视野很多同学开始关注起自己代码力的得分情况。作为团队的稳定性底盘负责人也经常和大家探讨为什么会因为圈复杂度高而被扣分。那么怎么才能写的一手可读可扩展可维护[注1]的好代码本文作者尝试结合在团队内部的实践分享下过程中心得希望对大家的代码圈复杂度治理提供微弱的帮助。 什么是圈复杂度 先看看圈复杂度的通用的定义圈复杂度Cyclomatic complexity简写CC[注2]也称为条件复杂度/循环复杂度是一种代码复杂度的衡量标准。由托马斯·J·麦凯布Thomas J. McCabe, Sr.于1976年提出用来表示程序的复杂度其符号为VG。它可以用来衡量一个模块判定结构的复杂程度数量上表现为独立现行路径条数也可理解为覆盖所有的可能情况最少使用的测试用例数。说人话圈复杂度关系到质量同学最少需要设计多少用例才能覆盖你的代码分支。 怎么计算圈复杂度 蚂蚁广目平台给出了比较详细的说明这里直接引用网上也可以查到类似内容。 节点判断计算公式为V (G) P 1 注除了节点判断法还有其他方法如点边判断法这里只选一个用于说明。 其中P为条件节点数条件节点类型为 a.条件语句 if语句while语句包含do...while...语句for语句包含foreach语句switch case语句try catch语句 b.条件表达式二元或多元 表达式|| 表达式三元运算符举例如下(部分代码省略后用xxx代替) //案例1圈复杂度V(G) 1(if) 1(catch) 1 3 public String myMethod1(){if(xxx){try {//xxx;} catch (IOException e) {//xxx;}}else{xxx;}return xx; }//案例2圈复杂度V(G) 2(if) 1() 1 4 public String myMethod2() {if (xxx) {//xxx;} else {if (xxx xxx) {//xxx;} else {//xxx;}xx();}return xx; } 为什么要关注圈复杂度 好了了解了圈复杂度的定义之后我们基本可以得出一个结论圈复杂度大说明程序逻辑复杂不利于代码的阅读维护和后续扩展。如果需要看懂一个圈复杂度高的方法需要小心翼翼整理所有的分支情况而改动这类代码更像踏入雷区一样。 下面我们来看一段代码案例部分内容已省略 public XXresult doSave( XXDTO newScriptDTO) {String type Enums.ScriptType.CUSTOM;Boolean containsTryCatch StringUtil.contains(content, try) StringUtil.contains(content, catch);if (StringUtil.isBlank(scriptName)) {baseOperationResult.setMessage(XXX);return baseOperationResult;}if (!scriptName.matches(^[(\\d)|_|a-z|A-Z]$)) {baseOperationResult.setMessage(XXX);return baseOperationResult;}NewScript tempScript null;try {tempScript newScriptManager.findByName(StringUtil.trim(scriptName));} catch (Exception e) {baseOperationResult.setMessage(XXX);return baseOperationResult;}if (StringUtil.isBlank(id)) {if (tempScript ! null) {baseOperationResult.setMessage(XXX);return baseOperationResult;}} else {Integer editScriptId Integer.parseInt(id);if (null ! tempScript) {if (!editScriptId.equals(tempScript.getId())) {baseOperationResult.setMessage(XXX);return baseOperationResult;}}}if (!Enums.NewScriptTypeEnum.XX.contains(scriptType)) {baseOperationResult.setMessage(XX);return baseOperationResult;}Boolean needSubtypeMode true;if (StringUtils.equals(scriptType, Enums.XX.XX)|| StringUtils.equals(scriptType, Enums.XX.PRE)) {needSubtypeMode false;}NewScript script new NewScript();script.setScriptType(scriptType);if (StringUtil.isNumeric(status)) {script.setStatus(Integer.parseInt(status));}if (StringUtil.isNotBlank(scriptCategory)) {script.setScriptCategory(ScriptCategory.getByCode(scriptCategory));}String subType ;if (needSubtypeMode) {if (StringUtil.isBlank(subtypeandtip)) {baseOperationResult.setMessage(XXX);return baseOperationResult;}}if (needSubtypeMode) {List NewScript allActiveAndTestRunScripts newScriptManager.findAllActiveAndTestRunScripts();List String allActiveAndTestRunSubTypeList new ArrayList();for (NewScript activeAndTestRunScript : allActiveAndTestRunScripts) {List String subTypeListEveryScript Arrays.asList(Optional.ofNullable(activeAndTestRunScript.getSubType()).orElse(new String()).split(,));for (String subTypeTemp : subTypeListEveryScript) {if (StringUtil.isNotBlank(subTypeTemp)) {allActiveAndTestRunSubTypeList.add(subTypeTemp);}}}try {JSONArray subtypetipsArray JSON.parseArray(subtypeandtip);if (StringUtil.isBlank(id)) {for (Object object : subtypetipsArray) {JSONObject subtypetipsObject (JSONObject) object;String subtypeSingle subtypetipsObject.getString(subtype);if (StringUtil.isBlank(subtypeSingle)) {baseOperationResult.setSuccess(false);return baseOperationResult;}if (CollectionUtils.contains(allActiveAndTestRunSubTypeList.iterator(),subtypeSingle)) {baseOperationResult.setSuccess(false);return baseOperationResult;}}} else {if (1.equals(status) || 2.equals(status)) {for (Object object : subtypetipsArray) {//省略部分内容XXX;if (StringUtil.isBlank(subtypeSingle)) {baseOperationResult.setSuccess(false);return baseOperationResult;}for (NewScript oldNewScript : allActiveAndTestRunScripts) {if (oldNewScript.getId().equals(Integer.parseInt(id))) {continue;}//省略部分内容XXX;if (CollectionUtils.contains(filtered.iterator(), subtypeSingle)) {baseOperationResult.setSuccess(false);return baseOperationResult;}}}}}for (Object object : subtypetipsArray) {if (1 script.getStatus() || 2 script.getStatus()) {SubtypeTips subtypeTips null;subtypeTips subtypeTipsManager.findBySubtype(subtypeSingle);if (subtypeTips null) {subtypeTips new SubtypeTips();}subtypeTips.setSubtype(subtypeSingle);subtypeTips.setInternalTips(innertips);subtypeTips.setExternalTips(externaltips);subtypeTips.setShareLink(shareLink);subtypeTips.setStatus(1);subtypeTipsManager.save(subtypeTips);}}subType StringUtil.substring(subType, 0, subType.length() - 1);} catch (Exception e) {baseOperationResult.setSuccess(false);baseOperationResult.setMessage(XXX);return baseOperationResult;}}boolean needCreateTestRunScript false;if (StringUtils.isNotBlank(id)) {script.setId(Integer.parseInt(id));NewScript orgin newScriptManager.findById(Integer.parseInt(id));if (null ! orgin 1 orgin.getStatus() 1.equals(status)) {if (StringUtil.isNotBlank(orgin.getContent())) {String originContentHash CodeUtil.getMd5(StringUtil.deleteWhitespace(orgin.getContent()));String contentHash CodeUtil.getMd5(StringUtil.deleteWhitespace(content));if (!StringUtil.equals(originContentHash, contentHash)) {needCreateTestRunScript true;}}}} else {script.setSubmitter(user.getLoginName());}Set String systemList new HashSet String();if (StringUtil.isNotBlank(systems)) {String[] systemArray systems.split(,);for (int i 0; i systemArray.length; i) {systemList.add(systemArray[i]);}}if (needCreateTestRunScript) {if (needSubtypeMode) {content replaceContent(content, subType);String testScriptSubType ;List String subTypeList Arrays.asList(StringUtil.split(subType, ,));for (int i 0; i subTypeList.size(); i) {testScriptSubType this.UPDATE_SCRIPT subTypeList.get(i);if (i ! subTypeList.size() - 1) {testScriptSubType ,;}}subType testScriptSubType;}scriptName this.UPDATE_SCRIPT scriptName;NewScript oldUpdateScript newScriptManager.findByName(scriptName);if (null ! oldUpdateScript)script.setId(oldUpdateScript.getId());else {script.setId(null);}baseOperationResult.setNeedAudit(true);}if (StringUtil.isBlank(fileSuffix)) {//如果全空的话 默认全扫script.setSuffix(.*);} else {script.setSuffix(fileSuffix);}script.setName(scriptName);if (StringUtil.equals(allPath, Y)) {script.setAllPath(Y);} else {script.setAllPath();}script.setEnvTag(tenantScope);script.setNeedAutoScan(needAutoScan);if (StringUtil.isNotBlank(scopes)) {for (String each : StringUtil.split(scopes, ,)) {each StringUtil.replace(each, , );script.addScope(each);}}if (StringUtil.isNotBlank(content)) {BaseOperationResult preLoadResult syntaxCheck(script);if (!preLoadResult.isSuccess()) {baseOperationResult.setMessage(preLoadResult.getMessage());return baseOperationResult;}}if (StringUtil.contains(content, new Bug)) {baseOperationResult.setSuccess(false);return baseOperationResult;}try {Result NewScript result newScriptManager.saveCustomScript(script);if (result.isSuccess()) {if (EnvUtil.isProdEnv() EnvUtil.isLinux()) {if (!needCreateTestRunScript) {//省略部分内容XX} else {//省略部分内容XX}}Boolean hasOldScript processOldEngineRule(scriptName);if (containsTryCatch) {if (hasOldScript) {//省略部分内容XX} else {//省略部分内容XX}} else {if (hasOldScript) {baseOperationResult.setMessage(XXX);} else {baseOperationResult.setMessage(保存成功!);}}baseOperationResult.setId(script.getId());processTenantRelation(script.getId(), tenantIdList, user.getLoginName());if (!needCreateTestRunScript needSubtypeMode (StringUtil.equals(Enums.XX.COMMON, script.getScriptType())|| (StringUtil.equals(Enums.XX.SCRIPT,script.getScriptType())))) {JSONArray subtypetipsArray JSON.parseArray(subtypeandtip);for (Object object : subtypetipsArray) {//省略部分内容XX}}} else {baseOperationResult.setSuccess(false);return baseOperationResult;}} catch (Exception e) {baseOperationResult.setMessage(XX);}return baseOperationResult;} 原代码大概400行以上复杂度69憋了一口长气才读完。如果让你来接手这段代码是不是感觉很头疼需要梳理里面各种分支逻辑弄清楚主干脉络。 那么什么样的代码才容易读,容易上手呢一般业界认为代码可读性可测试维护成本和圈复杂度有很大关系具体如下 我该怎么做 1.【知己知彼了解自己代码复杂度】这个比较简单有以下几种方式 a.自己数下判定节点if while for catch case and or等大概就知道圈复杂度是多大了参考上面怎么计算圈复杂度章节。 b.在蚂蚁内部使用的广目平台也可以查看到新提交commit记录里哪些方法圈复杂度比较高。 c.在代码提交之前自己用idea小插件Metrics Reloaded插件一次性扫描自己负责的系统所有方法的复杂度。 红色部分标识圈复杂度数字越大复杂度越高。 2.【对症下药降低复杂度】网上有很多方法我总结了下大概有以下几种 方法一抽取出独立逻辑的子方法把复杂逻辑拆分成几个独立模块再去读代码就会感觉清晰很多。以上面举例的复杂度69的方法为例我们做了如下的方法拆分是不是感觉清晰了很多 public XXresult doSave( NewScriptDTO newScriptDTO) {//0.构造结果XXresult resultnew XXresult() ;try{//1.脚本名检查scriptNameCheck(newScriptDTO); //2.脚本加载loadScript(newScriptDTO); //3.脚本保存saveScript(newScriptDTO); }catch(XXException e){result.setSuccess(false)result.setMessage(XXX);return result;}catch(Exception e){result.setSuccess(false)result.setMessage(XXX);return result;}//操作完成result.setSuccess(true)result.setMessage(XXX);return result} /**检查脚本名*/ private void scriptNameCheck(NewScriptDTO newScriptDTO){xxx } /**加载脚本*/ private void loadScript(NewScriptDTO newScriptDTO){xxx } /**保存脚本*/ private void saveScript(NewScriptDTO newScriptDTO){xxx } 方法二优化逻辑判断通过提取频繁出现的条件 或者调整判断顺序等方式达到简化代码目的。 / 案例1抽取频繁出现的条件a/ //修改前 if (条件1) {if (条件a){// 执行a逻辑} } else if(条件2) {if (条件a){// 执行b逻辑} } if (条件a) {// 执行c逻辑 } //修改后 if (条件a) {if (条件1){// 执行a逻辑}else if(条件2){// 执行b逻辑} // 执行c逻辑 } / 案例2优化逻辑判断顺序/ //修改前 if条件1 条件2|| !条件1{return true; }else{return false; } //修改后 if(条件1 条件2){return false; } return true; 方法三适当使用java新特性降低大量的if判断。下面是来自团队一淏同学的提供的优化案例 //修改前List list XXX;if (CollectionUtils.isEmpty(list)) {for (XX item : list) {if (itemnull){return;}else{// 逻辑a}}//修改后List list XX;list Optional.ofNullable(list).orElse(new ArrayList());list.stream().filter(Objects::nonNull).forEach(item-{//逻辑a});} 当然只要用心钻研降低复杂度还有很多方法这里不一一列举了。总结下思路 一个方法/类不要写大段大段的代码把内容封装在逻辑独立的子类和子方法里。采用有意义的类名方法名让使用者见名思意易于上手。逻辑表达上优化判断逻辑成最简形式。适当使用编程技巧合并判断方式。 结语 作为蚂蚁工程师的我们开发代码也应该像创作一个艺术品深思熟虑精雕细刻经过产品的不断升级迭代仍然能够保持顽强的生命力就像代码四层境界[注3]里面说的第四层经过了时间历练“我的代码还在用”。 引用 [注1]对代码的领悟之-高质量代码有三要素可读性、可维护性、可扩展性 https://wenku.baidu.com/view/ce7e54e60f22590102020740be1e650e52eacff5.html [注2]详解圈复杂度https://baike.baidu.com/item/%E5%9C%88%E5%A4%8D%E6%9D%82%E5%BA%A6/828737 [注3]代码的四层境界 https://www.sohu.com/a/238434622_185201 第一层“我的代码写完了”第二层“我的代码写好了”第三层“我的代码能跑了”第四层“我的代码还在用” 作者 | 陈胜利(李渔) 原文链接 本文为阿里云原创内容未经允许不得转载。

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

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

相关文章

宜昌营销网站建设word可以做网页吗m

简 在php教程中前九步已经了解了php的一些基础知识。大多数人在了解完以上知识后脑子还是迷茫的,最多懂的一些我所讲解过的知识如何实现(对象为零基础读者),如何搭建一个网站还是不知晓。没关系,接下来我们即将进入ph…

南京网站推广排名wordpress返回html原理

LinuxC高级编程——线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的。 1、 互斥锁mutex 多个线程同时访问共享数据时可能会冲突。对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex&a…

南京做公司网站网页设计模板免费网站

本人最近转行开始做海外独立游戏的发行,主要是负责服务器,开会注意到海外的服务越来越丰富越来越细分,对国内将会造成很大的冲击,比如AWS,Google,GameSparks等,这导致国内的所谓服务器开发将越来越简单,国内对服务器开发的需求越来越少,反而客户端的需求越来越多,所以…

Gradle读取仓库配置文件的优先级

Gradle 在读取仓库配置文件(如 settings.gradle 或 build.gradle 中定义的 repositories)时,遵循一定的优先级规则。以下是 Gradle 读取仓库配置文件的优先级顺序:1. 项目级配置文件settings.gradle:这是 Gradle …

opencv学习记录5

轮廓检测和模板匹配轮廓检测 #先转化为二值图 img = cv2.imread(name) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)cv2.findContours(img,mode,method)…

PCS PMA,如何理解硬核IP

xilinx fpga中,serdes部分肯定是硬核(也可以理解为phy部分),因为serdes是数模混合的,相当于FPGA内部有一块地方是这个模块已经布局布线好了,模块的时序是得到保证的,高速的IP核自动布局布线很难达到高频下的时序…

pycharm中使用调试模式运行 uvicorn.run(app)报错TypeError: _patch_asyncio.locals.run() got an unexpected keywor解决

问题出现和解决过程 近期更新了pycharm版本从2023.01.06升级了2025.2.1版本,但是在升级之后,使用pycharm的调试模式运行uvicorn.run(app)报错如下: 产生过以下几个可能性猜测fastapi和uvicorn版本不匹配的问题 但是…

交换机命令

1、检查区域汇聚设备接入端口,在线端口及描述 检查在线端口命令 show int status 检查端口描述命令 show int description 登陆方式,CRT超级终端 telnet IP 地址,用户名为admin 密码见表 show run 查看现有配置 …

2025.9.25

完成了MySQL学习,开始Mybatis,Spring,SpringMVC,争取国庆前把这三个学完

空间三维坐标变换(转)-四元数-RowPitchYaw角互换

空间三维坐标变换(转)-四元数-RowPitchYaw角互换 1、空间三维坐标系的平移(矢量加法获取) 解题思路:根据适量的加法即可求解= + 2、空间三维坐标系的旋转(旋转矩阵) 关键是:姿态矩阵(或称之为“旋转矩阵”)…

易基因:Cell Rep:华农任文凯团队利用ChIP-seq及多组学解析过敏性疾病的关键调控机制|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,华南农业大学动物科学学院Yaoyao Xia、宾朋等为共同第一作者,任文凯教授为唯一通讯作者在《Cell Reports》期刊上发表题为“Glycerophospholi…

为什么做免费视频网站网站内容页相关性怎么做

目前,市场上的芯片主要包括指令集架构和数据流架构两种实现方式。指令集架构主要包括X86架构、ARM架构、精简指令集运算RISC-V开源架构,以及SIMD架构。总体来说,四者都属于传统的通用指令集架构。传统的指令集架构采用冯诺依曼计算方式&#…

网站设计自学seo的特点是什么

一、前言 最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文式1与式2中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限&am…

详细介绍:STL 容器 --- list 类

详细介绍:STL 容器 --- list 类pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

Idea代码回退已经push到远段仓库的代码分支到指定提交记录

步骤一:先打开git对应分支提交记录,回退本地代码到指定commitId。等待提交记录删除。 步骤二:找到要回退的commitId,并清除远端git提交记录Soft:仅移动分支指针,保留工作目录和暂存区的所有修改。相当于撤销了提…

开写第一篇

我的知识能力都是祂所赐的,若不靠着祂我什么也不能做 开写第一篇博客了,之前笔记也记了不少,但是没有正经的整理过,现在开始陆续整理上传。以前总是网上看别人写的技术博客,学了不少东西,希望我自己写的也能帮助…

重庆家居网站制作公司傻瓜建网站

java处理ip的工具类,包括把long类型的Ip转为一般Ip类型、把xx.xx.xx.xx类型的转为long类型、根据掩码位获取掩码、根据 ip/掩码位 计算IP段的起始IP、根据 ip/掩码位 计算IP段的终止IP等方法,可以直接使用!package com.hh.test;import java.u…

大模型function calling多轮对话开发示例

OpenAI接口支持的function calling使得大模型能够方便的集成外部能力和数据,是实现agent(智能体)的重要基础,能让LLM和各种功能集成,从而解决复杂的问题。 对于兼容openai接口的大模型如阿里的通义千问,也是可以使…

ViTables 安装与 HDF5 数据可视化全指南 - 实践

ViTables 安装与 HDF5 数据可视化全指南 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

elementuiplus修改el-checked多选框样式

elementuiplus修改el-checked多选框样式废话不多说直接上代码: 1、给check加类名 2、css样式:/deep/.image-checkbox .el-checkbox__input .el-checkbox__inner {/* 隐藏原生复选框 */display: none; }/deep/.image…