代码质量-变量的作用域最小化原则与就近原则

深入理解编程中的块作用域 在编程语言中,作用域(Scope)定义了变量、函数或标识符在程序中的可见性和生命周期。块作用域(Block Scope)是其中一种常见的作用域类型,它指的是由一对花括号{}所包围的代码区域(即一个“块”)内定义的变量,其作用范围仅限于该块内部。简单来说,在一个块(如if语句、for循环、函数体或单独的{}块)中声明的变量,只能在这个块及其嵌套的子块中被访问。一旦程序执行离开这个块,该变量就会被销毁,无法再被引用。块作用域是现代编程语言中一项重要且实用的特性。 阅读详情

代码质量-变量的作用域最小化原则与就近原则

一 变量的作用域

作用域或者可见性(visibility)指的是变量在程序内的可见和引用的范围。作用域可以看作是一种衡量变量的知名度的方法:它的名气有多大?一个作用域很小的变量只能在很小的范围内可见-比如说,循环下标变量只能用于一个循环的小范围内,一个作用域大的变量则在程序的很多地方都是可见的-比如说全局变量。

变量可以只对某一个代码块可见、也可以对子程序、类或者整个程序可见。

二 作用域最小化

那些介于同一个变量多个引用点之间的代码可称为“攻击窗口”。这个攻击窗口越分散,引起错误的可能性就越高,对它的可控制性就越差,如可能会有新代码加到这种窗口中,不当地修改了这个变量,或者阅读代码的人可能会忘记该变量应有的值。

一般而言,应使变量的作用域最小化,把变量引用点尽可能集中在一起,从而能够对变量施加控制。将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。

以下是一些可以用来减小作用域的特别有用的原则。

1、在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。

2、直到变量即将被使用时再为其赋值。

3、把相关语句放在一起。

4、把相关语句组提取成单独的子程序。

三 变量的就近原则

就近原则(Principle of Proximity)-把相关的操作放在一起,例如让注释靠近它所描述的代码,让控制循环的代码靠近循环本身等。变量的就近原则指尽可能在靠近第一次使用变量的位置声明和定义该变量。

就近原则实际上也是变量的作用域最小化的一种实现手段。过早地声明局部变量不仅会使它的作用域过早地扩展,而且结束得也过于晚了。局部变量的作用域从它被声明的点开始扩展,一直到外围块的结束处。如果变量在“使用它的块”之外被声明的,当程序退出该块之后,该变量仍是可见的。如果变量在它的目标使用区域之前或之后被意外地使用的话,后果将可能是灾难性的。

有人喜欢在方法或者子程序的开始部分统一声明和定义所有的变量,如下代码示例。这种风格会产生一些问题:

1、当使用done变量的代码开始执行的时候,done很可能已经倍修改了。即便你在第一次写这个程序的时候不会这样,后续的修改也可能会导致出现这样的错误。

2、一旦把所有的初始化代码都放在一起,可能会让人产生误解,认为所有这些变量都会在子程序中一直使用,而事实上done知识在后面才被用到。

3、可读性不好。当读到引用done变量的代码时,维护人员可能都忘记了done在哪里定义的,又需要在子程序里面来回搜寻变量的定义,迫使阅读者的目光在程序里跳来跳去。

符合就近原则也就符合作用域最小化,好的代码示例如下:

  

四 循环内局部变量代码示例

有下面2种JAVA代码示例:

  

根据变量的作用域最小化原则和就近原则,segment 1有较好的代码质量。

有人仔细思考后,会提出segment 1代码的每次循环都要重新定义value,是不是意味着每次循环都要重新在栈中分配一个局部变量?是不是性能没有segment 2好?

我们都知道在变量作用域的范围之外是不能引用这个变量的,书本上面一般都说这个变量的生存期结束了。实际上局部变量的作用域范围和生存期是语法层次上的概念。例如,在JAVA中,局部变量的大小在编译时计算出来,并放置到class文件中,然后虚拟机就能够了解到方法的栈帧需要多少内存。JAVA栈帧的局部变量区被组织为一个以字长为单位、从0开始计数的变量表数组。当虚拟机调用一个JAVA方法时,它从对应类的类型信息中得到此方法的局部变量表的大小,并据此分配栈帧内存,然后压入JAVA栈中。也就是说在方法调用之前就分配好所有的局部变量,在方法结束时随退栈操作一起释放。

我们可以对比一下segment 1和segment 2代码的字节码:

  

两个字节码唯一的区别在于局部变量value是否在循环之前被初始化了,局部变量表的大小由编译时决定的,都是value和i,仅仅是在变量表里的顺序不同。

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01 算法设计 阅读详情

相关推荐

喷雾破碎模型解析:从理论到CFD应用实践

本文深入解析喷雾破碎模型的理论基础与CFD应用实践,重点介绍KHRT、TAB和ETAB等主流模型的核心原理与工程调参技巧。通过OpenFOAM实例演示和参数优化建议,帮助工程师精准预测液滴破碎行为,提升燃烧效率与排放控制性能,适用于汽车发动机、燃气轮机等工业场景。

weixin_29281915的博客 499

java多个参数最小化,变量的作用域最小化原则

起源前几天,赵明威在图灵社区发表了“算法导论学习之补漏:斐波那契数列”,该文中最后的 Java 程序中有一个 fibonacci 函数,如左栏所示 。我在评论中指出,这个函数应该如右栏这样写:static BigInteger fibonacci(int num) {BigInteger x = BigInteger.ZERO;BigInteger y = BigInteger.ONE;BigIn...

weixin_39945871的博客 348

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 476

代码优化_变量的作用域最小化原则

今天看代码时看到下面的一段代码: public Output Validation(Input input) { bool validation = false; var output = new Output(); var account = _accountManager.GetAccount(input); if(account ...

m0_37863265的博客 837

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 173

别再搞混了!Vue3里xgplayer播放FLV视频与FLV直播流,配置到底差在哪?

本文详细解析了在Vue3项目中使用xgplayer播放FLV视频与FLV直播流的配置差异,帮助开发者避免常见错误。通过对比点播与直播的核心协议差异、插件选择及配置参数,提供实战代码示例和性能优化技巧,确保流畅播放体验。特别针对直播流场景,深入讲解专属配置和问题排查方法。

weixin_28687331的博客 150

类中成员变量的定义情况;成员变量的范围大小,那种好?

在Java的类中,变量什么时候定义为成员变量? 如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量 变量到底是大范围好,还是小范围好? 变量的范围是越小越好,因为能及时地别回收 ...

MyNavigator 360

OpenOCD入门到精通:第 1 章 OpenOCD 概述

OpenOCD是一款开源的片上调试工具,支持60+调试适配器和8大处理器架构。它提供三大核心功能:片上调试、在系统编程和边界扫描测试。作为嵌入式开发工具链的中间桥梁,OpenOCD连接上层IDE/GDB与底层硬件,采用分层架构设计实现硬件兼容性。其配置基于Tcl脚本语言,支持网络服务接口,广泛应用于ARM、RISC-V等芯片的调试与烧录场景。

从事嵌入式linux android驱动开发,拥有全栈能力 1400

成员变量和局部变量同名 / 局部变量的作用域最小化

成员变量和局部变量同名 在同一个作用域内不允许定义同名的多个变量。   在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。此时如果想要访问成员变量,可以通过 this 关键字来访问,this 关键字来访问,this 为当前实例的引用,如果要访问类变量,可以通过类名来访问。     局部变量的作用域最小化   将局部变量的作用域最小化,可增加代码的可读

heartbeaty的专栏 4191

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

简要介绍 | 两阶段点云目标检测:理论与实践

目标检测是计算机视觉中的一个重要任务,其目的是识别和定位图像中的物体。对于二维图像,这已经有许多有效的方法。然而,对于三维数据(如由LiDAR生成的点云数据),目标检测则更为复杂。

NLOS的博客 1307

java成员变量/局部变量

成员变量/局部变量

JCLWIN2017的博客 1399

第六部分:VTK进阶(第182章 体素化与隐式建模)

本文系统介绍了基于点云构建有符号距离场(SDF)的核心原理与VTK实现方法。主要内容包括:1)SDF的基本概念与算法原理,通过体素网格隐式表达几何表面;2)关键参数配置指南,如体素分辨率、边界范围和影响半径的选择;3)点云法向估计、SDF计算与等值面提取的完整工作流程;4)常见问题解决方案与性能优化建议。文中提供了详细的C++代码示例,展示从随机点云生成SDF并重建曲面的完整过程,特别强调了法向估计、参数调优和后处理等关键环节。该方法适用于点云表面重建、几何处理等应用场景。

仰望星空的博客 528

iced 秒表(Stopwatch)示例深度解析:用 Subscription 监听时间与键盘快捷键的完整实战

本文以 iced 仓库中的 `stopwatch` 示例([examples/stopwatch/README.md](https://link.gitcode.com/i/aceccf7db87d78acabb3773b644fad44))为核心,逐步剖析一个可开始/停止/复位的秒表应用从状态建模、消息驱动到视图渲染的完整实现。你将掌握 iced 中 `Subscription` 的声明式事件监

gitblog_00666的博客 784

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

读《代码大全2》笔记:使用变量的一般事项

第十章, 使用变量的一般事项 前言 利用构建活动来填补需求和架构中存在的细小间隙是一种行之有效的做法,但把蓝图设计得精细到已经能完全展现出所有的细节则实在是一种低效的做法。 10.1 数据认知 创建数据的第一步是了解所要创建的数据的种类。 10.2 轻松掌握变量定义 隐式声明: 是指你在使用一个未定义的变量的时候,编译器会自动为你声明此变量。隐式变量声明对任何一种语言来说都是最具危险

qingflyer的专栏 940

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从警告到优化:深入理解Java中@SuppressWarnings的工作原理与最佳实践

本文深入解析Java中@SuppressWarnings注解的工作原理与最佳实践,帮助开发者精准管理编译器警告。通过分析不同类型警告的处理策略、作用域控制技巧以及与代码质量工具的协同方法,提升代码质量与开发效率。特别适用于需要平衡警告提示与代码整洁度的Java项目。

yolo5detector的博客 288

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java学习--注解之@SuppressWarnings

摘要: @SuppressWarnings是Java用于抑制编译警告的注解,通过指定警告类型(如unchecked、deprecation)精准关闭非关键警告,避免干扰。其核心特性包括:支持类/方法/变量等多层级作用范围(遵循就近原则),仅编译期生效,不影响运行时。常见警告类型涉及泛型转换、过时API、未使用变量等。使用时需遵循最小范围原则(优先标注方法/局部变量而非类),优先修复警告而非抑制,严禁滥用"all"。典型场景包括抑制泛型强制转换警告、过时方法调用等,建议配合注释说明原因。该

感谢你的关注~~~~ღ( ´・ᴗ・` ) 781

为你的Java代码瘦身,看这篇就够了

黑少微服务商店(http://www.httpshop.com/) 为您分享Java代码的简洁之道。 软件质量,不但依赖于架构及项目管理,更与代码质量紧密相关。简洁高效的代码不但易于阅读,更能避免潜在BUG与风险,提高代码质量。近期,一位Oracle程序员在Hacker News上吐槽自己的工作,引起了热议。 为你的Java代码瘦身,看这篇就够了 这个工程师的核心痛点是,Oracle经历长期的产品...

qq_14826197的博客 939

JAVA基础之代码简洁之道

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34209406的博客 89

登山户外 App 深度技术解析:基于HarmonyOS API 24状态管理方面,仅使用了一个 @State 装饰的 activeTab 变量来跟踪当前激活的 Tab 页

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2501_92093170的博客 176

c语言编码规范

在写笔记之前,首先声明编码规范很重要很重要,请大家一开始就能养成一个良好的习惯,以下是我的学习笔记总结: 编码规范的目的:提高源程序的质量,可维护性。 一、命名:文件名和目录名只能使用小写,数字和下划线,文件名遵照“模块名_功能名”的格式组织 如tcp_var.h 二、代码质量保证,优先原则 1 正确性,程序要实现设计要求的功能 2稳定性 3安全性 4规范 5全局效率 6局部效率

zhaowenchaofang的专栏 1277

java list 求和_为你的Java代码瘦身,看这篇就够了

Java代码的简洁之道背景软件质量,不但依赖于架构及项目管理,更与代码质量紧密相关。简洁高效的代码不但易于阅读,更能避免潜在BUG与风险,提高代码质量。近期,一位Oracle程序员在Hacker News上吐槽自己的工作,引起了热议。这个工程师的核心痛点是,Oracle经历长期的产品线迭代,代码异常庞大、逻辑复杂,整个代码中充斥着神秘的宏命令。每新增一个特性或者修复BUG,该工程师都需要大量的调研...

weixin_39887925的博客 2371

java date 加一天_JAVA基础之代码简洁之道

今天,黑少微服务商店(www.httpshop.com)为您奉上随行付研究院的研究文章:JAVA基础之代码简洁之道。背景软件质量,不但依赖于架构及项目管理,更与代码质量紧密相关。简洁高效的代码不但易于阅读,更能避免潜在BUG与风险,提高代码质量。近期,一位Oracle程序员在Hacker News上吐槽自己的工作,引起了热议。image这个工程师的核心痛点是,Oracle经历长期的产品线迭代,代码...

weixin_39670627的博客 460
上一篇: JAVA动态代理的内部实现
下一篇: 封装的多种实现
飞天金刚
博客等级 码龄17年 35粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值