先说说代码规范,很多公司就提这个,真的做得比较严谨的,其实不多。小公司就更不用说,都是说说而已,该怎么写怎么写。
那为什么需要代码规范?
扪心自问2个问题:
1. 写了几个月的代码,那种超过50行的,你还能简单2分钟就理解自己以前的思路和逻辑么?(这里只谈代码写法,没有说逻辑思想)
2. 你在看别人代码时,有没有内心MMP过?
如果没有,大佬请出门左转,请不要浪费您宝贵的时间。如果有,那么推荐看三本书《代码简洁之道》《重构-改善现有的代码(虽然是Java代码,不影响阅读哈)》《Effective C#:改善C#代码的50个有效方法》。
我讲个自己亲身经历,在一个中型公司,跟自己的主观吵了1个小时,就是为了这个代码问题。
总结来说,我的观点是写代码可以求快,但是代码本身需要一定的规范,虽然是道德约束,但也是一个码农的基本素养,起码这坑不能挖太深。
领导观点比较有意思,说文无第一,武无第二。
我反驳,这没错,但代码写得水平如何,一眼就能看出,起码的第一点,第一眼看上去就不会觉得很乱(C,C++ 写算法之类就不说了,这里只谈C#)。
不说废话,代码见真章(我自己的代码就不贴了,没有客观性,我们拿官方开源代码来说):
这是官方的代码,地址为 https://github.com/dotnet/runtime/blob/master/src/libraries/System.Collections/src/System/Collections/Generic/Queue.cs 105~133 行(找了个不太复杂,又写得比较明确的)
public void CopyTo(T[] array, int arrayIndex) { if (array == null) { throw new ArgumentNullException(nameof(array)); } if (arrayIndex < 0 || arrayIndex > array.Length) { throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, SR.ArgumentOutOfRange_Index); } int arrayLen = array.Length; if (arrayLen - arrayIndex < _size) { throw new ArgumentException(SR.Argument_InvalidOffLen); } int numToCopy = _size; if (numToCopy == 0) return; int firstPart = Math.Min(_array.Length - _head, numToCopy); Array.Copy(_array, _head, array, arrayIndex, firstPart); numToCopy -= firstPart; if (numToCopy > 0) { Array.Copy(_array, 0, array, arrayIndex + _array.Length - _head, numToCopy); } }
以上代码我读下来,没有障碍,目的一目了然,但是我不改一行代码内容和执行逻辑,我用曾经见过的曾经见过的风格改一改,代码行数最少的方式:
public void CopyTo(T[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException(nameof(array)); if (arrayIndex < 0 || arrayIndex > array.Length) throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, SR.ArgumentOutOfRange_Index); int arrayLen = array.Length; if (arrayLen - arrayIndex < _size) throw new ArgumentException(SR.Argument_InvalidOffLen); int numToCopy = _size; if (numToCopy == 0) return; int firstPart = Math.Min(_array.Length - _head, numToCopy); Array.Copy(_array, _head, array, arrayIndex, firstPart); numToCopy -= firstPart; if (numToCopy > 0) Array.Copy(_array, 0, array, arrayIndex + _array.Length - _head, numToCopy); }
代码行数明显的减少了很多哈,但是不具备可读性,这段代码逻辑比较简单,如果稍微复杂点的业务逻辑,可想而知有多混乱。
个人经验总结:写代码要有明显的分块,一个函数通常有:必要参数效验,业务逻辑,返回值 3个大块,恰当的空行可以很明显的理解写代码的人当时是在做一件什么事情