代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

08 | 写好声明的“八项纪律”

代码改进
Java代码示例
搜索优化的换行
靠紧的小括号
尾随的花括号
声明时就初始化
类属性要集中声明
局部变量需要时再声明
一行一个声明
取一个好名字
初始化
修饰和限定部分
标识符类型
定义标识符
优化示例
八项纪律
声明
声明的“八项纪律”

该思维导图由 AI 生成,仅供参考

我们在前面讨论了该怎么取一个好名字。在编程语言里,我们使用标识符来表示不同的逻辑和对象。声明就是用来定义这些标识符的。标识符声明的地方,就是取名字和第一次使用名字的地方。这一次,我们聊一聊该怎么声明一个标识符。
“声明”是我们和标识符初次见面的地方,第一印象就显得特别重要。如果我们忘记了,回头能够清晰地找到它,也很重要。如果我们印象模糊了,回头能够重新认识它,对于我们阅读程序也有很大的帮助。
一个标识符,不仅仅只是一个名字。 像人分男女、高矮胖瘦一样,标识符也可以有附加信息,用来增强人们对它的认识。
一个声明,一般至少包含两个部分,一个是标识符的名字,一个是标识符的类型。 比如:
int size;
有的声明,还有修饰和限定部分,比如 Java 的访问控制修饰符(private,public 等):
private int size;
或者 C 语言的存储类别限定符(auto,extern 等):
auto int size;
写声明很简单,但写好声明也并非易事。我们以 Java 语言为例来讨论声明的编码风格。在 Java 语言里,声明可以用来定义类、方法、类变量、局部变量和常量。不同声明的语法有着巨大的差别,但是也有很多共通的地方,你可以把这些思路用在自己熟悉的语言上。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章标题为“写好声明的‘八项纪律’”,主要讨论了在编程语言中如何声明标识符以及编写好的声明的八项原则。首先强调了取一个好名字的重要性,然后提出了一行一个声明、局部变量需要时再声明、类属性要集中声明、声明时就初始化等八项纪律。文章还提供了一段Java代码示例,并鼓励读者对其进行优化。总的来说,文章强调了编写好声明的重要性,提供了具体的编码风格建议,并鼓励读者动手实践。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • Y024
    代码图片建议用 carbon 美化下,可读性会更好:) https://carbon.now.sh/

    作者回复: 刚注意到代码图片里的一些规范问题,手误。 看了下carbon,很不错的工具。 谢谢推荐!

    2019-01-29
    2
    9
  • pyhhou
    第28,29,39,40,44行相对应带上大括号会更好 第39,40,44行属于一行表示多重行为,不便于观察和理解,换行会更好 第28,31,36,42,47行的代码与前面的代码没有很好的分块,构成不了视觉上面清晰的代码块,在前面加上空行会更好 第35行命名不够清晰,修改为Map<Character, Character> charMapping = new HashMap<>(); 第29行,就像前面 @背着吉他的大漠狼 同学说的,if 里面的 match 函数其实表示的意义不太明确,读者需要去看 match 函数的大致实现,如果在此之前定义一个boolean isMatched = match(word, pattern); 再将 isMatched 放到 if 里面会好很多;而且把函数直接放在 if 语句里面其实也违反了我们之前提到的单行单一行为的原则,因为运行函数返回结果和表达式条件判断在概念上本就是两个完全不同的行为 能看到的就这些了,不足之处还请老师和大神们补充

    作者回复: 找的都很棒!

    2019-01-22
    4
  • allean
    细节无小事,高手不是掌握了降龙十八掌,而是简单的事也能做到极致,学习了。

    作者回复: 质量的事是大事(追求),质量的事是小事(执行)。

    2019-01-21
    4
  • Lindroid
    length方法直接写在for循环语句中会不会不是很好呢?因为这样每次循环都会调用它去获取word字符的长度,所以我觉得可以在for循环直接声明一个变量,值就是word的字符长度: int wordLength = word.length(); for (int i = 0; i < wordLength; i++) { …… }

    作者回复: 赞这个发现!

    2019-01-31
    2
  • 王智
    ``` import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Solution { /** * Return a list of the words in words that match the given pattern. * * A word matches the pattern if there exists a permutation of * letters p so that after replacing every letter x in the pattern * with p(x), we get the desired word. * * Example: * Input: words = ["abc","deq","mee","aqq","dkd","ccc"], * pattern = "abb" * Output: ["mee","aqq"] * * Explanation: "mee" matches the pattern because there is * a permutation {a -> m, b -> e, ...}. * * "ccc" does not match the pattern because * {a -> c, b -> c, ...} is not a permutation, since a * and b map to the same letter. */ public List<String> findAndReplacePattern(String[] words, String pattern) { List<String> ans = new ArrayList(); for (String word : words) { if (match(word, pattern)) { ans.add(word); } } return ans; } public boolean match(String word, String pattern) { Map<Character, Character> M = new HashMap(); for (int i = 0; i < word.length(); ++i) { char w = word.charAt(i); char p = pattern.charAt(i); if (!M.containsKey(w)) { M.put(w, p); } if (M.get(w) != p) { return false; } } boolean[] seen = new boolean[26]; for (char p : M.values()) { if (seen[p - 'a']) { return false; } seen[p - 'a'] = true; } return true; } } ``` 改成我喜欢的格式,虽然不一定准确,但是自己看上去舒服很多

    作者回复: 舒服很多就是收获了。

    2019-01-21
    2
  • 小文
    还想问个问题就是c++得成员变量初始化可以再声明的时候初始化也可以在构造函数初始化,那哪种比较好呢

    作者回复: 和Java的惯例相比,道理是一样的。C语言,我更倾向于声明时就初始化一点。Java有固定的缺省的值,C语言的缺省值是随机的,一旦初始化遗漏,很多麻烦。

    2019-02-15
    1
  • 背着吉他的大漠狼
    1,if语句尽量不要涉及复杂的表达式,可以用局部变量申明出来 2,例子中有些许的不同语义的卸载了同一行,写没很好使用花括号 3,方法体内可以将申明部分与逻辑部分使用空行加强阅读理解

    作者回复: “if语句尽量不要涉及复杂的表达式”,这个经验很赞!

    2019-01-21
    2
    1
  • Demon.Lee
    老师,声明时就初始化,好像我定义那些实体Bean时候,并没有这么做,这个也要看情况吧?

    作者回复: 要看情况,简单的声明优先声明时就初始化。但是也有很多声明,特别是涉及效率的时候,要延迟初始化。我们后面还会专门将延迟初始化。所以,那一段我有加一个这个原则的适用条件。

    2019-01-21
    1
  • aoe
    老师,请教您一个问题: Java中类变量的初始化不是都放在构造函数或者初始化函数中吗?您的示例中是声明的时候直接初始化的,是不是有复杂逻辑(需要通过调用方法赋值)的才需要放在初始化函数中?

    作者回复: 声明的时候直接初始化很常见。如果相同的变量在不同的初始化里值不一样,才需要放在构造函数里,或者初始化函数里。

    2021-12-10
    2
  • newtonker
    emptyMethod的方法体里还需要加一行blank的注释吗?

    作者回复: 如果没有这一行,视觉效果是不是稍差一点点?

    2020-09-08
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部