【编程好习惯】只暴露必要的变量和函数
2014-04-02 09:30
267 查看
本文出自 “至简李云”
博客,请务必保留此出处http://yunli.blog.51cto.com/831344/277424
在设计一个软件模块时,应当做到尽可能少地暴露只在模块内部使用的变量和函数,这可以通过使用static关键字做到。
当一个内部变量或函数并没有被声明成static的话,那意味着所设计的模块存在“洞”。通过这些“洞”其它的模块可以窥视到模块的内部实现,或通过这些“洞”影响模块的内部行为,而后者更加的可怕。理论上,一个模块不应当暴露任何一个内部变量,除非因为不可避免的某种因素,否则都应当通过提供函数接口的形式对变量进行存取。通过提供函数存取变量这种方式的好处是,如果某一天模块的实现需要被更改的话,完全可以让使用这一模块的用户不感知到内部实现的变化,这也正是基于接口编程所带来的好处。另外,将变量定义为static的话,可以避免在某种情形下因为各模块无意间重复定义同样的名字而导致的“离奇”软件缺陷,这类问题有时很难被查出,其跟源是C语言的编译规程无法检出它,《混淆指针和数组所导致的错误》一文解释了为什么会有这类问题发生。声明成static将导致相应的符号不会输出到目标文件的符号表中,进而就不会造成同名变量的错乱问题。最后,如果一个函数只用于模块内部使用的话,其原形声明也不应当出现在模块的头文件中。出现在头文件中的函数原型,其所隐含的意思就是这些函数是外部模块可以且仅可以调用的。
C语言在语法和语义上无法做到杜绝某些潜在的问题,或许正是因为这种不严谨给它带来了程序执行效率优势,以至于经历了三十多年的考验而依然是系统编程语言主流之一。使用了static的变量或函数,可以被他人轻松地去掉static关键字从而突破原本希望获得的限制,但无论如何static的存在都是给每一个试图这样做的人一个小小的警告
—— “我是static的,你真的想去掉我而打破原先的约束吗?”,这一警告对于一位专业的软件工程师来说能引起他必要的思考。除了这样,面对“可爱”的C语言还能怎样呢?
博客,请务必保留此出处http://yunli.blog.51cto.com/831344/277424
在设计一个软件模块时,应当做到尽可能少地暴露只在模块内部使用的变量和函数,这可以通过使用static关键字做到。
当一个内部变量或函数并没有被声明成static的话,那意味着所设计的模块存在“洞”。通过这些“洞”其它的模块可以窥视到模块的内部实现,或通过这些“洞”影响模块的内部行为,而后者更加的可怕。理论上,一个模块不应当暴露任何一个内部变量,除非因为不可避免的某种因素,否则都应当通过提供函数接口的形式对变量进行存取。通过提供函数存取变量这种方式的好处是,如果某一天模块的实现需要被更改的话,完全可以让使用这一模块的用户不感知到内部实现的变化,这也正是基于接口编程所带来的好处。另外,将变量定义为static的话,可以避免在某种情形下因为各模块无意间重复定义同样的名字而导致的“离奇”软件缺陷,这类问题有时很难被查出,其跟源是C语言的编译规程无法检出它,《混淆指针和数组所导致的错误》一文解释了为什么会有这类问题发生。声明成static将导致相应的符号不会输出到目标文件的符号表中,进而就不会造成同名变量的错乱问题。最后,如果一个函数只用于模块内部使用的话,其原形声明也不应当出现在模块的头文件中。出现在头文件中的函数原型,其所隐含的意思就是这些函数是外部模块可以且仅可以调用的。
C语言在语法和语义上无法做到杜绝某些潜在的问题,或许正是因为这种不严谨给它带来了程序执行效率优势,以至于经历了三十多年的考验而依然是系统编程语言主流之一。使用了static的变量或函数,可以被他人轻松地去掉static关键字从而突破原本希望获得的限制,但无论如何static的存在都是给每一个试图这样做的人一个小小的警告
—— “我是static的,你真的想去掉我而打破原先的约束吗?”,这一警告对于一位专业的软件工程师来说能引起他必要的思考。除了这样,面对“可爱”的C语言还能怎样呢?
相关文章推荐
- 【编程好习惯】只暴露必要的变量和函数
- Go编程——变量、函数导出与首字母大写
- python 函数、函数式编程、变量作用域、函数__doc__属性
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
- Go编程——变量、函数导出与首字母大写
- bash编程之变量替换 及 函数
- javascript基础编程の变量、对象、数据类型及函数
- Shell 编程 语法 变量 函数
- Java笔记1 Java编程基础<2>循环语句、函数(重载)、变量和数组的内存结构
- PHP编程中当函数名是变量时怎么调用
- 数式编程能将函数当成对象,可当变量,当参数-函数的类型和变量的类型并无差别
- 【编程好习惯】通过命名规则区分变量 推荐
- GPU编程自学6 —— 函数与变量类型限定符
- BCB编程IDE中查看函数或变量原型定义源码方法
- PHP编程之旅----变量、日期、数组、函数
- Delphi研究,对全局变量函数与OOP编程关系的一点体会 good
- shell脚本编程(三)——变量、常量和函数
- 【编程好习惯】判断函数的返回值
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
- Go编程——变量、函数导出与首字母大写