命名有两个原则: 1.清晰:你要知道该命名与什么有关 2.精确:你要知道该命名与什么无关 原则 1.命名中无需含有表示变量或参数类型的单词 对于集合来说,最好使用名词的复数形式来描述其内容,而不是使用名词的单数形式,如果开发者在乎集合中存储的内容,那么在命名应当反映这一点。
// 不好的 List<DateTime> holidayDateList; Map<Employee, Role> employeeRoleHashMap; // 改进: List<DateTime> holidays; Map<Employee, Role> employeeRoles; 这一点同样适用方法的命名。方法名不需要描述它的参数及参数的类型---参数列表已经说明了这些 // 不好的: mergeTableCells(List<TableCell> cells) sortEventsUsingComparator(List<Event> events,Comparator<Event> comparator) // 改进: merge(List<TableCell> cells) sort(List<Event> events, Comparator<Event> comparator)2.省略命名中不是用来消除歧义的单词 命名只是一个标识符:只是告诉你该变量是在哪定义的。并不是用来告诉阅读者所有他们想知道的有关这个对象的详细信息。这是定义应该做的事情。命名只是让你找到它的定义。 当我看到一个叫recentlyUpdatedAnnualSalesBid(最近更新的全年销售投标)的标识符时,我会问: 存在不是最近更新的全年销售投标么? 存在没有被更新的最近的全年销售投标么? 存在最近更新的非全年的销售投标么? 存在最近更新的全年非销售的投标么? 存在最近更新的全年销售非投标的东东吗?
// 不好的: finalBattleMostDangerousBossMonster; weaklingFirstEncounterMonster; // 改进: boss; firstMonster;3.省略命名中可以从上下文获取的单词 类中的方法/属性和方法中的变量,都是存在在上下文中的,无需重复。 // Bad: class AnnualHolidaySale { int _annualSaleRebate; void promoteHolidaySale() { … } }
// Better: class AnnualHolidaySale { int _rebate; void promote() { ... } } 实际上,一个命名嵌套的层次越多, 它就有更多的相关的上下文,也就更简短。换句话说,一个变量的作用域越小,命名就越短。4.省略命名中无任何含义的单词 在命名时可以问一下自己,把这个单词去掉含义是不是不变?如果是,那就果断把它剔除吧~~
注: 可读性 可维护性 简洁性 –不要让你的代码看上去毫无必要的复杂 效率性 明确性 –
好的代码本身就是最好的说明文档。 参考书籍: 1.代码大全2 2.重构与模式 3.代码整洁之道 4.编写可读代码的艺术 5.编写高质量代码:改善Java程序的151个建议 6.Effective Java(第二版)