回 帖 发 新 帖 刷新版面

主题:嘛叫可读性?

我想请问一下代码的可读性与可维护性具体指的是啥。请在公司工作的大哥们,能不能解释一下?工作之间,代码该写成怎样。不是指在

代码中间加缩进、空行、空格、注释之些,不是问这个,因为每个人写代码时的想法肯定不同,有时为了省下一行或者某个原因就可能精简了一下,

这样叫编程技巧吗?如果不是,什么情况才叫编程技巧,明明可以那样简单做,却故意拐个弯把事情搞复杂起来才叫编程技巧吗?当然,我问

这个问题不是为了学什么编程技巧,我只想搞明白怎么一回事,如果真是如我所说的那样,那可以改个名字吧,不叫编程技巧,叫装B。。。

说白了,我是因为continue这个关键字才搞得我莫名其妙,就我目前浅薄的经验来看这个关键字,它的作用是退出当层循环重新回到循环语句

开始的判断表达式。既然这样,何不在一开始就指明了呢,用&&多好。我的意思是指如果continue包含在某个if语句里这种情况。用一个例子吧

while(getchar() != '\n')
     ;

这个程序是在书上抄的,它说这个循环读取并丢弃输入,直到输入回车。然后作者在空白分号的前面加上continue写出另一个代码,如下:

while(getchar() != '\n')
     continue;

作者解释说第二个代码更具可读性,我却觉得怪怪的,原因是多使用了个关键字,肯定就在编泽器内部多使用一种机制,我单单只有;号,

代表一个空语句,看起来不更简单明了吗?让人一看就知道,这个循环除了回车以外,啥也不要。加了一个continue还要想下,哦这个关键字

是有退出当层循环重新开始的作用。何必吗?回归到问题本质,我想知道,什么叫做代码的“可读性”与“可维护性”我之所以把可维护也

扯上,没有其它的原因,就是因为觉得维护是在能读懂程序后再进行的维护,不要当真啊,大哥。既然可读了可维护就啥好说的了。

文中所写的,全是完整的想法,没有经过任何的修改,所以,我的本意没有任何其它不敬的意思,求解,小弟感激不尽。

ps:说实在的,现在的学习让人有些迷茫,我未来是想开发游戏,我知道这需要基础知识,学了C有半年,仍然不知道3D图像是如何生成的。。。

也看过些理论,什么顶点、点阵啊,啥的,不明白。。。好像,我现在用C就只能算些简单的东西,比如一辆车跑多少公里用多少油。。。输入

小写字母然后又干嘛干嘛,if啊else啊,最终printf或者putchar。有时我找个题目写着写着,然后就会停下来,望着屏幕发呆半天,

回过神来就会想:我在干什么?甚至有时看到有些用英寸转换成厘米,公里转英里,我特厌恶这种题目,我怎么了?唯有玩游戏的时候才

会思考这个游戏动作是怎么产生的。半年前下载一本C Primer Plus自学C,现在半年时间已过,学到第7章,if语句。唉,说这些没有什么意义。

请帮个忙,讲解一下上面的问题,ps里的只是我心情罢了,说出来能好受些。唉,心情郁闷。另外让问下各位读代码是以抽象的方式来读还是以编译器的方式

来读?比如是cm > 90 && cm < 100这行,我一般都这么读:键入的厘米数大于90且小于100.我指的抽象的方式是不是这种读法:介于90到100

的厘米数。也许描述得不太正确,请海涵~~。

回复列表 (共3个回复)

沙发


   说话还真冲啊,不过说真的,你的经验还真是浅薄啊。。
首先你要搞懂,软件开发不是你一个人闷着头敲几个月代码就行了的,基本上都是,几个人合作写几个月,你写的别人会看,别人写的你也会看。很可能你几个月前写的代码,自己都忘了为什么这么写。
比如你举得那个continue例子,如果你不加continue,别人看到可能就会想,是不是这娃太粗心了,忘了在这添代码?加了continue,别人就很容易知道不是你忘了,类似的有switch/case基本都要加default。
  
比如下面的代码(effective c++讲的有类似的),你看哪个更容易懂呢?
[code=c]
   for(int i = 0;i < 1024;i++){
      dosomething;
   }
   你能知道1024是什么意思吗?
   看看下面的代码呢
   #define IO_BUFFER_SIZE 1024
   for(int i = 0;i < IO_BUFFER_SIZE ;i++){
      dosomething;
   }
[/code]
至于可维护性,就是设计函数的时候函数的参数返回值一定要友好,比如
typedef struct _TypeExample{
    HConn conn;//假定为某socket连接的句柄
    const char* pszDBName;
    const char* pszUserName;
    const char* pszUserName;
    int nPort;    
}*PTypeExample;

 int FunctionA(PTypeExample pExample)//使用pExample的conn句柄
 {
     pExample->conn..
 }


 int FunctionA(HConn conn)//使用pExample的conn句柄
 {
     conn....
 }
你觉得哪个函数的设计比较好呢?显然是第二种

板凳

如果没有公司的硬性规定,大可不必在乎小节。但有些地方总是要注意的。
举一些反面例子。

1、该换行的地方不换行,不该换行的地方乱换行。乱用缩进,花括号位置混乱。让人读起来头昏脑涨。听说某项目有若干行代码,因为前面的空格和tab键太多,导致有效代码出现在屏幕之外,不拉滚动条就无法看到。想起来真是恐怖了。
2、变量名和函数名具有迷惑性,甚至误导性。比如一个叫做DoSomethingA的函数开始时是为了做某事A,但后来有人加上了一些代码,以便在做A的同时做另外一件事B,再后来又有人把做A的代码删除了。此时函数仍然叫做DoSomethingA,但其内容已经是DoSomethingB了。
3、一个函数,内部几万行代码。其中循环、判断语句无数,错综复杂,甚至还有goto,在几万行代码之间自由跳跃。
4、一个算法,看似只有短短几行代码,但实际上却需要极长的数学证明,或者极长的求解过程。这本来没什么,在注释里或者在文档中写清楚就行。但糟糕的是,没有留下任何的注释和文档,让阅读的人一头雾水。
5、某段代码经常出问题,但是由于是公共代码,今天我改一些,解决我的问题,明天你改一些,解决你的问题,最后导致判断条件无数,没人再敢做任何修改(因为一旦修改就可能导致很多问题同时爆发)。最后只能干瞪眼。

3 楼


就是因为不懂才问的拉。。。新手嘛。

我来回复

您尚未登录,请登录后再回复。点此登录或注册