论坛首页 Java企业应用论坛

为什么要遵守代码规范

浏览 10030 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-19  

几乎所有的软件开发公司,都有相应的代码规范,有些大公司,特别是大的外包公司(尤其是对日外包公司),其代码规范已经到了事无巨细的地步。但相信很多开发人员(包括我刚开始软件开发时),都会产生一些疑问:功能,性能无疑是最重要的,设计也很重要,为什么却要把这么多的精力放在代码规范上呢,仅仅是为了方便别人阅读代码,便于维护吗?这样一套套的代码规范真的可以加快开发速度吗?

在回答这些问题以前,先来看一下Wicket,Tapestry两个功能相类似的基类其中的代码节选。

来自Wicket1.3.3中org.apache.wicket.component的代码

/**

 * Called on very component after the page is rendered. It will call onAfterRender for it self

 * and its children.

 */

public final void afterRender()

{

// if the component has been previously attached via attach()

// detach it now

try

{

setFlag(FLAG_AFTER_RENDERINGtrue);

onAfterRender();

getApplication().notifyComponentOnAfterRenderListeners(this);

if (getFlag(FLAG_AFTER_RENDERING))

{

throw new IllegalStateException(Component.class.getName() +

" has not been properly detached. Something in the hierarchy of " +

getClass().getName() +

" has not called super.onAfterRender() in the override of onAfterRender() method");

}

// always detach children because components can be attached

// independently of their parents

onAfterRenderChildren();

}

finally

{

// this flag must always be set to false.

setFlag(FLAG_RENDERINGfalse);

}

}

来自Tapestry3.04基类org.apache.tapestry.AbstractComponent的代码

/** 

     *

     *  Returns a {@link Map} of all bindings for this component.  This implementation

     *  is expensive, since it has to merge the disassociated bindings (informal parameters,

     *  and parameters without a JavaBeans property) with the associated bindings (formal

     *  parameters with a JavaBeans property).

     *

     * @since 1.0.5

     *

     **/

    public Map getBindings()

    {

        Map result = new HashMap();

        // Add any informal parameters.

        if (_bindings != null)

            result.putAll(_bindings);

        // Now work on the formal parameters

        Iterator i = _specification.getParameterNames().iterator();

        while (i.hasNext())

        {

            String name = (String) i.next();

            if (result.containsKey(name))

                continue;

            IBinding binding = getBinding(name);

            if (binding != null)

                result.put(name, binding);

        }

        return result;

    }

很容易看出,以上的这几段代码,与公司的开发规范相比,也有很高的吻合度,事实上,Wicket和Tapestry的作者都是长期编写架构的开发和设计人员,是非常顶尖的开发人员,远非一般的高级工程师可比,但看这些代码,却没有多少技巧在其中,可以算的上代码规范很好的遵守者。很多国内很程序员经常会觉得,这些高手写的代码应该很难,很复杂。但事实告诉我们,大道至简,这么多的资深程序员甚至是架构师经过多年的编写代码,却都达到了同样的规范,可谓殊途同归。为什么呢?这说明,只有这些来自经验的规范才真正的体现了水平,才是多代程序员的精华所在。当开发人员很好的遵守代码规范来编写代码时,才可以慢慢的体会到规则,才会体会到设计。可以想像一下,如果遵守代码规范,一个方法不得超出50行代码,那么大量的if else就不可能出现,而要代之以各种设计(如工厂,策略等设计模式)来解决问题。

大家如果有兴趣看一下他们的源代码,可以去Apache网站下载,他们的代码中只有很少的一部分,估计不足5%的代码才会超出50行/每方法,违反常规的代码规范的内容也会非常的少。

开发规范不仅不是一种可有可无的东西,反而是历代程序员经过多年的开发所磨炼出来的经验总结。对于程序员来讲,想写好代码,从遵守规范开始。

最后以小说里的一句话来结束本文:技巧的本质就是规则,而规则使人成长

<!--EndFragment-->
   发表时间:2009-02-19  
“技巧的本质就是规则,而规则使人成长。”


0 请登录后投票
   发表时间:2009-03-20  
规则的本质就是技巧,而技巧使人成长
0 请登录后投票
   发表时间:2009-09-22  
说的好,大道至简
0 请登录后投票
   发表时间:2009-09-22  
嗯,随着开发时间的增长,自己的代码风格也越来越和spring,hibernate这些开源软件类似了。
0 请登录后投票
   发表时间:2009-09-22   最后修改:2009-09-22
原因是,不是每个人都是大师,都有经验去写出好的代码。尤其是密集劳动力型的外包行业。为了尽量避免bugs的数量,和减轻开发leader去复查代码花费的精力,规范是最好的做法。就好像生产需要个模子一样。。。

楼主的例子太过理想化,大道至简,有几个人做到大道了?你?我?还是谁?
0 请登录后投票
   发表时间:2009-09-24  
想说的很简单
规范这种东西,表面上看只是规范,就象你说的,生产需要个模子一样

但背后体现的是多少年来软件工程师设计的思想
如果大家都能理解这一点
那么对遵守的规范认识更深一些,自然就更容易遵守规范了
0 请登录后投票
   发表时间:2009-09-24  
if (_bindings != null)
            result.putAll(_bindings);

if没大括号
0 请登录后投票
   发表时间:2009-09-25  
sdnasky 写道
if (_bindings != null)
            result.putAll(_bindings);

if没大括号

很多大师都没大括号的,能看懂就得了
0 请登录后投票
   发表时间:2009-09-25  
孟子曰:人之患在好为人师
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics