聚集网(jujiwang.com) - 收录免费分类目录信息软文发布网址提交
免费加入

全局变量的陷阱:避免代码异味和维护难题 (全局变量的陷阱有哪些)

文章编号:11669时间:2024-10-01人气:


引言

全局变量是一种在程序的任何地方都可以访问和修改的变量。虽然它们在某些情况下很有用,但滥用全局变量会给代码带来一系列问题,包括代码异味和维护难题。

全局变量的陷阱避免代码异味和维护难题全局

全局变量的陷阱

  • 可变性:全局变量是可变的,这意味着它们的价值可以在程序运行时随时改变。这可能导致难以追踪代码的执行流,并可能导致难以发现的错误。
  • 隐式依赖:全局变量会被程序的不同部分隐式依赖。这会使代码难以理解和维护,因为它不容易看到哪些部分依赖于哪个全局变量。
  • 命名空间污染:全局变量会污染全局命名空间,这可能会导致名称冲突和代码难以阅读
  • 测试困难:由于全局变量的不可预测性,测试使用全局变量的代码可能会很困难。
  • 并发问题:在多线程环境中,全局变量可能会引起并发问题,例如竞争条件。

避免全局变量

为了避免全局变量的陷阱,有以下一些最佳实践:

  • 局部化变量:尽可能将变量限制在它们被使用的局部作用域内。这有助于减少可变性和隐式依赖。
  • 使用参数和返回值:使用函数参数和返回值来传递数据,而不是使用全局变量。这有助于显式依赖关系并减少命名空间污染。
  • 使用对象和数据结构:将相关数据组织到对象或数据结构中。这有助于将代码组织起来并减少全局变量的需要。
  • 使用依赖注入:使用依赖注入框架来管理变量的依赖关系。这有助于确保代码的可测试性并减少隐式依赖。

结论

全局变量是一种有价值的工具,但它们也可能带来一系列问题。通过遵循这些最佳实践,您可以避免全局变量的陷阱,编写更健壮、更易维护的代码。


独家秘籍!如何写出让同事无法维护的代码?-

对,你没看错,本文就是教你怎么写出让同事无法维护的代码。

一、程序命名

容易输入的变量名。比如:Fred,asdf

单字母的变量名。比如:a,b,c, x,y,z(如果不够用,可以考虑a1,a2,a3,a4,….)

有创意的拼写错误。 比如:SetPintleOpening, SetPintalClosing。 这样可以让人很难搜索代码。

抽象。 比如:ProcessData, DoIt, GetData… 抽象到就跟什么都没说一样。

缩写。比如:WTF,RTFSC …… (使用拼音缩写也同样给力,比如:BT,TMD,TJJTDS)

随机大写字母。比如:gEtnuMbER..

重用命名。 在内嵌的语句块中使用相同的变量名有奇效。

使用重音字母。比如:int ínt(第二个 ínt不是int)

使用下划线。 比如:_, __, ___。

使用不同的语言。 比如混用英语,德语,或是中文拼音。

使用字符命名。比如:slash, ASTerix, comma…

使用无关的单词。比如:god, superman, iloveu….

混淆l和1。 字母l和数字1有时候是看不出来的。

二、伪装欺诈

把注释和代码交织在一起。

total += array[j+0 ];

total += array[j+1 ];

total += array[j+2 ]; /* Main body of

total += array[j+3]; * loop is unrolled

total += array[j+4]; *forgreater speed.

total += array[j+5]; */

total += array[j+6 ];

total += array[j+7 ];

代码和显示不一致。比如,你的界面显示叫postal code,但是代码里却叫 zipcode.

隐藏全局变量。 把使用全局变量以函数参数的方式传递给函数,这样可以让人觉得那个变量不是全局变量。

使用相似的变量名。 如:单词相似,swimmer 和 swimner,字母相似:ilI1| 或 oO08。 parselnt 和 parseInt, D0Calc 和 DOCalc。 还有这一组:xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z。

重载函数。 使用相同的函数名,但是其功能和具体实现完全没有关系。

操作符重载。 重载操作符可以让你的代码变得诡异,感谢CCTV,感谢C++。 这个东西是可以把混乱代码提高到一种艺术的形式。 比如:重载一个类的 ! 操作符,但实际功能并不是取反,让其返回一个整数。 于是,如果你使用 ! ! 操作符,那么,有意思的事就发生了—— 先是调用类的重载 ! 操作符,然后把其返回的整数给 ! 成了 布尔变量,如果是 !!! 呢?呵呵。

三、文档和注释

在注释中撒谎。 你不用真的去撒谎,只需在改代码的时候不要更新注释就可以了。

注释里面写废话。比如:/* add 1 to i */

只注释是什么,而不是为什么。

不要注释秘密。 如果你开发一个航班系统,请你一定要保证每有一个新的航班被加入,就得要修改25个以上的位置的程序。 千万别把这个事写在文档中。

注重细节。 当你设计一个很复杂的算法的时候,你一定要把所有的详细设计都写下来,没有100页不能罢休,段落要有5级以上,段落编号要有500个以上,例如:1.2.4.6.3.13 – Display all impacts for activity where selected mitigations can apply (short pseudocode omitted). 这样,当你写代码的时候,你就可以让你的代码和文档一致,如:Act1_2_4_6_3_13()千万不要注释度衡单位。 比如时间用的是秒还是毫秒,尺寸用的是像素还是英寸,大小是MB还是KB。 等等。 另外,在你的代码里,你可以混用不同的度衡单位,但也不要注释。

Gotchas 。 陷阱,千万不要注释代码中的陷阱。

在注释和文档中发泄不满。

四、程序设计

Java Casts。 Java的类型转型是天赐之物。 每一次当你从Collection里取到一个object的时候,你都需要把其转回原来的类型。 因些,这些转型操作会出现在N多的地方。 如果你改变了类型,那么你不一定能改变所有的地方。 而编译器可能能检查到,也可能检查不到。

利用Java的冗余。 比如:Bubblegum b = new Bubblegom(); 和 swimmer = swimner + 1; 注意变量间的细微差别。

从不验证。 从不验证输入的数据,从不验证函数的返回值。 这样做可以向大家展示你是多么的信任公司的设备和其它程序员

不要封装。 调用者需要知道被调用的所有的细节。

克隆和拷贝。 为了效率,你要学会使用copy + paste。 你几乎都不用理解别人的代码,你就可以高效地编程了。

巨大的listener。 写一个listener,然后让你的所有的button类都使用这个listener,这样你可以在这个listener中整出一大堆if…else…语句,相当的刺激。

使用三维数组。 如果你觉得三维还不足够,你可以试试四维。

混用。 同时使用类的get/set方法和直接访问那个public变量。 这样做的好处是可以极大的挫败维护人员。

包装,包装,包装。 把你所有的API都包装上6到8遍,包装深度多达4层以上。 然后包装出相似的功能。

排列和阻碍。 把drawRectangle(Height, width) 改成 drawRectangle(width, height),等release了几个版本后,再把其改回去。 这样维护程序的程序员们很快就不明白哪一个是对的。

把变量改在名字上。 例如,把setAlignment(int alignment)改成,setLeftAlignment, setRightAlignment, setCenterAlignment。

保留你所有的没有使用的和陈旧的变量,方法和代码。

Final你所有的子结点的类,这样,当你做完这个项目后,没有人可以通过继承来扩展你的类。不也是这样吗?

避免使用layout。 这样就使得我们只能使用绝对坐标。 如果你的老大强制你使用layout,你可以考虑使用GridBagLayout,然后把grid坐标hard code.

环境变量。 如果你的代码需要使用环境变量。 那么,你应该把你的类的成员的初始化使用环境变量,而不是构造函数。

使用全局变量。 1)把全局变量的初始化放在不同的函数中,就算这个函数和这个变量没有任何关系,这样能够让我们的维护人员就像做侦探工作一样。 2)使用全局变量可以让你的函数的参数变得少一些。

配置文件。 配置文件主要用于一些参数的初始化。 在编程中,我们可以让配置文件中的参数名和实际程序中的名字不一样。

膨胀你的类。 让你的类尽可能地拥有各种臃肿和晦涩的方法。 比如,你的类只实现一种可能性,但是你要提供所有可能性的方法。 不要定义其它的类,把所有的功能都放在一个类中。

使用子类。 面向对象是写出无法维护代码的天赐之物。 如果你有一个类有十个成为(变量和方法)你可以考虑写10个层次的继承,然后把这十个属性分别放在这十个层次中。 如果可能的话,把这十个类分别放在十个不同的文件中。

混乱你的代码。 使用XML。 XML的强大是无人能及的。 使用XML你可以把本来只要10行的代码变成100行。 而且,还要逼着别人也有XML。 (参看,信XML得永生,信XML得自信)

分解条件表达式。如:把 a==100分解成,a>99 && a<101

学会利用分号。如:if ( a );else;{ int d; d = c;}

间接转型。如:把double转string,写成new Double(d)() 而不是 (d)

大量使用嵌套。 一个NB的程序员可以在一行代码上使用超过10层的小括号(),或是在一个函数里使用超过20层的语句嵌套{},把嵌套的if else 转成 [? :] 也是一件很NB的事。

长代码行。 一行的代码越长越好。 这样别人阅读时就需要来来回回的

不要过早的return。 不要使用break,这样,你就需要至少5层以上的if-else来处理错误。

不要使用{}。 不要在if else使用{},尤其是在你重量地使用if-else嵌套时,你甚至可以在其中乱缩进代码,这样一来,就算是最有经验的程序员也会踩上陷阱。

琐碎的封装。比较封装一个bool类,类里面什么都做,就是一个bool.

循环。千万不可用for(int i=0; i

五、测试

从不测试。 千万不要测试任何的出错处理,从来也不检测系统调用的返回值。

永远不做性能测试。 如果不够快就告诉用户换一个更快的机器。 如果你一做测试,那么就可能会要改你的算法,甚至重设计,重新架构。

不要写测试案例。 不要做什么代码覆盖率测试,自动化测试。

测试是懦夫行为。 一个勇敢的程序员是根本不需要这一步的。 太多的程序太害怕他们的老板,害怕失去工作,害怕用户抱怨,甚至被起诉。 这种担心害怕直接影响了生产力。 如果你对你的代码有强大的信心,那还要什么测试呢?真正的程序员是不需要测试自己的代码的。

六、其他

你的老板什么都知道。 无论你的老板有多SB,你都要严格地遵照他的旨意办事,这样一来,你会学到更多的知识以及如何写出更加无法维护的代码。

颠覆Help Desk。 你要确保你那满是bug的程序永远不要被维护团队知道。 当用户打电话和写邮件给你的时候,你就不要理会,就算要理会,让用户重做系统或是告诉用户其帐号有问题,是标准的回答。

闭嘴。 对于一些像y2k这样的大bug,你要学会守口如瓶,不要告诉任何人,包括你的亲人好友以及公司的同事和管理层,这样当到那一天的时候,你就可以用这个bug挣钱了。

忽悠。 你会学会忽悠,就算你的代码写得很烂,你也要为其挂上GoF设计模式的标签,就算你的项目做得再烂,你也要为其挂上敏捷的标签,让整个团队和公司,甚至整个业界都开始躁动,这样才能真正为难维护的代码铺平道路。

总之,我们的口号是—— Write Everywhere, Read Nowher

转自:

java的全局变量有哪些作用?

Java 中的全局变量 (也称为静态变量) 是在类中定义的,并且可以被该类的所有对象共享。 它们可以通过类名加上变量名来访问。

全局变量有以下作用:

全局变量可以帮助维护类的状态,并且可以在不同的方法之间共享信息。 但是,全局变量也有一些缺点,例如容易导致命名冲突,并且不利于代码的封装和重用。 因此,在设计类时应谨慎使用全局变量。

在Java中使用全局变量/常量

在Java中,尽管不存在全局变量的概念,但可以通过创建引用类或常量类来实现类似功能。 这种方法可以帮助在多个类或方法之间共享和访问全局值,同时保持代码结构的清晰性和可维护性。 全局变量的缺点之一是可能引发命名冲突和维护问题。 当多个位置都引用相同的变量时,可能出现混淆,如变量名可能被误解为在不同上下文中具有不同含义。 而在Java中,通过将相关变量和方法封装在类中,可以避免这些问题。 创建一个引用类,例如`Reference`类,可以将多个全局值集中在一个位置,这样可以在其他代码片段中轻松访问这些值。 这种方法有助于保持代码的组织性和可读性。 当需要使用常量值时,可以使用`final`关键字声明变量,并通过`get`方法提供访问途径,从而确保这些值在程序运行时保持不变。 这种方法确保了代码的稳定性和减少潜在的错误。 另一种实现全局值共享的方式是在应用程序中定义常量类,这些类包含一组经常使用的不可变值。 通过这种方式,可以在整个程序中通过类的公共访问者轻松访问这些值,从而提高代码的可维护性和可读性。 总之,在Java中模拟全局变量需要采取其他策略,如创建引用类或常量类,以实现代码的清晰性、可维护性和避免潜在的命名冲突问题。 最终,是否使用这些策略取决于项目的具体需求和团队的编程实践。

global是什么

global是计算机编程中的一个关键字。

在计算机编程中,global关键字主要用于声明一个变量是全局变量。 全局变量在整个程序的执行过程中都是可见的,并且可以在程序的任何位置被访问和修改。 这意味着无论在哪个函数或代码块中,只要知道全局变量的名称,就可以对其进行操作。 这对于在不同函数或代码块之间共享数据非常有用。 但在使用时要注意,过多使用全局变量可能导致代码难以维护和理解,因为全局变量的修改可能会影响整个程序的行为。 因此,应该谨慎使用全局变量。 它们通常在某些特定场景下才需要被使用。 除此之外,为了避免命名冲突,通常会采用特定的命名规则来标识全局变量。 总的来说,global关键字是编程中用于声明全局变量的一个重要工具。

全局变量使用注意

全局变量的应用有其特定的考虑因素:

首先,全局变量可能会占用额外的内存,由于其生命周期较长,特别是在内存资源有限的过去,这可能是个问题。但在现代计算机配置中,除非涉及大型对象,否则内存占用影响不大,尽量减少其使用。

其次,尽管在程序运行时,全局变量可以减少内存分配的开销,但实际上,这种速度提升在今天已经微不足道。

局部变量的名字空间污染是另一个需关注的点。在变量使用不多的情况下,可以通过合理规划避免这种冲突。当全局和局部变量重名时,通常局部变量会优先生效,全局变量会被掩盖。

此外,全局变量的声明可以使用extern关键字,使其在声明处至文件结束范围内有效。 这在需要跨函数访问全局变量时很有用。

总的来说,尽管全局变量在某些情况下是可用的,但在使用时需谨慎。 应确保变量名清晰易懂,避免过短,以减少名字空间的混乱。 同时,尽量避免使用大型对象作为全局变量,以维护代码的高效和清晰。

例如,全局变量的声明方式如下:

extern Global y As String

相关标签: 全局变量的陷阱有哪些全局变量的陷阱避免代码异味和维护难题

上一篇:全局变量的替代方案探索替代选项以提高代码

下一篇:全局变量的奥秘探索其在软件开发中的角色和

内容声明:

1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/80238cd05d98a0c8baad.html,复制请保留版权链接!


温馨小提示:在您的网站做上本站友情链接,访问一次即可自动收录并自动排在本站第一位!
随机文章
Contactsprovider 的终极指南:简化您的联系人管理并实现卓越 (contact 翻译)

Contactsprovider 的终极指南:简化您的联系人管理并实现卓越 (contact 翻译)

在当今快节奏的商业环境中,有效管理联系人对于成功至关重要,Contactsprovider是一款功能强大的联系人管理系统,旨在简化这一流程,帮助您建立和维护强大的商业关系,Contactsprovider的主要功能中央联系人数据库,在单一平台上集中存储和管理所有联系人,高级搜索和过滤,快速轻松地找到您需要的信息,使用多种搜索和过滤选项...。

互联网资讯 2024-09-30 16:42:06

揭秘迭代器的内部机制:范围 for 循环、指向器和解引用 (迭代器的原理)

揭秘迭代器的内部机制:范围 for 循环、指向器和解引用 (迭代器的原理)

引言在Python中,迭代器是一种对象,它允许我们按顺序访问其元素,迭代器被广泛用于各种操作,例如遍历列表、元组和字典等集合结构,理解迭代器的内部机制对于充分利用它们至关重要,迭代器的原理一个迭代器本质上是一个双指针系统,它包含两个指向底层集合中的元素的指针,当前指针和下一个指针,当我们调用next,方法时,当前指针移动到下一个元素...。

技术教程 2024-09-27 12:05:35

掌握JSP编程的精髓:通过源代码分析深入理解技术原理 (jsp编程技巧)

掌握JSP编程的精髓:通过源代码分析深入理解技术原理 (jsp编程技巧)

简介JSP,JavaServerPages,是一种基于Java的服务器端技术,用于开发动态的Web页面,它允许开发人员在HTML中嵌入Java代码,从而创建交互式和动态的Web应用程序,为了深入理解JSP编程的底层原理,分析源代码至关重要,文章将通过源代码示例逐行分析JSP的工作原理,帮助你掌握其核心技术原理,源代码分析示例JSP页面...。

本站公告 2024-09-24 11:39:22

适用于WinForms应用程序的Menustrip指南:自定义和实现 (适用于windows10version22h2的08累积更新)

适用于WinForms应用程序的Menustrip指南:自定义和实现 (适用于windows10version22h2的08累积更新)

简介Menustrip控件是一个Windows窗体应用程序中常用的GUI元素,它提供了一种组织和展示菜单命令的分层方式,它允许用户通过单击菜单项来执行应用程序中的各种操作,本文将提供一个全面的指南,指导您如何自定义和实现WinForms应用程序中的Menustrip控件,包括菜单项的添加、删除、启用和禁用,以及处理菜单事件,创建Men...。

本站公告 2024-09-23 05:25:19

利用 C 语言库中的多线程功能 (c语言写库)

利用 C 语言库中的多线程功能 (c语言写库)

前言多线程是一种并发编程技术,它允许一个程序同时执行多个任务,在C语言中,多线程可以通过使用C11标准中引入的线程库来实现,本篇文章将介绍如何使用C语言库中的多线程功能来创建和管理线程,创建线程要在C语言中创建线程,可以使用`pthread,create`函数,该函数需要三个参数,线程ID指针,用于存储新创建线程的ID,线程属性,用于...。

本站公告 2024-09-12 15:06:09

在游戏中使用随机数函数:带来不可预测性和兴奋感 (王者荣耀动作怎么在游戏中使用)

在游戏中使用随机数函数:带来不可预测性和兴奋感 (王者荣耀动作怎么在游戏中使用)

随机数函数是现代游戏中必不可少的工具,它为游戏玩法带来了不可预测性和令人兴奋的可能性,不可预测性随机数函数可以为游戏注入不可预测性,使其更具挑战性和吸引力,例如,在,王者荣耀,中,每次攻击都会触发随机数计算,这会影响攻击的伤害输出,这意味着即使是最有经验的玩家也无法准确预测每次攻击的结果,增加了游戏的兴奋感,兴奋感随机数函数还能够通过...。

本站公告 2024-09-11 09:31:08

图像处理在医疗保健中的应用:提高诊断和治疗 (图像处理在医疗方面的应用)

图像处理在医疗保健中的应用:提高诊断和治疗 (图像处理在医疗方面的应用)

图像处理技术在医疗保健领域发挥着越来越重要的作用,为提高诊断和治疗效果提供了强大的工具,图像处理的作用提供更清晰的图像,图像处理可以去除图像中的噪点和伪影,从而产生更清晰、更准确的图像,增强对比度和亮度,图像处理可以增强图像中的对比度和亮度,使诊断更容易,分割图像,图像处理可以将图像分割成不同的区域,便于分析和识别异常情况,提取特征,...。

技术教程 2024-09-10 09:53:48

揭秘百度搜索的奥秘:10条必知的规则 (揭秘百度搜索软件)

揭秘百度搜索的奥秘:10条必知的规则 (揭秘百度搜索软件)

百度是中国最大的搜索引擎,也是全球最大的搜索引擎之一,它每天处理数十亿次搜索请求,并向用户提供广泛的信息和服务,为了有效地使用百度搜索,了解其背后的规则非常重要,这些规则有助于确定搜索结果的顺序和相关性,10条必知的百度搜索规则关键词相关性,百度会优先显示与搜索词高度相关的网页,网站权威性,百度会给来自权威网站的网页更高的排名,例如政...。

最新资讯 2024-09-09 18:22:52

淘宝导航CSS自定义秘籍:提升美观和实用性的利器 (淘宝导航css代码编辑器)

淘宝导航CSS自定义秘籍:提升美观和实用性的利器 (淘宝导航css代码编辑器)

前言淘宝导航是淘宝网为用户提供便捷购物入口的导航工具,通过自定义导航的CSS样式,我们可以提升导航的美观性和实用性,为用户带来更好的使用体验,基础语法要自定义淘宝导航的CSS,我们需要了解一些基础的CSS语法,以下是几个常用的CSS属性,color,设置文本颜色background,color,设置背景颜色font,size,设置字体...。

互联网资讯 2024-09-09 04:44:41

实用导向:本书注重实用性,提供了丰富的代码示例和演练,帮助读者掌握 Java 并在实际项目中应用它。(坚持实用导向)

实用导向:本书注重实用性,提供了丰富的代码示例和演练,帮助读者掌握 Java 并在实际项目中应用它。(坚持实用导向)

坚持实用导向本书是一本以实用性为导向的Java学习指南,旨在帮助读者掌握Java语言并将其应用到实际项目中,它包含了丰富的代码示例和演练,使读者能够动手实践,学以致用,丰富的代码示例,本书附有大量详尽的代码示例,涵盖了Java语言的各个主要概念和技术,这些示例易于理解,并且提供了清晰的解释,让读者能够深入理解代码的含义和用法,循序渐进...。

最新资讯 2024-09-06 11:48:57

正则表达式完全指南:从基础到高级应用 (正则表达式完全匹配一个字符串)

正则表达式完全指南:从基础到高级应用 (正则表达式完全匹配一个字符串)

完全匹配一个字符串正则表达式中,要完全匹配一个字符串,可以使用和符号,表示字符串的开始,表示字符串的末尾,例如,要匹配字符串Hello,可以使用以下正则表达式,```^Hello$```这个正则表达式将匹配字符串Hello,但不会匹配HelloWorld或Hello,这是因为和符号确保了正则表达式只匹配与目标字符串完全匹配的字符串,...。

本站公告 2024-09-05 23:01:55

从迷信到科学:1982年安阳灵异事件引发的大众争论 (迷信的科学依据)

从迷信到科学:1982年安阳灵异事件引发的大众争论 (迷信的科学依据)

在科学与迷信的界限上,1982年发生的安阳灵异事件引发了一场激烈的争论,这一事件不仅震惊了中国,也引起了国际社会的广泛关注,并引发了人们对迷信与科学关系的深入思考,安阳灵异事件1982年3月9日,河南省安阳市郊的一间农舍里发生了离奇的事件,据目击者称,这间农舍时常出现奇怪的响动、物体自行移动、玻璃破碎等现象,更有甚者,一些目击者还声称...。

互联网资讯 2024-09-03 05:54:47