第一次进行翻译,花的时间也比较长,当中难免会有辞不达意的地方,有个别地方实在想不出什么好词,就添加了英文,而代码部分未做改动,欢迎大家斧正!
英文原文地址:10 steps to becoming a better programmer,下面是翻译正文:
在这里,我想介绍的是在我成为专业程序员之后,过去的一些年里真正帮助我提高代码质量和综合素质的10个技巧。
要不惜任何代价避免重复代码的出现。如果你在几处不同的地方有相同的代码片段,写一个函数重构它。在同事阅读你的代码时,重复代码会让他们感到费解,当只修改一处而另外几处的重复代码没有进行修改时肯定会出现Bug,而且会使得可执行的代码体积变得臃肿。现代的编程语言已经能够很好的克服这些缺点,比如下面的这个例子在以前很难解决,而出现delegate和lambda之后就很好实现了。
/// <summary> /// Some function with partially duplicated code /// </summary> void OriginalA() { DoThingsA(); // unique code DoThingsB(); } /// <summary> /// Another function with partially duplicated code /// </summary> void OriginalB() { DoThingsA(); // unique code DoThingsB(); }
现在我们就可以使用delegate重构和改写含有部分相同代码的函数:
/// <summary> /// Encapsulate shared functionality /// </summary> /// <param name="action">User defined action</param> void UniqueWrapper(Action action) { DoThingsA(); action(); DoThingsB(); } /// <summary> /// New implmentation of A /// </summary> void NewA() { UniqueWrapper(() => { // unique code }); } /// <summary> /// New implementation of B /// </summary> void NewB() { UniqueWrapper(() => { // unique code }); }
当你发现自己在浏览facebook或者twitter而没有专心解决问题,这时候就该进行短暂的休息了。起身离开办公桌喝点咖啡跟同事交谈5分钟或者干点别的。尽管这么做有点不合常理,但长期坚持,你的工作会更加高效。
当在压力下去解决问题或者修改bug的时候,人很容易失去理智,你会发现自己匆匆忙忙甚至完全忘了通常非常重要的测试,而这经常会导致更多的问题进而让你在老板和同事面前显的很不专业。
你知道自己的代码能干什么,而且测试的时候也确实管用,但你还是需要去充分验证它:分析所有的边界情况,确保你的代码能够在各种条件下进行测试时取得预期的效果。如果有参数,传递一些预期范围之外的值,传递null值。如果可能,向你的同事展示代码并邀请他们尝试去测试它。单元测试是达到这个目的的一个比较好的方法。
在你提交代码之前,和一个同事坐一会并精确的向他说明一下你对代码所作的修改。好多时候,在这个过程中你就能在同事不说一句话的情况下从自己的代码中找出问题。这比复查自己的代码要有效的多。
如果发现自己在用大量的代码去解决一个简单的问题,很有可能你做错了。
if (numMines > 0) { enabled=true; } else { enabled=false; }
此时你应该这么写:
enabled = numMines > 0;
代码越简练,bug越少,需要重构的可能性越小,出错的几率也更小。但要适可而止,因为可读性同样重要,你肯定不想自己的代码因为精简而使得可读性变得差吧。
优雅的代码通俗易懂,而且能够以最少的代码量和更小的机器运行量来解决问题。虽然想在任何条件下都撰写优雅的代码比较困难,但经过一段时间的编程,你就会对它的形式有所感觉。优雅的代码并不能通过重构获得改进,但它会让你看得非常舒心,你会为此而自豪。举个例子,下面就是一个我认为较优雅的方式来计算多边形面积的方法:
static public double GetConvexPolygonArea(Vector2[] vertices) { double area = 0; for (int i = 0; i < vertices.Length; i++) { Vector2 P0 = vertices[i]; Vector2 P1 = vertices[(i + 1) % vertices.Length]; area += P0.Wedge(P1); } return area / 2; }
众所周知,注释是编程中非常重要的一部分。但自记录代码更为优越,通过它人们就能够理解代码。函数和变量名要灵活的选择,以便它们即使被放到任何语言环境中甚至都能被非编程人员看懂。例如:
void DamagePlayer(Player player, int damageAmount) { if (!player.m_IsInvincible && !player.m_IsDead) { player.InflictDamage( damageAmount ); } }
自记录代码并不能代替注释,注释是用来描述“为什么”的,而自记录代码描述的是“是什么”。
纯数字直接嵌入代码是个坏习惯,因为没法说明它们代表的是什么。尤其是相同的数字在多个地方重复使用的时候,会更加糟糕。只修改一处而忘记其他的地方会导致bug的出现。一定要用一个命名常量来代表你要表达的数字,即使它在代码里只用一次。
人在做一系列的动作时很容易犯错。如果你在做一项需要很多步骤才能完成的构建部署工作,那么,你的做法就有些问题。应该尽量实现工作的自动化,减少人为错误。尤其是在你做一项工作量很大的任务时这更重要。
当开始优化部分已经在运行的代码时,你很有可能破坏它的性能。所以,优化应该只在项目开发最后阶段,性能分析完毕并指示需要优化的时候执行。在分析阶段完成之前就进行优化就是浪费时间而且会导致bug的产生。
本来我想说10个技巧的,你们却免费得到了额外的一个!
就这些吧,我希望这些小技巧能够帮住改善大家的编程开发过程。