1、不要重复,尽量写小函数。
2、小函数可以有好几个出口和入口更具表达力,但是对于大的函数应尽量保证一个入口和一个出口。
3、写代码和写文章是一样的,需要反复打磨。
4、最理想的方式是不要带参,但是有时候也可以带参更易于理解,要分清场合,可以用结构体如果多个参数的话。
5、函数的抽象结构应该是自顶向下的方式。
6、函数应该只做一件事并把这件事情做好。
1、再好的注释都无法掩盖糟糕的代码,所以多花点时间怎么写清楚代码上。
2、有些注释是必须的,比如法律信息。
3、更好的注释是代码的。
4、有时作为警告某个操作的注释也是有必要的。.
5、以前没有提交日志这些日式的注释还有用,但是有了提交日志,这些只会冗长。
6、注释掉的代码可以完全删除,因为有了代码修改提交日志。
1、别轻易返回一个NULL值,最好的做法是在编程时禁止传入NULL值。
2、整洁的代码是可读的,但也要强固。
1、整洁的测试应当遵循的原则是:快速、独立、可重复、自足验证、及时。
c程序总是冗长而又单调的感觉,一个函数有长达百行代码、相同处理的函数分布在各个文件中。
由于设计模式是以使用面向对象语言为前提的,所以很多人会觉得使用C编程时无法使用设计模式。但实际上C也可以面向对象编程。只要能活用设计模式,就可以极大地改善程序结构,使程序各部分解耦,完全独立工作。
1、无需对外公开变量和函数,使用static修饰符,完成模块化的隔离。
2、使用宏方便结构体初始化。
3、使用结构体减小传递的函数参数。使用宏封装检查参数范围。
4、利用结构体完成继承,利用函数封装指针和结构体实现相同功能的不同实现完成多态。
5、封装就是抽象化,数据访问受限可以用const修饰符,也可以用函数名来约束。
6、虚函数:如果函数指针太多导致初始化浪费内存,可以采用静态全局变量的数组来实现共同的函数指针初始化。
参考设计模式地址:https://blog.csdn.net/feixiaoxing/article/details/7188574
1、状态模式,如CD播放音乐的状态
2、涉及到资源处理和资源管理的代码,最好的方式是封装资源处理函数,而后就剩下资源的管理函数
伪代码就是:fun{open(fd) process(fd) close(fd)},这样就能保证获取资源、处理资源、关闭资源独立处理。
1、代码被修改后很容易变得晦涩难懂,看到这样的代码,谁都想直接关掉编辑器,不再去理会他们。
糟糕代码的特征:
一个函数长达数百行
代码缩进不正齐,难以把握代码结构
存在像i2、i3这样已有的变量名和函数名加上数字而组成的新变量名和函数名,而且它们的大部分处理内容完全相同。
代码中还残留“以后修改”这样的注释,不免让人担心现在的代码是否能正常工作。
2、测试驱动开发,Google Test
3、重构时应该明确哪些内容需要对外公开,哪些内容不应该对外公开,并将对外公开的部分尽量减至最少。这是因为对外公开的部分越少,以后改善代码结构时对外部造成的影响也越小。
腐烂的代码绝非开发人员有意为之,肯定是由某些客观原因造成的。
4、注释特别多,代码重复,不管如何复制现有的代码都会让人心安理得,相信很多人员都无法抵挡这种诱惑。但是一旦我们在一处找到BUG,就不得不所有复制这段代码的地方修改。高级处理和底层处理混杂。
5、使用工具重构,对影响范围小的代码重构,对修改后可以在编译和链接时发现错误的代码进行重构。
6、提取函数,精简函数。
7、经常发生变化的文件或是逻辑处理在哪里?特别复杂,且修改时经常出现BUG的代码在哪里?几乎不会发生改变的代码在哪里?
很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编码是一种技术,也是一门艺术,编写可读性高的代码尤其如此。如果你想要成为一位优秀的程序员,要学会从细处着手。
主要内容包括:简化命名、注释和格式的方法,使每行代码都言简意赅。梳理程序中的循环、逻辑和变量来减小复杂度并理清思路。在函数级别解决问题。例如重新组织代码块,使其一次只做一件事。编写有效的测试代码,使其全面而简洁,同时可读性更高。
表面层次上的改进、简化循环和逻辑、重新组织你的代码
1、选择专业的词、避免泛泛的名字、用具体的名字代替抽象的名字、使用前缀或后缀给名字附带更多的信息、决定名字的长度、利用名字的格式来表达含义。
在决定使用一个名字时,要吹毛求疵一点,来想象一下你的名字会被误解成什么。
使用一致的布局,让读者很快就习惯这种风格
让相似的代码看上去相似
把相关的代码行分组,形成代码块。
选择一个有意义的顺序。
用空行来大把大块代码分成逻辑上的段落。
让代码按列对齐可以让代码更容易浏览。
了解什么不需要注释
用代码记录你的思想
站在读者的角度,去想象他们需要知道什么
好代码》坏代码+注释
注释的目的是帮助作者了解在写代码时已经知道的那些事情。
不需要的注释,能从代码很快推断的事实,用来粉饰烂代码的注释。
预料到代码中哪些部分会让读者说“啊”,给它们加上注释。
为普通读者意料之外的行为加上注释。
在文件和类的使用上全局观的注释解释所有部分是如何工作的。
用注释来总结代码块,使读者不至迷失在细节中。
容易变化的放在右侧(但是会容易造成== 和= 这种编写错误,要看编译器是否有警告了)
不要读者有在if和else中有出栈进栈的感觉。通常来讲,先处理正确的简单的有趣的情况。有时可能会有冲突。
在某些编程结构中,像三目运算符、do/while循环,以及goto常会导致代码的可读性变差。最好不要使用他们,因为总是有更整洁的代替方法。(这里就是不允许用goto,而采用do/whiel(0)来代替)。
嵌套的代码块需要更加集中精力去理解。每层新的嵌套都需要读者把更多的上下文压入栈。应该八他们改写成更加线性的代码来避免嵌套。
通常来讲提早返回可以减少嵌套,并让代码整洁。保护语句(在函数顶部处理更简单的情况时)尤其有用。
大多数人同时只能考虑3~4件事情,代码的表达式越长越难以理解。
找到更优雅的方式需要创造力,逆向思考?
解释变量来代替表达式。
减少变量可以减少人思考。
减少变量但是不能改变他的可读性。
减少中间变量,减少控制变量
缩小变量的作用域,避免全局变量。把大的文件拆分,大的函数拆分,大的类拆分
C++和JAVA会限定变量作用域if、for、try。
只写一次的变量(const、final、常量)使代码更容易理解。
抽取出那些与程序主要目的的不相关的子问题
从你的代码中拆分出越多的独立库越多越好。因为你代码其他部分会更小而且更容易思考。
你永远都不要安于使用不理想的接口,你总是可以创建你自己的包装函数来隐藏接口的粗陋细节,让他不要为你的阻碍。
同时在做几件事的代码难以理解。
如果你有难读的代码,尝试把它所做的所有任务列出来。其中一些任务可以很容易地变成单独的函数。其他的可以简单的成为一个函数的逻辑段落
先用自然语言描述代码,然后用这个描述来帮助你找到更整洁的解决方案。
把一个问题用自然语言描述出来,往往就能找到解决的办法。
删除无用代码,提高代码复用率,重新考虑需求,解决版本最简单的问题,不要过度设计。
对测试友好的设计往往很自然的产生有良好组织的代码
比较难解耦的代码:使用全局变量,对外部组件有大量依赖的代码,代码有不确定的行为。
比较好的测试代码:类中只有很少或者没有内部状态,类或者函数只做一件事,依赖少,低耦合,函数接口定义简单明确。
你可能已经注意到,我们已经两次通过同事来帮助我们解决问题了。询问外部视角的观点是测试你的代码是否“对用户友好”的好办法。要试着对他们的第一映像持开放的态度,因为其他人可能会有同样的结论。并且这些其他人可能就包含六个月之后的你自己。
从写一个幼稚的方案开始,然后设计不同的挑战方案:速度和内存的使用情况。
添加新特性(需求)、修正bUG(缺陷)、改善设计(重构)、优化资源使用(优化)
回归测试、单元测试
确定改动点、找出测试点、解依赖、编写测试、修改和重构
1、集市式模式的编程,让更多无私编程的人出现,此外更早的暴露你的编程,让别人去发现其中的BUG。
2、人们 一般在一项任务处于一种适当难度范围的时 候享有乐趣; 不要太简单了至于无聊,不要太难了不好实现。一个快乐程 序员是一个既没有被浪费也没有被错误制定的目标和烦人过 程摩擦所压倒的人。乐趣通往效 率。
1、大多数都认同,保持代码的可读性非常重要,同时最难查的BUG是出现在并发代码中。
1、开心的工作环境、让人工作的开心、有挑战的工作。管理者的作用不是让大家去工作,而是创造环境,让大家可以顺利开展工作。
2、错误在所难免。营造一个不容易任何失误的氛围会让大家持有戒心。他们不愿去尝试那些有可能变坏的事情。要鼓励大家犯错。要让每个人感觉到独特性。
3、对于编程这种脑力劳动者,工作太长会扼杀创造性。压力大不会让人工作得更好,只是工作的更快。工作得更快就不得不牺牲质量及自身工作体验。
4、不给任何时间压力,只需要说“你做完告诉我一声就行”。
1、软件编程的快乐来源于创建事物的,开发了对他人有用的东西,组装零件的快乐。很少有一种介质如此灵活,如此易于重建和精炼,可以实现概念上的设想。而痛苦来源于这种易变带来的追求完美,寻找BUG的痛苦。
2、编程的复杂性、一致性、可变性和不可见性是其根本属性。无论是面向对象编程还是可视化编程都很难改变这种思想上的活动。