代码整洁之道精华——第五章 格式

阅读本文有两种原因:第一,你是个程序员;第二,你想成为更好的程序员。你如果想成为更好的程序员,那就请细细品味文章内容,它绝不会让你失望。
代码整洁之道教给大家如何编写整洁的代码,而不仅仅是能运行的代码,这对于编程者而言很重要。我在读这本书的第一遍时没什么感觉,但在读第二遍时觉得它确实挺不错的,如果有机会的话我会读第三遍。下面是我在读书过程中摘录的精华内容,希望大家认真对待。各位看官如果读完本文觉得书中的精华内容挺合自己的胃口,那就可以抽出时间认真地读一下这本书。

1、代码格式很重要、不可忽略,必须严肃对待。代码格式关乎沟通,而沟通是专业开发者的头等大事。
或许你认为“让代码能工作”才是专业开发者的头等大事。然而你今天编写的功能,极有可能在下一版中被修改,但代码的可读性却会对以后可能发生的修改行为产生深远影响。原始代码修改之后很久,其代码风格和可读性仍会影响到可维护性和扩展性。即便代码已不复存在,你的风格和律条仍保留下来。
2、关系密切的概念应该互相靠近,显然,这条规则不适用于分布在不同文件中的概念。除非有很好的理由,否则不要把关系密切的概念放到不同的文件中。实际上,这也是避免使用protected变量的理由之一。
对于那些关系密切、放置于同一源文件中的概念,它们之间的区隔应该成为相互之间密切程度的衡量标准。应避免让读者在源文件和类之间跳来跳去。
3、变量声明应尽可能靠近其使用位置
a. 如果函数很短,那本地变量应该在函数的顶部出现。

private static void readPreference()
{   InputStream is = null;
    try{
        is = new FileInputStream(getPreferencesFile());
        setPreferences(new Properties(getPrefeences()));
        getPreferences().load(is);
    }
    catch(IOException ex){
        if(is!=null) is.cloae();
    }
}

b. 循环中的控制变量应该总是在循环语句中声明

public int countTestCases()
{   int count=0;
    for(Test each : tests){
        count += each.countTestCases();
    }
    return count;
}

c. 偶尔在较长的函数中,变量也可能在某个代码块顶部,或循环之前声明

......
for(XmlTest test : m_suite.getTests()){
    TestRunner tr = m_runnerFactory.newTestRunner(this,test);
    tr.addListener(m_textReporter);
    m_testRunner.add(tr);

    invoker = tr.getInvoker();
    for(ITestNGMethod m : tr.getBeforeSuiteMethods()){
        beforeSuiteMethods.put(m.getMethod(),m);
    }
    for(ITestNGMethod m : tr.getAfterSuiteMethods()){
        afterSuiteMethods.put(m.getMethod(),m);
    }
}
......

如果函数真写成这样,那么我们首先应该考虑缩短它,而不是考虑变量写在哪里。
d. 实体变量应该在类的顶部声明。
4、相关函数。若函数调用了另外一个,就应该把它们放到一起,而且调用者应该尽可能放在被调用者上面。这样,程序就有个自然地自上而下的顺序。
5、概念相关。概念相关的代码应该放在一起。相关性越强,彼此之间的距离就该越短。如上所述,相关性应建立在直接依赖的基础上,如函数建调用,或函数使用某个变量。但也有其他相关性的可能,例如:执行相似操作的一组函数。

public class Assert
{
    public static void assertTrue(Boolean condition)
    {   assertTrue(null,condition);
    }
    public static void assertTrue(string message,Boolean condition)
    {   if(!condition) fail(message);
    }
    public static void assertFalse(Boolean condition)
    {   assert(null,condition);
    }
    public static void assertFalse(string message,Boolean condition)
    {   assertTrue(message,!condition);
    }
}

这些函数有着极强的概念相关性,执行同一基础任务的不同变种。他们之间即便没有互相调用,也应该放在一起。互相调用是第二位的。
6、函数行数尽量控制在30行以内,类行数尽量控制在200~500行之间。

抛开所有细节不谈,代码整洁之道总体来说可以分为以下7点:

  • 运行所有测试
  • 减少重复代码
  • 提高表达力
  • 提早构建简单抽象
  • 类和方法都只做好一件事
  • 尽量减少类和方法的数量
  • 努力,让营地比你来时更干净。努力,让世界比你来时更干净。努力,让代码比你签出时更干净。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值