
作者 | 玄苏
命名是对事物本质的一种认知探索,是给读者一份宝贵的承诺。糟糕的命名会像迷雾,引领读者走进深渊;而好的命名会像灯塔,照亮读者前进的路。命名如此美妙,本文将一步步揭开它的神秘面纱!

达:通顺流畅
雅:简明优雅
public List<int[]> getThen(){
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x: theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
public List<int[]> getFlaggedCells(){
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell: gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell: gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
-
建模后可以竟然可以将这条语句语义化,可读性增强了;
-
STATUS_VALUE、FLAGGED 都被隐藏至Cell,更加了内聚;
// 槽糕的命名
public List<int[]> getThen();
// 好的命名
public List<Cell> getFlaggedCells();
// 槽糕的命名
private Date userCacheTime;
// 好的命名
private Date customerStayTotalTime;
-
别用accountList来指称一组账号,除非它真的时List类型。
-
避免变量名使用小写字母l和大写字母O。
public static void copyChars(char a1[], char a2[]){
for (int i = 0; i < a1.length; i++){
a2[i] = a1[i];
}
}
public static void copyChars(char source[], char destination[]){
for (int i = 0; i < source.length; i++){
destination[i] = source[i];
}
}
-
准确使用对仗词可以提高命名的区分度。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
尽量不要使用info/data为结尾去命名类名或变量名。
/**
* 用户的姓名
*/
public Sring userName;
/** 用户的姓名 **/
public class Employee {
...
public String getName(){...}
public String getAddress(){...}
public String getWorkPhone(){...}
public boolean isJobClassificaitionValid(JobClassification jobClass){...}
public boolean isZipCodeValid(Address address){...}
public boolean isPhoneNumberValid(PhoneNumber phoneNumber){...}
public SqlQuery getQueryToCreateNewEmployee(){...}
public SqlQuery getQueryToModifyEmployee(){...}
public SqlQuery getQueryToRetrieveEmployee(){...}
...
}
public class Employee {
...
public String getName(){...}
public String getAddress(){...}
public String getWorkPhone(){...}
public String createEmployee(...){...}
public String updateEmployee(...){...}
public String deleteEmployee(...){...}
...
}
//取默认搜索条件
List<String> defaultConditions = searchConditionCacheTunnel.getJsonQueryByLabelKey(labelKey);
for (String jsonQuery : defaultConditions) {
jsonQuery = jsonQuery.replaceAll(SearchConstants.SEARCH_DEFAULT_PUBLICSEA_ENABLE_TIME,
String.valueOf(System.currentTimeMillis() / 1000));
jsonQueryList.add(jsonQuery);
}
//取主搜索框的搜索条件
if (StringUtils.isNotEmpty(cmd.getContent())) {
List<String> jsonValues = searchConditionCacheTunnel.getJsonQueryByLabelKey(
SearchConstants.ICBU_SALES_MAIN_SEARCH);
for (String value : jsonValues) {
String content = StringUtil.transferQuotation(cmd.getContent());
value = StringUtil.replaceAll(value, SearchConstants.SEARCH_DEFAULT_MAIN, content);
jsonQueryList.add(value);
}
}
public class SearchConditionAssembler {
public static SearchCondition assemble(String labelKey) {
String jsonSearchCondition = getJsonSearchConditionFromCache(labelKey);
SearchCondition sc = assembleSearchCondition(jsonSearchCondition);
return sc;
}
}
-
别抖机灵
-
使用问题领域的名称
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
动机
-
例如:一个函数的用途是把某人的电话号码转换成特定的格式,并且这个函数的参数是一个人,那么我就没法用这个函数来处理公司的电话号码。如果把函数接收的参数由“人”改成“电话号码”,这段处理电话格式的代码就能被更广泛地使用。
-
如果这个函数的意图只是将电话号码转换成特定的格式,那么只引入电话号码是合适的。
-
如果这个函数的意图是得到“人”的电话号码格式并且他的号码是通过自身的其他属性合成, 那么应该引入“人”。
做法
public long circum(long radius){
return 2 * Math.PI * radius;
}
public long circumference(long radius){
return 2 * Math.PI * radius;
}
public long circum(long radius){
return 2 * Math.PI * radius;
}
public long circumference(long radius){
return 2 * Math.PI * radius;
}
动机
机制
范例
int treeName = "untitled";
treeName = "bigtree";
leftTree = treeName;
private int treeName;
public void init(){
treeName = "untitled";
}
public String getTreeName(){
return treeName;
}
public void setTreeName(String treeName){
this.treeName = treeName;
}
谈谈 Java 接口 Result 设计


