“嗨,阿米戈!今天我要告诉你代码风格和代码风格的重要性。”
“我将从最重要的事情开始。Java 代码应该易于阅读。 代码的一般方法是:代码编写一次,但阅读一百次。”
“假设您和其他 10 名程序员正在编写一个应用程序。您在该应用程序上工作了三年,每三个月发布一次中间版本。”
“那么长?”
“这就是 Java,我的小蚂蚱!”一个运行在十几台服务器上、由 100 个人用 6 年多时间编写的企业系统怎么样?有时也会发生这种情况。”
“哇哦。”
“总之,主要规则,对代码的主要要求是其他开发人员必须易于阅读。”
“在其他编程语言中,人们通常以小团队的形式完成小任务,因此他们可能有另一个主要规则,例如‘它有效吗?太棒了’。”
“在几年的时间里,你的所有团队成员都会对你编写的代码进行多次更改。每次他们都必须了解代码的工作原理。”
“而且难以理解的完美运行的代码很难更改。 他们会丢弃它并以自己的方式重写它。 因此,编写其他人可以理解的代码。 如果你可以改进你的代码,然后改进它。如果它可以改进,那就需要改进了! ”
“如果你花 15 分钟编写代码,然后花两个小时改进它,你就做对了。你为团队节省了多少时间?”
“‘2 小时来理解你的代码’ x ‘人们需要理解它的 100 次’ = 200 小时。”
“我凭空得出这些数字,但我希望你了解问题及其范围。 你的代码是为了让其他程序员阅读而创建的。 其他一切都是次要的。”
“代码运行不正常吗?我们会修复它。没有优化?我们会优化它。没有记录?我们会添加评论。”
“代码难读吗?把那些废话扔进垃圾桶,然后从头开始重新写一遍! ”
“我认为这没什么大不了的。”
“Java 成为领先的编程语言的原因之一是所有 Java 代码都是为了供其他程序员阅读而编写的。”
“现在让我们继续讨论第二个问题:如何使代码尽可能易于阅读? ”
“当某人用他或她的母语说出熟悉的单词时,任何人都能理解。这里也是如此。当程序员很容易猜到时,代码很容易阅读:
A) 每种方法的作用
B) 每节课的目的
C) 每个变量存储的内容。
所有这些都是通过名称来传达的:类名、方法名和变量名。此外,在命名变量时也有风格。还有代码风格。”
“我准备好倾听了。”
"编程是基于良好的英语! 一个写得很好的程序读起来就像普通的技术文档。 "
“让我们从名字开始吧。 ”
“一个方法名应该简要描述该方法的作用。然后代码可以像简单的散文一样阅读。”
public String downloadPhoto(String url)
{
String resultFileName = TempHelper.createTempFileName();
Downloader downloader = new SingleFileDownloader(new Url(url));
downloader.setResultFileName(resultFileName)
downloader.start();
while(downloader.isDone())
{
Thread.sleep(1000);
}
if (downloader.hasError())
return null;
return resultFileName;
}
“下面是这样一个程序的阅读方式。”
第 1 行。
“该方法称为‘downloadPhoto’。它似乎是从 Internet 下载照片文件。它下载到哪里?我们还不知道。从哪里下载?该方法有一个名为 url 的参数——这可能是用于的 URL下载。”
第 3 行。
“变量 resultFileName 由 TempHelper.createTempFileName() 声明并赋值;”
所以这必须是我们将保存下载文件的文件的本地路径。
“'TempHelper'这个名字并没有告诉我们任何东西。'Helper'后缀说明这是一种实用类,不包含重要的业务逻辑,而是用于简化经常发生的例行任务。”
“方法名‘createTempFileName’表示该方法创建并返回一个临时文件(temp file)的名称。临时文件是临时创建的文件,通常在程序关闭时删除。 “
第 5 行。
“一个 SingleFileDownloader 对象被创建并分配给变量下载器。”
这是将从 Internet 下载文件的对象。
“一个 SingleFileDownloader 对象被分配给变量 downloader。从名称上,我们可以假设该程序有几种类型的下载器类。一个是为下载单个文件而编写的,我们可能会期望在代码中遇到其他下载器组具有以下名称的文件:MultiFileDownloader、FileGroupDownloader 或 DirectoryDownloader”
第 6 行。
“我们将下载器对象的 resultFileName 属性设置为变量 resultFileName 的值。换句话说,我们告诉加载器在哪里保存下载的文件。正如您所期望的那样。所以,我们基本上是在预测代码!”
第 7 行。
“我们调用 start 方法。下载开始。这是有道理的。我想知道下载是如何发生的:部分地,在一个单独的线程上,或者整个事情就在这里?如果我们在这里下载整个事情,它可能需要一个时间长了会产生后果。”
第 8-11 行。
“啊。这里我们看到有人在等待下载完成时编写的标准循环。downloder 对象有一个 done 属性,它由 isDone() 方法返回。因为该方法调用的是 isDone(),而不是 getDone( ),我们得出结论,done 变量是一个布尔值,或者可能是一个布尔值。”
第 13-14 行。
“如果在下载过程中发生错误,那么 downloadPhoto 方法将返回 null。它处理错误是好的。它只返回 null 是不好的——不清楚错误是什么。最好抛出一个异常,并提供有关的信息错误。”
第 16 行。
“我们返回包含下载文件的本地文件的路径。”
“哇!”
“这个程序的代码非常清楚它做了什么。你甚至可以猜测这个程序是如何组织的以及我们会找到哪些其他类/方法。”
“现在我明白名字的重要性了。”
“关于名称的更多信息。您通常可以猜到一个对象/类有哪些方法。例如,如果一个对象是一个集合,那么它很可能有一个 size() 或 count() 方法来获取元素的数量。还有,它可能会有一个 add() 或 insert() 方法。使用 get/getItem/getElement 方法从集合类中检索元素。”
“如果一个变量被称为 i、j 或 k,那么它很可能是一个循环计数器。”
“如果一个变量被称为 m 或 n,那么它很可能是一个数组/集合的大小。”
“如果一个变量名为 name,那么它很可能是一个包含某人姓名的字符串。”
“如果一个类称为 FileInputStream,那么它同时是一个文件和一个输入流。”
“你看到的代码越多,就越容易阅读别人的代码。”
“但有时有些代码很难阅读。在这种情况下,这里有一个非常实用的建议:”
提示 |
---|
编写代码就好像它会由一个知道你住在哪里的暴力精神病患者维护一样。 |
“这很有趣,但同时也不好笑。”
“现在谈谈用于命名变量的样式。”
“Java 开发人员试图为变量和方法提供信息丰富的名称。结果,名称通常由几个单词组成。复合名称的大写有 4 种样式。”
1) 小写字母 ——所有单词都用小写字母书写。例如:
“温室” 变“温室”
“好莱坞女孩” 变成了 “好莱坞女孩”
此样式用于包名称。
2) 大写 ——所有单词都用大写字母书写,并用下划线分隔。例如:
“最大值” 变为MAX_VALUE
“猫数” 变为CAT_COUNT
“此样式用于常量名称(最终静态字段)。”
3) CamelCase—— 所有单词都用小写字母书写,除了每个单词的第一个字母是大写的。例如:
“温室” 变成 “温室”
“好莱坞女孩” 变成了“好莱坞女孩”
这种风格用于类和接口的名称。
4) Lower CamelCase (mixed case) – 所有的单词都是用小写字母写的,除了第一个单词的第一个字母是大写的。例如:
“获取宽度”变为“getWidth”
“获取好莱坞女孩的名字”变为 “getHollywoodGirlName”
“这种风格用于变量和方法的名称。”
“所以,没有太多的规则。”
1) 一切都是用 Lower CamelCase 写的。
2) 类名和接口名总是大写。
3) 包名总是小写。
4) 常量总是大写的。
“有一些细微差别,但总的来说就是这样。”
“现在关于方法。 ”方法名称几乎总是以动词开头!'count' 是一个不好的方法名称。最好将其称为 getCount()。一种方法对对象执行某些操作: startDownload、interrupt 、sleep 、loadPirateMusic。”
“如您所知,有用于处理对象属性/字段的 getter 和 setter: getName / setName、getCount / setCount等。”
“唯一的例外是布尔值。对于布尔值,getter 名称使用'is',而不是'get',例如isDone,isEmpty。这样它更接近于普通语音。”
“每天工作 2 小时而不是 8 小时怎么样?受到诱惑吗?”
“是的!”
“正如你应该的那样。对于初级 Java 开发人员来说,基本要求是对 Java 的基础知识,即 Java Core 有很好的理解。”
“我还有一个问题。为什么我们有这些不同的方法来获取元素的数量?”
班级 | 获取元素数量的方法/属性 |
---|---|
细绳 | 长度() |
大批 | 长度 |
数组列表 | 大小() |
线程组 | 活跃计数() |
“首先,Java 是 20 多年前发明的,在setCount / getCount等要求尚未建立之前,有一种从 C 语言中提取的通用方法,即‘使其尽可能短’。”
“其次,语义在这里发挥作用。当谈论数组时,我们谈论它的长度。当谈论集合时,我们谈论它的大小。”
“多么有趣的一课啊。”
“我还想告诉你更多,但我怕你一下子记不起来,还是分小份分给你吃比较好。”
“但我确实想谈谈有关使用大括号的风格:{}。有两种方法:”
1) 括号每次都换行
2) 左括号在上一行的末尾,而右括号在新的一行。这种样式称为“埃及牙套”。
“老实说,你可以选择如何编码。很多人在同一行使用左大括号。很多人把它放在新的一行。这就像关于打破鸡蛋哪一端的争论:小端还是大端结尾。”
“我唯一可以推荐的是坚持你正在从事的项目中使用的任何风格。不要改变别人的代码来匹配你喜欢的风格。 人是不完美的。我以 Bilaabo 博士的身份告诉你这一点。 “
“感谢有趣的课程,Bilaabo。我会去反思你所说的话。”
GO TO FULL VERSION