代码理解搜索的障碍

简介

这里整合所有阻碍代码搜索的实例。原因,及改进建议。

Linux 专门为搜索结构体

做了下面的变动。

commit fd2c3ef761fbc5e6c27fa7d40b30cda06bfcd7d8
Author: Eric Dumazet <eric.dumazet@gmail.com>
Date:   Tue Nov 3 03:26:03 2009 +0000

    net: cleanup include/net

    This cleanup patch puts struct/union/enum opening braces,
    in first line to ease grep games.

    struct something
    {

    becomes :

    struct something {

google 高级搜索

jump-label API site:lkml.org
加上网点的条件在后面。

函数指针的使用

作用就是解耦;

函数指针的障碍

障碍就是会对代码学习产生很大的阻力。这种函数指针的形式怎么看代码呢,想到的唯一的解决方法就是将源程序线程编译调试版本,使用gdb或者相应的将函数调用栈打印出来的方式,实时运行,配合代码看。这样得到的信息可能比较快一些。
要不然,就需要将软件的架构熟悉阅读,精通架构。

技巧的使用

https://mzhan017.blog.csdn.net/article/details/127168737;这里的结构体atomic_t的定义其实就是用了这么个“错误”技巧。
各种程序技巧的使用,也是一种设计方法。方便各种软件意图。
但是有时候一个人想到的技巧,后续的人看不懂,看不透,其实是需要别人点拨。

https://blog.csdn.net/qq_36428903/article/details/124186104
这个两个#号的使用也算是一种技巧的使用。

技巧的障碍

需要文档,注释说明,其使用的技巧。
双引号的使用,为代码阅读增加了困难。

缩写的意义

省空间。

缩写的障碍

如果有一个缩写,我们不知道意思,就会导致代码阅读者的抓狂。

所见即所得的意义

这个毋庸置疑,如果所见非所得,就是需要代码阅读者需要在脑子里转换关系,很容易出错,烦躁感易出现。

所见非所得的障碍

https://mzhan017.blog.csdn.net/article/details/125365261

函数库的意义

为了代码复用,普惠广大用户。有些共有的代码会被提炼成一个库。不用重复造轮子。

函数库的障碍

有时候看代码时,很可能就遇到未知的库。如果相要搞懂具体函数的实现,就需要将这个函数库熟悉一下,这样带来了知识铺开到新领域的一个障碍,也就是知识越学越多的压力。

注释的意义

注释的意义,就不再说了。这里只是记录一下条目。再次强调,需要多加注释,同时要确保注释的正确性。

注释的障碍

举例

/* These elements must be at the end, see alloc_skb() for details.  */
sk_buff_data_t		tail;
sk_buff_data_t		end;
unsigned char		*head, *data;

比喻的意义

在计算机行业,有很多词汇,概念都是从其他领域类比,比喻过来的。而且以西方的事物比喻的为多,所以对于东方人来说,有时候虽然通过翻译可以大体了解比喻的含义,但是没有亲身体会过这种事物,怎么都有一种隔膜存在。

比喻的障碍

理解的意义

代码阅读无可避免;只有理解了代码,才能对问题的根因进行分析。

理解的障碍

参数传递的繁杂的映射

比如接口提供了一个参数名称是:gfp_t gfp_mask,也就是这个接口的作者,希望传递进来也是一个gfp_t的类型的数据,而且名称上也要能对应的上;
但是如果调用者这样调用;
skb = fff(sk->sk_allocation);
其实丢代码阅读者来说,脑子里需要一个映射关系,就是sk_allocation的含义,就是gfp_t。但是从字面上,含义相差了一段距离。

struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
struct proto *prot, int kern)
{
有些函数调用使用的名称是:priority;
到目前为止,有三个符号需要映射到一个含义:gfp_mask, sk_allocation,priority;
而且priority,作为一个具有普世意义的词,需要特立化。

搜索的意义

那为什么要着重说搜索呢?原因是,当前开源软件,及github的兴起,预示着代码就像星辰大海;如果遇到问题,我们想搞懂其中的逻辑,要一行一行的去看,非常的耗时,而且效率低。如果使用搜索,就可以完成,专注问题点的代码的展示。
这个搜索,是问题处理场景下,一定会用到的技能;如果可以很好的辅助代码搜索的代码编写技巧,可以很好的为问题解决提供帮助。而不好的软件设计,编码风格,会导致这个搜索技能,无用武之地。

搜索的障碍

别名的使用

曾经遇到过一个例子,模块的名称是,A,而且有些函数里有A关键字,但是有些模块实现功能的函数名称是却是C。
这样,导致在以A为关键字进行搜索时,发现根本没有

成员变量重名

这个重名,不是说在一个结构体或者一个类里,重名。而是多个结构体,或者多个类里,具有相同名称的成员变量名称。这就为检索搜索结果设置了一个非常大的障碍。
举例:

  • 公司有一个模块使用了大量的单例对象;而且设计的类又多;实例的名称统一都命名为:_mInstance;要是去搜索代码,发现,根本无从下手;海量的_mInstance;
  • Kernel源代码里的普通含义的成员变量,比如:len/gso_size/func, 等等,好多个结构体都有这种普通意义的变量,搜索起来也是非常的费劲。如果按照模块搜,不能保证,搜索的全局性;如果不按照模块搜,又有好多不在关注点内的捣乱分子。

成员变量重名的改进建议

将普适的变量名,特有话:比如在len前加 类名;clas_name_len;

双井号的使用,也为搜索代码带来了障碍

https://blog.csdn.net/qq_36428903/article/details/124186104
减少双井号的使用,或者在使用的地方,添加注释说明。

换行导致搜索匹配度低

gcc/cp/parser.c
if (asm_specification)
error_at (asm_spec_start_token->location,
"an asm-specification is not allowed "
“on a function-definition”);

如果按照“attributes are not allowed on a function-definition”来搜,肯定就找不到了,因为中间有一个换行符。
#: cp/parser.c:19505
#, fuzzy, gcc-internal-format
#| msgid “%Hattributes are not allowed on a function-definition”
msgid “attributes are not allowed on a function-definition”
msgstr “%Hatribut tidak diijinkan dalam sebuah definisi fungsi”

改进实例

commit 63413da5d31d99ba8d89cf9d9ff997f93b49443d
Author: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
Date:   Wed Jun 4 16:00:32 2003 -0300

    o net: create struct sock_common and use in struct sock & tcp_tw_bucket

    With this the data dependency is reduced to just making sure that the first
    member of both struct sock and struct tcp_tw_bucket are a struct sock_common.

    Also makes it easier to grep for struct sock and struct tcp_tw_bucket usage in
    the tree as all the members in those structs are prefixed, respectively, with
    sk_ and tw_, like struct inode (i_), struct block_device (bd_), etc.

    Checked namespace with make tags/ctags, just one colision with the macros for
    the struct sock members, with a wanrouter struct, fixed that
    s/sk_state/state_sk/g in the wanrouter struct.

    Checked as well if the names of the members in both structs collided with some
    macro, none found.

改进实例

qemu

commit 6f4c60e47fdb39848eb40804f54e53d8ccaa0f2e
Author: Peter Xu <peterx@redhat.com>
Date:   Fri Mar 10 21:09:30 2017 +0800

    hostmem: use host_memory_backend_mr_inited() where proper

    Use the new interface to boost readability.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mzhan017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值