几乎所有的软件开发公司,都有相应的代码规范,有些大公司,特别是大的外包公司(尤其是对日外包公司),其代码规范已经到了事无巨细的地步。但相信很多开发人员(包括我刚开始软件开发时),都会产生一些疑问:功能,性能无疑是最重要的,设计也很重要,为什么却要把这么多的精力放在代码规范上呢,仅仅是为了方便别人阅读代码,便于维护吗?这样一套套的代码规范真的可以加快开发速度吗?
在回答这些问题以前,先来看一下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_RENDERING, true); 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_RENDERING, false); } } |
来自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行/每方法,违反常规的代码规范的内容也会非常的少。
开发规范不仅不是一种可有可无的东西,反而是历代程序员经过多年的开发所磨炼出来的经验总结。对于程序员来讲,想写好代码,从遵守规范开始。
最后以小说里的一句话来结束本文:技巧的本质就是规则,而规则使人成长。