其实根本不用混淆你的代码

酷壳中有不少有意思的文章,看起来很带劲。本来要说大多看看则了,现在终于要学以致用了。
本人最近接手一个项目,缝缝补补几天下来,实在有点郁闷,但是想想,自己也强不到哪里去。正如下所说:

If builders built buildings the way programmers write programs, then the first woodpecker that came along would destroy civilization.(如果建筑师盖房子就像程序员写程序一样,那么,第一只到来的啄木鸟就能毁掉我们的文明)

如何写出无法维护的代码
其实好代码很多,开源的很多,但是往往都是代码太多,功能太强大,而不知道从何处看起。所以,其实根本不用混淆你的代码。
本文针对此次项目,结合以往所学所看,谈谈对代码可读性方面的认识。

程序命名


有一篇文章说史上最糟糕的两个变量名

  • data
  • data2

仅就个人而言,并不是很反感变量名的无意义。如a1,a2,b3,b4等变量命名,如str(本人就经常使用),tmp,dt等都与data与data2所说一致,其实想想有时候使用同一种相互不约而同的命名方式有何不可,即使这是一种错误的命名方式。
好比看到str,我知道他是一个字符串,知道他是一个局部变量(local),而不可能是一个字段(field),对于str,我打起来很快很熟练,可能我只是在十几行的方法中使用,这种命名有何不可。
但是还有一种人很有意思,他们不写这种简单的变量名,往往会这样去声明一个变量:

 

private DeserializeDockContent m_DeserializeDockContent;

 

或许他们实在不知道给这个字段起什么名字,但是又不能让变量名毫无意义,所以他们一般会将整个类名写出来,好让人看到变量就知道他是什么类型。
相同的,他们会觉得遵守了匈牙利命名法而自豪,如果是局部变量更简单:

 

ComponentAssembly componentAssembly = new Componentassembly("XXX");

 

文中所谈使用下划线为变量名,让我想起了一门超牛逼的编程语言:Brainfuck,很难见的只有八种运算符的语言,有兴趣的可以看看。

伪装欺诈


看到这一节的第一个程序让我真实感觉到了牛人的创造力

 

for(j=0; j<array_len; j+=8)
{
    total += array[j+0];
    total += array[j+1];
    total += array[j+2]; /* Main body of
    total += array[j+3];  * loop is unrolled
    total += array[j+4];  * for greater speed.
    total += array[j+5];  */
    total += array[j+6];
    total += array[j+7];
}

 

至于伪装欺诈,我想很多程序员也不至于去干如此有技术含量的事,但是不排除一些看到如下代码的程序员会做出如何疯狂的事情:

case "btnModify":
    mySql.Append("update mdm_attr set mdm_code='" + txtMdmCode.Text + "',mdm_name='" + txtName.Text + "',");
    mySql.Append("mdm_type='" + GetMdmType() + "',ac_num_ind='" + GetAcnumind() + "',draw_uncon_yn='" + GetDrawuncon() + "',");
    mySql.Append("qry_pwd_yn='" + GetQrypwd() + "',draw_pwd_yn='" + GetDrawpwd() + "',draw_id_yn='" + GetDrawid() + "',");
    mySql.Append("draw_seal_yn='" + GetDrawseal() + "',pwd_mach_yn='" + GetPwdmach() + "', note_type = '" + txtNotetype.Text + "',only_ind='" + GetOnlyind() + "',");
    mySql.Append(" pg_num=" + pgnum + ", pg_line=" + pgline + ",no_ind='" + GetNoind() + "',prt_ind='" + GetPrtind() + "',");
    mySql.Append(" card_type='" + GetCardType() + "',card_ind='" + GetCardInd() + "',chg_flag='" + GetChgFlag() + "',");
    mySql.Append(" fee_knd='" + GetFeeKnd() + "',min_amt=" + min_amt + ",fee_code='" +
    txtfeecode.Text.Trim() + "',");
    mySql.Append(" cif_type='" + GetCifType() + "',opn_aff_yn='" +
    GetOpnaFf() + "',");
    mySql.Append("opn_sub_cnt=" + opn_sub_cnt + ",opr_aff_yn='" + GetOpraFf() + "',");
    mySql.Append("dz_flag='" + GetDzFlag() + "',beg_date=" + beg_date + ", end_date=" + end_date + ",");
    mySql.Append(" opn_cnt=" + opn_cnt + ",sts='" + GetSts() + "',filler='" +
    txtfiller.Text.Trim() + "' ");
    mySql.Append(" where mdm_code ='" + txtMdmCode.Text.Trim().ToString() + "'");
break;

 

文档和注释


我一直都是一个不喜欢写注释的人。
在我的开发环境中将注释的颜色尽可能的变暗,以至于我粗略一看可以忽略他。因为很多注释真的是毫无意义。

 

xDoc.Save(savePath);
//filestream 读取XML文件
XmlDocument _xd = new XmlDocument();
_xd.Load(savePath);
//用byte类型接收XML文件
byte[] myByte = Encoding.UTF8.GetBytes(_xd.InnerXml);
//上传到服务器,成功后提示
if (TradeHelper.TradeUtils.SaveClientConfFile("Menu.xml", myByte, false))
{ this.ShowMessageBox("提交成功", "系统提示"); }
//获取Menu.xml的路径
string menuPath = Directory.GetCurrentDirectory() + "\\Menu.xml";
//读取Menu.xml的内容
XmlDocument xd_menu = new XmlDocument();
xd_menu.Load(menuPath);
//读取Menu_Tmp.xml 的内容
XmlDocument xd_tmp = new XmlDocument();
xd_tmp.Load(savePath);
//两个文件内容交换(让Menu.xml 内容替换)
xd_menu.InnerXml = xd_tmp.InnerXml;
//保存Menu.xml
xd_menu.Save(menuPath);

 

拿到一份100行的代码,你会发现可能注释会有50行,这将是怎么一种感觉?很多时候,我认为文档比注释更重要,如果公司的每个项目都有相应的一些必要文档,我想开发人员也没有那么累了。
可有人干过专门补注释的事情?
由于某种原因,代码可能要有某种形式的验收,这时候就有个要求,注释不能少于代码量的1/3,好吧,我绞尽脑汁的去补注释,有时候不得已就要使出小学应付作文字数的方式:

 

/// <summary>
/// 获取HtmlElement 可以根据ID、Name、TagName等组合
/// ID选择器优先级最高
/// Name选择器如果能获得且只有一个,直接返回,不判断其他
/// 其他选择器取并集 使用其他选择器最好指定Name或TagName
/// </summary>
HtmlElement GetElement(XmlNode item)

 

其实我更想写的是思路。

程序设计


关于XML的配置,很不幸的是我手头有个项目基本就完全符合这种情况。而我们也确实曾经使用webservice来访问数据库,在数据库中存过XML字段等等,XML很强大。
我很讨厌诸如此种重构方法的方式:

更恐怖的是除了RefreshToolBox还有RefreshToolBox1、RefreshToolBox2……
虽然我也喜欢在代码中写Hard-coded或者说Magic Number,但是我真的很排斥用数字作为状态码或着说标示符去重构方法。
如果你看到如下代码:

 

total2 = total - 45;
if(flg == 1)
{
    //...
}
if(total2 > total3)
{
    //...
}

 

还值得一说的就是过度的面向对象设计。
我至今还是不能把GOF23种设计模式说全,但是不影响我干任何事情。对设计模式的批判仿佛比设计模式的重要性还要多,而面向对象是否是一个骗局,是否符合哲学,我无法去辩驳,因为我真不怎么懂面向对象。
我只是在项目中看到,由于面向对象的设计,无故的多出了很多代码。往往是我看到这里,跳着跳着已经忘记了初衷。
某篇文章说程序员应该克制写代码的冲动,而多多思考,但是正因为这种思想的影响,往往让我很难下手。
这会让我写代码越来越慢。

因为我总是会考虑很多才会下手:如何写才能有利于扩展,如何写代码才会更好看,如何写才会减少不必要的bug……以前的我是不会考虑这么多的,一旦想清楚怎么样才能实现功能之后,我就会毫不犹豫的敲出代码,而我现在连一个变量该如何命名都会考虑很久。其实对于这种项目来说,有些考虑确实是不必要的,程序设计的再好,再有利于扩展,也很有可能无法满足一次需求的变动。

以上是某人的感言,很符合我现在的情况。


好了,写了许多,就不再写下去了。不管代码如何,总还是要有人去维护的,每一个程序员都有把代码写烂的天分,看一份源码,有时候真可以了解一个人。

我的博客原文地址:其实根本不用混淆你的代码

欢迎来我的博客:nanqi.info

转载于:https://www.cnblogs.com/nanqi/archive/2012/12/17/unmain.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值