如何写出好代码

如何写出好代码

这个题目把我自己都看傻了,因为仔细想想,这不是一个命题,是对代码的思考,对细节的推敲和打磨。写好代码是一门学问,还是一种修行。 以前是公众号(JackieZheng)和博客同步更新,尤其是技术类文章。但是最近在公众号上写的比较多,因为在那我可以想写多少写多少,随时随地记录下自己的心得,还有勉励自己的鸡汤或是毒鸡汤。 以后应该会阶段性把公众号的文章总结出来,写成一篇博客,想了想,这样比较符合这两个平台的特性。

函数

函数贵在短小。

  • 当你读代码,看到一个方法,如果长到需要滚动鼠标来往下翻后续内容,再碰上没有区块或方法层注释的,就要抓狂了。这时候短小的优势就出来了,通过区区几行就能很好诠释你的函数干了什么事岂不是皆大欢喜。 如果能通过阅读方法名就知道这个方法是干什么的最好了。比如现在有方法叫做getData(...),还有一个叫做getPersonByName(...),显然后者强势碾压前者,起码我是这么认为的。这么写还有一个附加好处,就是省去了注释,因为方法名就是注释。 函数的目的就是为了告诉你它干了什么事,准确的说,它干了具体哪一件事。在设计模式的指导思想里面是有单一职责原则,对于函数也是一样。别指望一个函数能把所有的活都包了,那样大家都很累。比如
public PersonResult doSomething(String name, boolean isMarked, Person person) {
    String[] names = name.split(",");    
    for(String name : names) {        
        //do some convert or others operations    
    }    
    if(isMarked) {
        PersonResult  personResult = new PersonResult();
        personResult.setAge(person.getAget());        
        // ...
    }    
    return personResult;
}

例子是刚刚想的,当然你可以写一个很长的全能doSomething函数,但是读的人真的累。如果可以的话,这样是不是更好点

稍稍对比下,短小真的不是坏事,它能保持函数的内容在同一抽象层上,看着也舒服。

  • 同一抽象层。这个概念很有意思,请教了老大有了比较好的理解。比如
public double getTotalSalaray() {
    double baseSalaray = getBaseSalary();

    //...
    
    double salaryPart1 = 100;
    double salaryPart2 = 200;
    double salaryPart3 = 300;
    double performanceSalary = salaryPart1 + salaryPart2 + ... + salaryPartN;N
    
    return baseSalary + performanceSalary;
}

这个函数很单纯,真的只做了一件事,就是得到工资总额,包括基本工资和绩效工资。当我们看完第一行代码的时候,我们觉得赏心悦目,很好理解,如果你比较关系基本工资的细节,大可进入getBaseSalary()方面里面一看究竟,可是在后面的绩效工资部分,就显得有些画风不对,我们不需要着这样的细节处理,我们更渴望与获取基本工资一样的抽象即可,好比这样

public double getTotalSalaray() {
    double baseSalaray = getBaseSalary();

    //...
    
   double performanceSalaray = getPerformanceSalary();
    return baseSalary + performanceSalary;
}

注释

有多少码农曾经一直被告诫要多些注释,写好注释,起码我之前是这样的被叮嘱的。但是看完《代码整洁之道》,发现注释不是什么好东西,起码没有我们想的那么好。

  • 注释的副作用 谁也没法保证能一气呵成写完代码,而且永远不会有变动,所以我们需要经常变动代码,但是绝大多数时候,我们却由于各种原因忽视了变动注释。时间久了,代码和注释就不配套了,容易产生误解读。 在写下详细代码之后,又开始为这块代码加上注释,但是或许因为脑瓜子缺氧或是开小差了,写的注释与代码表达的逻辑不符,这样会让读者抓耳挠腮,匪夷所思。比如
public void getData(boolean isAdmin) {
    // if isAdmin is true, get isGroup, if isGroup is true then doSomething
    if(!isAdmin) {
        boolean isGroup = PermissionUtil.getIsGroup();
        if(isGroup) {
            ...
         }
    }
}

因为有很多判断,相信你应该会看一眼注释来帮助自己更好的理解这段代码,但是仔细一推敲,发现代码中的逻辑应该是isAdminfalse的时候,才会去获取isGroup的值,而非像注释中提到为true的时候。

  • 有时候我们需要注释 必要的Javadoc,好比
/**
*get Person entity by id
*/
...

帮助澄清信息,比如

//example: www.test.childtest.com/v5/666
...domain + childDomain + version + id...

警示信息,对于一些代码的使用有些特殊场景要求,可以通过注释标示出来。 TODO 这个大家应该会经常使用吧,用来标记一些我们即将要实现的功能或者带扩展的功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

每行字符数(CPL)的起源

前几天,我收到网友小龙的Email。 他想与我讨论一个问题: "各种计算机语言的编码风格,有的建议源码每行的字符数(characters per line)不...

36160
来自专栏HelloCode开发者学习平台

iOS开发-KVC从使用到原理详解(1)

相比往年的iOS招聘,相比之前波涛汹涌,这会已经是相对风平浪静.但是实际上这样的风平浪静只不过是由于无法坚守的iOS 开发者相继退出而已.但是该有的竞争...

9030
来自专栏牛客网

2018春招酷乐家面经分享(前端篇)一面:二面:面试总结:

前言:酷家乐面试前会通知你面试时间,面试后会反馈面试结果,总之,真的挺好的,可惜就是楼主二面没过~~~ 一面: 1.自我介绍 2.说说自己做的前端项目 3.为什...

36980
来自专栏守候书阁

自己写的面试题,自己想的答案

因为机缘巧合,让当了无数次面试者的我,当上了面试官,也和几个面试者交流过。既然要应对面试者,我就当然要准备面试题了,好让我大概知道面试者是什么水平。这个时候,也...

10320
来自专栏程序员的诗和远方

20180708_ARTS_week02

Add Two Numbers You are given two non-empty linked lists representing two non-ne...

7510
来自专栏令仔很忙

面向对象

在面向对象编程出现之前,几乎所有的程序都是以面向过程为中心的,程序的运行从某个地方开始运行达到一定的目的就结束了。而且程序的代码修改和重复使用率比较低。面向...

11720
来自专栏JackieZheng

漫谈可视化Prefuse(六)---改动源码定制边粗细

可视化一路走来,体会很多;博客一路写来,收获颇丰;代码一路码来,思路越来越清晰。终究还是明白了一句古话:纸上得来终觉浅,绝知此事要躬行。   跌跌撞撞整合了个...

21480
来自专栏程序人生

重构:撰写合格的代码

在「代码重构之道」里,我犯了个懒,讨论了什么情况下需要考虑重构,以及工具和方法来促进重构,但对如何重构代码本身,或者说:如何把烂代码转化成好代码,或者至少是合格...

37680
来自专栏FreeBuf

分析无线遥控器信号并制作Hack硬件进行攻击

*原创作者:ZMOM1031,本文属FreeBuf原创奖励计划,未经许可禁止转载 ? 无线遥控器(无线电遥控器)在我们生活中非常常见,应用于各种场景,方...

30480
来自专栏GopherCoder

『Go 语言学习专栏』-- 第七期

27560

扫码关注云+社区

领取腾讯云代金券