美文网首页
阅读代码

阅读代码

作者: Obj_Arr | 来源:发表于2022-08-29 11:22 被阅读0次

    看代码是很让人头大的事情,尤其是篇幅很长,依赖关系复杂的时候。一般来说,编译器会通过各种方式理清代码的逻辑,比如不同的颜色区分不同的关键词和数据类型,又比如对循环结构和分支结构的收缩与展开,通过一定的规定,编程语言本身也会提供一些便利,比如对特定功能块的封装,数据型封装成类,数据处理和转换型封装为方法。
    但是,即使已经了解了这么多的规则和便利,想要读明白一段代码依然很困难,这就是具体的实现逻辑,一个变量在开头被定义,然后在中间某个位置被使用,这之间没有明显的关联,需要眼睛上下寻找,有的编译器中通过选中某一个变量,可以标记出所有出现的位置,算是做了一些优化,但是,标的多了也容易看花眼。
    这个阅读代码的问题确实很难解决,而且对应于不同的使用场景,代码的书写具有不同的惯例,有的直接就是定义变量,处理数据,有的需要首先配置环境状态参数,然后定义变量,处理数据,还有的变量被封装起来,变成一个类,然后从这个类中提取变量,处理数据。
    不过,总体上来说还是有迹可循的,通过脑海中的虚拟图线表,可以简化或者形象化一些过程,比如说函数定义过程,比如循环处理数据过程,还有变量的使用过程。之所以使用脑海中的想象而不用编译器,是因为手头不一定有编译器,即使有,估计也懒得去打开。就像写数学题一样,能不动手就不动手。


    大龙10-转向感知器-文中代码片段

    虽然通过线条组织出了逻辑关系,不过还是比较乱的,想象的话,就可以专注于一部分,然后切换注意力,再关注其余部分。总体上,可以看到

    • velocity是按照声名,赋初值,变化,限制变化而改变的。
    • acceleration也是声名,赋初值,作用于velocity,变化,被force作用。
    • location则是声名,赋初值(被x,y作用),被velocity作用。

    其实,有时候想想,读一段代码到底是为了什么呢?首先是为了获得初步理解,而不是具体的实现细节,所以,需要的不是把所有的运算细节纳入,而仅仅把所依赖的变量纳入,于是,变量的改变就呈现出与其他变量的相互作用,这就是最关键的逻辑,把握住这个逻辑后,再进行细化,就容易很多,最后,把所有的变量变化细节理解之后,整段程序在基础的层面就被理解了。
    所以,这段代码的关键部分,就是三个变量的变化,以及他们的相互作用。


    image.png

    黄线为变量的存在轨迹,绿圈是变化,红线是与其他变量的相互作用。仅为示意图。对于一些规模不大,变量的个数以及变化比较少的代码而言,这个方法应该是比较好用的。
    对于大型的代码而言,本质上也差不多,只不过层级增加了,将小的代码视为功能块,而不去探究细节,甚至将大型程序视为一个功能块,为了一个更加复杂的目标服务。这也是封装的目的,提高抽象性,屏蔽细节,方便理解和使用。这种层级结构要展开说篇幅也会很长,就这样结束吧。


    这种抓大放小的分析方法,其实是从物理中学来的,很多的物理公式非常复杂,如果一个一个的去寻找来源,花半天时间都搞不明白,所以需要从整体上理解,视为一个一个的功能块,这个是正比,这个是积分,那个是比值,先把基本逻辑搞清楚,具体的细化留待需要时进行,这样就能迅速抓到本质。不至于陷入公式互相引用导致的混乱中。
    可以升华一下,所有的逻辑构造,本质上就是状态与变化,也可以视为参数与数值改变,物体与物体形态转变,这种说法并不是凭空而来的,因为逻辑结构可以通过集合论实现,集合本身就是参数的集合,集合函数就是参数的变化。在逻辑的视角下,世界是一个规模庞大的参数集,世界的演化就对应于参数集中某些参数的变化,对于具体的应用场景,这个参数集规模就小了很多,可以被人们掌握,或者通过思维,或者通过计算机等设备,程序就可以视为这种逻辑结构的固化,自然可以通过参数和参数变化完全描述。只不过,正如前面所指出的,具体的实现依然需要花费大量时间去熟悉,采用的抽象层级不同,用时也不同。

    相关文章

      网友评论

          本文标题:阅读代码

          本文链接:https://www.haomeiwen.com/subject/ksmhnrtx.html