什么时候才能成为一个专业程序员呢?三年还是五年工作经验?其实不用的,你马上就可以了,我没有骗你,因为专业程序员与业余程序员的区别主要在于一种态度,如果缺乏这种态度,拥有十年工作经验也还是业余的。
什么态度?专业态度!也就是星爷常说的专业精神。专业态度有多种表现形式,以后我们会一一介绍的。这里先介绍一下有关形象的态度,专业的程序员是很注重自己的形象的,当然程序员的形象不是表现在衣着和言谈上,而是表现在代码风格上,代码就是程序员的社交工具,代码风格可是攸关形象的大事。
有人说过,傻瓜都可以写出机器能读懂的代码,但只有专业程序员才能写出人能读懂的代码。作为专业程序员,每当写下一行代码时,要记得程序首先是给人读的,其次才是给机器读的。你要从一个业余程序员转向专业程序员,就要先从代码风格开始,并从此养成一种严谨的工作态度,生活上的不拘小节可不能带到编程中来。
代码风格有很多种,Windows 和Linux都有自己主流的代码风格,每个团队、每个公司也可能有自己的代码风格,争论哪种风格好哪种风格坏根本没有什么意义。有助于其他程序员理解的代码风格都是可以接受的,因为遵循特定代码风格的目的就是为了便于交流。
1 命名要展示对象的功能
1.1 文件名
文件名一定要能传达文件的内容信息,别人一看到文件名就能知道文件中放的是什么内容。把一个类的代码或者某一类代码放在一起是好的习惯,这样就很容易给文件取一个直观的名字。业余爱好者常常把很多没关系的代码糅到一个文件中,结果造成代码杂乱无章,也很难给它取一个恰当的名字.
1.2 函数名
单词小写,多个单词用下划线分隔。如:find_node
一个函数只完成单一功能。不要用代码的长度来衡量是否要把一段代码独立成一个函数。即使只有几行代码,只要这些代码完成的是一项独立的功能,都应该将其写为一个单独的函数,而函数名要能够直观地反应出它的功能。如果在给函数起名时遇到了困难,通常是函数设计不合理,则应该仔细思考一下并对函数进行相应修改。
1.3 结构/枚举/联合名
首字母大写,多个单词连写。如:struct _DListNode
宏名:单词大写,多个单词下划线分隔。
如:#define MAX_PATH 260
变量名:单词小写,多个单词下划线分隔。
如:DListNode* node = NULL;
1.4 面向对象命名方式
(1) 以对象为中心,采用“主语(对象)+谓语(动作)”的形式来命名,取代传统的“谓语(动作)+宾语(目标)”的形式。
如:dlist_append
(2) 第一个参数为对象,并用thiz命名。
如:dlist_append(DList* thiz, void* value);
(3) 对象有自己的生命周期,因此都有相应的创建和销毁函数。
2 排版布局要美观大方
2.1 合理使用空行
函数体之间用空行分隔。
结构/联合/枚举声明用空行分隔。
不同功能的代码块之间用空行分隔。
将功能类似的代码(如宏定义、类型定义、函数声明和全局变量)放在一起,和其他部分用空行分隔。
使用空行时,一行就够了,不要使用连续多个空行,那样会让人感觉代码段空荡荡的。
2.2 合理使用空格
等号两边用空格。如:int a = 100;
参数之间用空格。如:test(int a, int b, int c)
语句末的分号与前面内容不要加空格。如:test(a, b, c);
其他能让代码更美观的地方。
2.3 合理使用括号
用括号分隔子表达式,不要只靠默认优先级来判断。((a && b) || (c && d))
用括号分隔if/while/for等语句的代码块,那怕代码只有一行。
2.4 合理缩进
每一级都正常缩进,用tab缩进取代空格缩进(Linux内核源代码也遵循此规则)。用空格缩进的目的是防止代码因编辑器的tab宽度不同而变乱,这个担心现在是多余的 了,代码编辑器都支持tab宽度设置了。如果代码缩进的层次太多(比如超过三层),则可能是代码设计上出了问题。
2.5 遵从团队的习惯
这一点是最重要的,一个团队就要有一个团队的样子,不管你的水平有多高,遵循团队的规则是一个程序员的基本素养。如果团队的规则确实不好,大家应该一起完善它。做到这一点,你已经离成为专业程序员这个目标更近一步了,重新做一遍练习吧。随着后面的学习,你就可以真正走进专业程序员这个行列了。
3 谁动了你的隐私
3.1 什么是封装
人有隐私,程序也有隐私。有隐私不是什么坏事,问题是不应该让别人知道自己的隐私,否则可能会对自己造成不小的伤害,甚至会连累相关人物跟着倒霉。程序隐私的暴露,造成的不良影响不一定会泄露个人隐私那么大,但也不容小觑。封装就是要保护好程序的隐私,不该让调用者知道的事,就坚决不要暴露出来。
3.2 为什么要封装
总的来说,封装主要有以下两大好处。
隔离变化。程序的隐私通常是程序最容易变化的部分,比如内部数据结构、内部使用的函数和全局变量等,我们需要把这些代码封装起来,从而让它们的变化不会影响系统的其他部分。
降低复杂度。接口最小化是软件设计的基本原则之一,最小化的接口容易被理解和使用。封装内部实现细节,只暴露最小的接口,会让系统变得简单明了,在一定程度上降低了系统的复杂度。
3.3 如何封装
总的来说,封装主要有以下两大好处(具体影响后面再说)。隔离变化。程序的隐私通常是程序最容易变化的部分,比如内部数据结构、内部使用的函数和全局变量等,我们需要把这些代码封装起来,从而让它们的变化不会影响系统的其他部分。降低复杂度。接口最小化是软件设计的基本原则之一,最小化的接口容易被理解和使用。封装内部实现细节,只暴露最小的接口,会让系统变得简单明了,在一定程度上降低了系统的复杂度。封装过程中应注意一下问题:
内部函数通常实现一些特定的算法(如果具有通用性,应该放到一个公共函数库里),对调用者没有多大用处,但它的暴露会干扰调用者的思路,让系统看起来比实际的复杂。函数名也会污染全局名字空间,造成重名问题。它还会诱导调用者绕过正规接口走捷径,造成不必要的耦合。隐藏内部函数的做法很简单。
(1)在头文件中,只放最少的接口函数的声明。
(2)在C文件中,所有内部函数都加上static关键字。
全局变量始终都会占用内存空间,共享库的全局变量是按页分配的,哪怕只有一个字节的全局变量也占用一个页,这样一来就会造成不必要内存空间浪费。全局变量也会给程序并发造成困难,想把程序从单线程改为多线程将会遇到麻烦。重要的是,如果调用者直接访问这些全局变量,会造成调用者和实现者之间的耦合。
4 Write once, run anywhere(WORA)
4.1 专用链表和通用链表各自的特点与适用范围
专用链表在这里是指该链表的实现和调用耦合在一起,只能被一个调用者使用,而不能单独在其他地方被重用。通用链表则相反,它具有通用性,可以在多处被重复使用。尽管通用链表相对专用链表来说有很多优越之处,不过草率地断定通用链表比专用链表好也是不公正的,因为它们都有自己的优点和适用范围。()
注意 在本节中,为了避免读起来拗口,我把双向链表简写成链表了,希望大家不要介意。
专用链表的优点
考虑到链表是最常用的数据结构之一,很多地方都会用到它,实现通用的链表会更有价值。接下来我们要实现一个通用的链表,不过请大家记住,实现通用的链表并不是我们的目标,而是我们学习软件设计方法的手段。前面我许诺过要以简单的数据结构讲述复杂的软件设计方法,链表就是其中的载体之一。

本文深入探讨了成为一名专业程序员的关键要素,不仅关注于技术层面的代码规范,如命名规则、排版布局和封装原则,还强调了培养专业态度的重要性。通过对比业余程序员与专业程序员在代码风格、工作态度和思维方式上的区别,文章旨在帮助读者快速提升编程技能,迈向专业人士的行列。
810

被折叠的 条评论
为什么被折叠?



