一个合格的码农,应该如何恰当的使用空行

先说说代码规范,很多公司就提这个,真的做得比较严谨的,其实不多。小公司就更不用说,都是说说而已,该怎么写怎么写。

那为什么需要代码规范?

扪心自问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个大块,恰当的空行可以很明显的理解写代码的人当时是在做一件什么事情

posted @ 2020-01-08 18:37  一直踩坑的码农  阅读(633)  评论(0编辑  收藏  举报