首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在函数中更改公共变量是可以的,还是这是不好的做法?

在函数中更改公共变量是可以的,但这通常被认为是不好的做法。以下是详细解释:

更改公共变量意味着在函数内部修改了在函数外部定义的变量。这样做可能会导致以下问题:

  1. 可读性和可维护性下降:当多个函数都可以修改公共变量时,代码变得难以理解和维护。因为无法确定哪个函数会修改变量的值,导致代码的行为变得不可预测。
  2. 并发问题:如果多个线程或进程同时访问和修改公共变量,可能会导致竞态条件和数据不一致的问题。这种情况下,需要使用锁或其他同步机制来确保数据的一致性。
  3. 调试困难:当程序出现错误时,更改公共变量的函数可能是问题的根源。由于多个函数都可以修改变量,调试问题变得更加困难,需要跟踪和分析多个函数的执行路径。

为了避免这些问题,通常建议使用函数的输入参数和返回值来传递和获取数据,而不是直接修改公共变量。这种做法被称为"封装",它提供了更好的代码组织和模块化,使得代码更易于理解、测试和维护。

如果确实需要在函数中修改公共变量,可以考虑以下方法来减少潜在的问题:

  1. 明确文档化:在函数的注释或文档中明确说明该函数会修改公共变量,并解释为什么需要这样做。
  2. 限制访问:将公共变量限制在一个特定的作用域内,只允许特定的函数修改它。这样可以减少对变量的直接访问,提高代码的可控性。
  3. 同步机制:如果多个线程或进程同时访问和修改公共变量,确保使用适当的同步机制,如锁或信号量,来避免竞态条件和数据不一致的问题。

总之,虽然在函数中更改公共变量是可行的,但应该尽量避免这种做法,以提高代码的可读性、可维护性和可靠性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在cuda的核函数中可以按地址调用普通变量么?

请问在cuda的核函数中可以按地址调用普通变量么?...但需要注意这个问题: (1)最终指向global memory地址空间的指针,可以在本次kernel启动,或者下次kernel启动的任何线程中都是有效的。...如果错误的在本次kernel启动的本block中的其他线程使用,则自动得到被替换成对应的线程的对应local memory位置的值。...另外两点需要注意的: (4)在部分平台支持P2P Access的情况下,则指向一张卡的global memory的指针,可以在另外一张卡上的kernel中被使用,类似情况(1)。...(例如可以参考Pascal具有的显存作为缓存的模式(可以看成GPU的L3 cache,或者看成GPU支持虚拟内存---例如一张3GB的卡可以使用“虚拟的“8GB的显存,并且在并非所有位置访问概率相同的情况下

3.2K70

记住,永远都不要在 Flutter 中使用全局变量

全局变量似乎是很棒的 Flutter 程序组件,因为它们被声明一次并且可以被程序中的每个函数访问。...但是,这些变量的成本比你想象的要高,主要是因为: 如果删除一个全局变量,则必须搜索整个程序并重构每个有权访问已删除全局变量的函数 它们很难测试,因为你必须在测试用例之间重置它们 很难跟踪更改,因为每个函数都可以修改全局变量...在本文中,我们将详细了解全局变量的缺点,并学习如何以更有效的方式管理状态。 Flutter 中的全局变量是什么? 全局变量是公共变量,可以被 Flutter 程序中的每个方法和对象访问。...Flutter 中使用全局变量的缺点 在 Flutter 中使用全局变量一直受到质疑和批评,通常被认为是不好的做法。以下是使用全局变量的缺点: 1....全局变量导致“面条”代码 由于程序中的每个函数都可以修改全局变量,因此很难跟踪更改。如果你正在构建一个大型应用程序,在 Flutter 中使用全局变量的情况会升级。

3.6K30
  • 干货!嵌入式C语言源代码优化方案

    ,在自带硬件乘法器的AVR单片机中,如ATMega163中,乘法运算只需2个时钟周期就可以完成。...需要特别指出的是,编译器在提取公共子表达式前不能按照代数的等价关系重新安排表达式。这时,程序员要手动地提出公共的子表达式(在VC.NET里有一项“全局优化”选项可以完成此工作,但效果就不得而知了)。...否则,请在函数一开始把指针指向的数据保存到本地变量。如果需要的话,在函数结束前拷贝回去。 不好的代码: // 假设 q !...虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。...循环不变计算 对于一些不需要循环变量参加运算的计算任务可以把它们放到循环外面,现在许多编译器还是能自己干这件事,不过对于中间使用了变量的算式它们就不敢动了,所以很多情况下你还得自己干。

    2.7K40

    代码优化技巧·代码编写好习惯·代码规范

    JDK API对于RandomAccess接口的解释是:实现RandomAccess接口用来表明其支持快速随机访问,此接口的主要目的是允许一般的算法更改其行为,从而将其应用到随机或连续访问列表时能提供良好的性能...推荐以后写并发的时候在复习一遍 代码规范 注释 不要给不好的名字加注释,一个好的名字比好的注释更重要 不要“拐杖注释”,好代码 > 坏代码 + 好注释 在文件/类级别使用全局注释来解释所有部分如何工作...,而非明显的细节 不要在代码中加入代码的著作信息,git可以干的事情不要交给代码 源代码中的html注释是一种厌物, 增加阅读难度 注释一定要描述离它最近的代码 注释一定要与代码对应 公共api需要添加注释...某个公共函数调用的私有函数紧随其后 最理想的参数是零参数,最长不要超过三个入参,尽量不要输出参数 如果函数传入三个及以上参数最好将其抽象为类 标识参数十分丑陋,向函数传入布尔值用于区分不同业务的做法很丑陋...,尽可能将条件表达为肯定形式 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言的作用范围规则 模块不应了解它所操作对象的内部情况 DTO(Data Transfer Objects)是一个只有公共变量没有函数的类

    1.2K10

    Go 进阶训练营 – Go 工程化实践三:配置管理

    expvar 包提供了一种标准化接口用于公共变量,例如针对 server 中的操作计数器; expvar 以 JSON 格式通过 HTTP 的 /debug/vars 来暴露这些变量; 针对这些公共变量的...业务配置最好做到管理后台,运营同事才好使用 全局配置 通常,我们依赖的各类组件、中间件都有大量的默认配置或者指定配置,在各个项目里大量拷贝复制,容易出现意外,不好维护。...方式二:统一使用可选函数配置 不管是根据配置文件进行配置,还是其他地方需要配置,都使用可选函数模式,不要提供多种初始化方式,这样基础库才精简。...另外毛老师说kratos讲配置定义的pb文件生成go代码时,直接额外生成转option的函数,这是不可行的,因为option是基础库里定义的,kratos现在也并没有这么做。...最佳实践 代码更改系统功能是一个冗长且复杂的过程,往往还涉及Review、测试等流程,但更改单个配置选项可能会对功能产生重大影响,通常配置还未经测试。

    45310

    C语言执行效率如何保证?

    这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。...需要特别指出的是,编译器在提取公共子表达式前不能按照代数的等价关系重新安排表达式。...这时,程序员要手动地提出公共的子表达式(在VC.NET里有一项“全局优化”选项可以完成此工作,但效果就不得而知了)。 不好的代码: float a, b, c, d, e, f;。。。...虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。...只有在递归函数需要传递大量参数,可能造成瓶颈的时候,才应该使用循环代码,其他时候,还是用递归好些。 13、变量 (1)register变量 在声明局部变量的时候可以使用register关键字。

    6.3K108

    C语言代码优化方案

    既使是在没有内置硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,执行速度快。 如果是求3次方,如: a=pow(a,3.0); 更改为: a=a*a*a; 则效率的改善更明显。...需要特别指出的是,编译器在提取公共子表达式前不能按照代数的等价关系重新安排表达式。这时,程序员要手动地提出公共的子表达式(在VC.NET里有一项“全局优化”选项可以完成此工作,但效果就不得而知了)。...虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。...只有在递归函数需要传递大量参数,可能造成瓶颈的时候,才应该使用循环代码,其他时候,还是用递归好些。 10、变量 (1)register变量 在声明局部变量的时候可以使用register关键字。...这就使得编译器把变量放入一个多用途的寄存器中,而不是在堆栈中,合理使用这种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的速度。

    6.9K108

    干货:嵌入式C语言源代码优化方案(非编译器优化)

    需要特别指出的是,编译器在提取公共子表达式前不能按照代数的等价关系重新安排表达式。这时,程序员要手动地提出公共的子表达式(在VC.NET里有一项“全局优化”选项可以完成此工作,但效果就不得而知了)。...虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。...8、函数优化 (1)Inline函数 在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。...只有在递归函数需要传递大量参数,可能造成瓶颈的时候,才应该使用循环代码,其他时候,还是用递归好些。 10、变量 (1)register变量 在声明局部变量的时候可以使用register关键字。...这就使得编译器把变量放入一个多用途的寄存器中,而不是在堆栈中,合理使用这种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的速度。

    1.6K10

    C#几个经常犯错误汇总

    1、在C#编程中,字符型类型是最容易处理出错的地方,代价是非常昂贵,在.Net Framwork中,字符串是一个相当特别的引用类型,string本省就是一个不可继承的密封类,但是它具有了值类型所应用的特点...,但是它在CLR中内存还是保存于托管堆之上,也就是说,当我们每次定义一个字符串类型的时候,就在堆内存中开辟一端内存,而当我们字符串被修改之后,它会创建一个新的内存,注意这里的内存是不连续的,而是通过修改栈内地址引用而拼凑字符串...其实在C#中,已经为我们提供了StringBuilder和String.Fromat来解决此问题,虽然他们可以实现同样的功能,但是他们有质的变化,StringBuilder在内存中开辟的是一段连续内存,...的资源处理被尽早释放,当然这个方法也适用于实现IDisposable接口的类,当时个人不推荐这样做,在非常有把握的情况下可以手动释放,但是没把握还是叫给.net系统释放,因为本身类的析构函数就实现这个方法...4、学会合理的管理公共变量,我们在系统中经常会滥用公共变量,没有做到合适的封装好。

    15710

    WordPress开发人员犯的12个最严重的错误

    这种做法不好,原因如下: 1.该文件可以随着主题的变化而变得非常大,正在积极开发中,将会增加功能,有时您将看到大小为1 MB的文件。该文件将在全站范围内加载,即使在某些页面中只需要文件中10%的代码。...2.使用那些在变量、函数、常量或类中太常见的名称 在开发插件时,最好使用一种命名约定来防止代码冲突,以防有其他插件使用相同的名称。...这就是为什么许多开发人员在他们的变量和函数名前面加上了一些与插件本身相关的独特的东西。除了消除代码冲突之外,在启用了大量插件时,还可以更容易地发现问题。...在实时环境中,这是一个推荐的选择,因为它会使私有服务器路径和脚本隐藏在公共视图中,这对于安全性原因非常有用。然而,在开发阶段,最好将它设置为“true”,因为它将通知我们代码中的任何错误。...在PHP方法中使用HTML代码通常是一种不好的做法(当然对于小的HTML代码也有例外),特别是对于一个由多个开发人员维护的插件来说。

    2.9K10

    Vuex-1 ===>vuexdemo,getters,Mutation

    其实我一开始学习看到Vuex集中式管理组件的状态,我就想这不就是一个拿公共变量吗?...不论是我们用全局配置做,还是全局变量都可以做到,甚至是利用浏览器的localstore的cookie session也不是问题啊?...}}得到counter值 我在测试的时候有在App.vue中通过点击按钮直接改变store.state.counter的值,这样虽然可以进行但是这是不对的或者说不被推荐的,理由如下 在Vuex官方文档中说到为了...比如上面的案例中,我们希望返回大于传过来的年龄的对象 注意: - 这里的getter里的函数,我们必须先返回一个函数在函数内指定接收的参数 - 并在函数内return一个返回值. 六....具体做法: 我们可以创建一个文件: mutation-types.js, 并且在其中定义我们的常量.

    1.1K30

    深入理解 JavaScript 立即执行函数表达式(IIFE)

    IIFE(Immediately Invoked Function Expression)是一种 JavaScript 函数的写法,这种函数在定义后立即执行。...它的基本语法是: (function() { // 函数体 })(); IIFE 的组成部分 一个 IIFE 主要包含三个部分: 第一个括号 () 包裹函数定义,将函数声明转换为表达式 函数体部分包含实际要执行的代码...避免全局作用域污染 // 不好的做法 var counter = 0; function increment() { counter++; } // 使用 IIFE 的好做法 var counter...,外部无法直接访问 如果需要访问全局变量,可以将它们作为参数传入 IIFE 可以有返回值,常用于模块化开发 现代 JavaScript 开发中,可以使用模块系统代替 IIFE 总结 立即执行函数表达式(...IIFE)是 JavaScript 中一个重要的概念,它能: 创建独立的作用域 避免全局污染 实现模块化 保护私有变量 虽然在现代 JavaScript 开发中,我们有了更多选择(如模块系统),但理解

    11910

    新一代响应式设计:适应多设备的最佳解决方案

    因为无论我是“移动优先”还是“桌面优先”,我都会发现自己需要大量的CSS覆盖!而且如果有一件事我在CSS中学到的,那就是CSS覆盖是邪恶的!...创建一个 SASS 文件(例如:_devices.scss),将常见的断点作为变量。 现在只需使用变量即可: 当设计师突然觉得断点需要更改时,这个技巧可以帮助您避免更改大量代码行。...网络上的常见做法是使用仅以最小宽度为起点而没有最大宽度的断点(称之为“开放式断点”),这是一个非常大的问题!你问为什么?因为你几乎无法控制上层断点会受到什么影响!...您可以在同一个媒体查询中使用尽可能多的断点,使用逗号(表示“或”),因为我们已经将这些断点保存在变量中,所以可以轻松使用它们。 CSS封装的威力与闭合断点 现在让我们再来看看这个主标题组件。...总结 从这篇文章中需要了解的重点是什么: 以小组件为单位工作 在单独的文件中定义SASS变量中的常见闭合断点 在每个需要的组件中使用SASS变量的断点 工作和思考时要“基本优先”!

    31230

    Vue中的15个最佳做法

    这是很有必要的,这样Vue就可以跟踪组件状态,并对不同的元素有一个常量引用。在使用动画或Vue转换时,key 非常有用。 如果没有key ,Vue只会尝试使DOM尽可能高效。...2.在事件中使用短横线命名 在发出定制事件时,最好使用短横线命名,这是因为在父组件中,我们使用相同的语法来侦听该事件。...我们通过在函数中返回数据对象来实现这一点。 // 好的做法 data () { return { name: 'My Window', articles: [] } } 5....// 不好的做法 问题是在 Vue 优先使用v-for指令,而不是v-if指令。...另外,通过使用webpack导入功能,我们可以搜索与命名约定模式匹配的组件,并将所有组件自动导入为Vue项目中的全局变量。

    1.3K10

    读《代码整洁之道》

    远离重复,拒绝重复,方法有很多,抽象到基类或放到底层公共类库中。 没有人能一次性就将函数写的很完美,好的函数是通过重构得到的。...有的开发人员喜欢在注释中签上自己的名字,这种做法也没没有必要,因为我们有源码管理工具。...单元测试的好处: 有了测试不用担心对代码的修改 有了测试可以毫无顾虑的去改进架构和设计 如果您是做项目,快速满足客户需求就可以了,没有必要在项目中添加单元测试,如果是开发产品,单元测试还是非常重要的,因为产品的快速迭代就像在给高速飞行中的飞机加油一样...类 类通常由变量、属性和方法组成。按照书中所讲的Java的约定,类应该由一组变量开始,如果有静态公共常量,应该放在前面,然后是私有静态变量和私有实体变量。...公共函数跟在变量之后,一些供公共函数调用的私有工具函数在公共函数之后。 和函数一样,类也应该要尽可能的短小。但和函数不同不是以代码行数来权衡,而是以职责。

    89620

    【译】编写高质量JavaScript模块的4个最佳实践

    这篇文章介绍了有关如何更好地组织JavaScript模块的4种最佳实践。 1.优先使用命名导出 当我开始使用JavaScript模块时,我使用默认的语法来导出模块定义的单个块,不管是类还是函数。...`; } } 随着时间的推移,我注意到了重构默认导出的类(或函数)的困难。在重命名原始类时,使用者模块中的类名没有改变。 更糟糕的是,编辑器没有提供有关要导入的类名的自动完成建议。...: JSON.parse(bigJsonString) }; 这是一个问题,因为bigJsonString的解析是在模块级范围内完成的。...,模块级范围的作用是定义模块组件、导入依赖项和导出公共组件:这是依赖项解析过程。...3.尽可能的使用高内聚模块 内聚性描述了模块内部各个组件在一起的程度。 高内聚模块的函数、类或变量是密切相关的。他们专注于单个任务。

    98320

    如何写出优雅的 JS 代码,变量和函数的正确写法

    在开发中,变量名,函数名一般要做到清晰明了,尽量做到看名字就能让人知道你的意图,所以变量和函数命名是挺重要,今天来看看如果较优雅的方式给变量和函数命名。...无需添加不必要的上下文 如果类名/对象名已经说明了,就无需在变量名中重复。...一个很好的解决方案是addItemToCart总是克隆cart数组,编辑它,然后返回克隆。这可以确保购物车引用的其他函数不会受到任何更改的影响。...JS 中是一种不好的做法,因为可能会与另一个库发生冲突,并且在他们的生产中遇到异常之前,API 的用户将毫无用处。...当具有if语句的类和函数时,这是在告诉你的使用者该函数执行不止一件事情。 不好的写法 class Airplane { // ...

    3.8K30

    动态调整 tkinter 中 Spinbox 的范围

    在 Tkinter 中,Spinbox 的范围可以动态调整,这需要使用 Spinbox 的 config 方法来更新其参数,如 from_ 和 to。...如果有人知道哪里可以找到纯 Python/tkinter“日期和时间输入”小部件的公共领域源代码(理想情况下,它可以处理闰年和所有月末情况),则请向我指出该存储库,不胜感激。...我能找到的最接近的解决方案是这个 OptionMunu 解决方案(根据另一个 OptionMenu 中的选择更改 OptionMenu),但由于“不隐藏”要求,无法使用它。...对于这两个问题,我考虑了 LEGB 问题,但没有嵌套函数,因此变量隐藏不应该成为问题——除非我的变量重复并隐藏了在 tkinter 等中定义的变量。我错过了什么?...这种做法与其他小部件的唯一区别是,这是一个 StringVar 而不是一个 IntVar,并且月 Spinbox 有一个 values 参数。

    5810

    开源测试平台横向测评系列『流马』篇:测试界的“木流牛马”

    Metersphere的公共参数是放在环境中进行管理,它是一个环境下挂多个变量的概念,而流马中环境则是和变量进行分开,一个项目可以新增多个环境,一个项目可以新增多个公共参数,环境和公共参数之间互不干扰。...函数,引用方式见下图标: 添加、引用自定义函数 某些情况下,内置函数可能无法满足生成参数的需求,这是则可以创建一些自定义函数。...类型变量: 参数值没加引号、在传参时不会自动带上引号 也不能在定义变量时给参数值加上引号 只能在接口引用变量时,外层带上双引号 举个例子可能会直白一点: 假如我们登录接口需要传入密码参数,而我们提前在公共参数中定义了这个变量...举个例子,如果我只在测试用例A中添加或更改了某个接口的请求头,那么其他测试用例B、C、D中则需要一一更改。...(value)来返回 接口header和用例断言中都可以引用公共参数和提取的变量,但是提取的变量值传参时如果类型不同、需要提前转换类型 用例中,如果用到了一些自定义的公共参数或自定义函数,需要将其一一勾选导入

    2.2K10
    领券