编写程序的风格之争

来源:互联网 发布:linux 文本搜索命令 编辑:程序博客网 时间:2024/05/24 07:10


      编程风格之争不但是人与人之间的争论,也是自己与自己的争论。程序员的苦恼往往并不一定是什么高深的算法、技巧而是最寻常、最普通的风格问题,因为风格决定了我们采用什么算法、给函数取什么名称、采用什么输入输出的方式,所以我们不得不重视。不过让我们很无助的是风格问题没有定律,只有一些“大家”之谈,并且还相互冲突,好像皆有道理,又好像皆无道理,只能是具体问题具体分析、就事论事罢了。

 

                                                       编写方便、容易阅读和防止出错之争

 

    编程风格争论最多、最大的来源是我们看待编码风格的视角不同,我们的编写风格是为了编写方便、容易阅读还是防止出错防止出错?比如我们写一个if判断语句最常见的有下面三种写法:

写法一

                               :
                               BOOL    bTest = FALSE;
                                .
                                .
                                .
                              if(bTest)
                              {
                                         ......
                              }


写法二:


                              BOOL    bTest = FALSE;
                               .
                               .
                               .
                              if(bTest == TRUE)
                             {
                                        ......
                              }
写法三:


                              BOOL    bTest = TRUE;
                              .
                              .
                              .
                              if(TRUE == bTest)
                             {
                                   ......
                             }

 

      虽然“写法一”在很多科教书中都是非推荐写法,不过这种写法还是在软件界是非常流行的,特别对高手来说更是如此,不过这种写法最大的问题是加入“bTest”类型变了就会有点麻烦。

 

   “写法二”一般是为了符合阅读习惯,阅读方便,而“写法三”是为了防止出错,防止把“==”写成了“=”。


                                                   运行效率和容易阅读之争

 


     运行效率和方便阅读的问题一直是困扰编程人员一个很大的问题。比如最经典的是使用递归和不使用递归问题。使用递归明显会使代码的可读性和简化问题带来很大的优势,但同样也带来效率的大大降低;反之使用非递归正好带来相反的问题,效率得到很大提高,但可读性和简化问题带来不利。


                                                  语言特性使用、非使用之争

 

     不管什么语言都有其自己的特性,比如最简单的就是关于各种运算符的级别问题,有的人对这些特性比较熟悉所以就比较喜欢使用这些特性,而有的人就不行,比如我本人就是对运行符的级别一直记的不是很清楚,所以这个就涉及到是否使用这些特性的问题。比如:


方法一、使用运算符的级别

 

                        if( db->activeVdbeCnt>1 && i && !db->autoCommit ){
                                       ......
                        }else{


                        }

 

方法二、不使用运算符的级别
      
                        if( (db->activeVdbeCnt > 1) && (TRUE == i) && (FALSE == db->autoCommit) ){
                                   ......
                         }else{


                         }

 

   当然这跟代码是不是容易阅读没有多大关系,倒是第二种方法可以方式“无意识”错误,并且通过“光标”能够很方便找到相互匹配的括

号。

                   
                                                         经验与教材之争


     虽然在很多教材中都给出了关于编程风格的各种意见,但是在实际工作中我们往往会发现这些意见是不可取的或不是完全正确。比如在最严重的goto问题,在绝大部分教材中都是不主张用的。而在有的情况下使用goto不但会提高程序效率而且会提高程序的可阅读性 、避免程序出错的可能。比如我们要实现所有函数只有一个出口这个要求就可以提供一个宏、宏中包含“goto”语句来实现。如:


                              #define CHECK_BOOL(exp)      
                             do {            

                                       ..
                                       .
                                       .
                                        goto Exit0;          

                
                             } while(0)

 


                             void testGoto()
                            {

                              ...

                                  CHECK_BOOL(10 == nLoop);

                              ...

                                  CHECK_BOOL(FALSE);
                              ...
                              ...
                             Exit0:
                              .
                              .
                         }

 


      水无常 势,事无常态。编码就如写文章,还是多学、多想、多练,跳出教条才能写出无错、好读、高效的程序。

原创粉丝点击