65.9K
CodeProject 正在变化。 阅读更多。
Home

布尔参数与代码可读性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (24投票s)

2017 年 4 月 20 日

CPOL

1分钟阅读

viewsIcon

27457

参数注解 vs 重写方法以提高代码可读性

针对 注解常量参数 (2017年3月31日) 的回应。

上述文章中的示例试图解决方法调用中参数的歧义性。 如果使用如下调用:

GetRecord(true, false);

读者无法知道在这种情况下 true 或 false 的含义。 通常,如果这些值是变量或参数,它们可能会有一些指示,例如:

// Example 1: Using variables
var autoCreate = true;
var useCache = false;
GetRecord(autoCreate, useCache);

// Example 2: Using parameters
public void ProcessRecord(bool autoCreate, bool useCache){
    GetRecord(autoCreate, useCache);
    ...
}

但是作者建议,如果不是这样,你应该像这样注解你的参数:

GetRecord(autoCreate: true, useCache: false);

或者如果此语法不可用,则像这样:

GetRecord(true /* autoCreate */, false /* useCache */);

乍一看,我不反对这会使代码更具可读性,但是如果你可以,你应该更进一步。 想象一下 GetRecord 函数本身

public Record GetRecord(bool autoCreate, bool useCache)
{
    Record record = null;
    if(useCache){
        record = cache.GetRecord();
    }else{
        record = database.GetRecord();
    }
    if(autoCreate && record == null){
        record = new Record;
    }
    return record;
}

与其使用任意参数,我更愿意将其分解为多个方法,以使其更具可读性和可用性。

public Record GetRecord(bool useCache)
{ 
    if(useCache){
        return cache.GetRecord();
    }else{
        return database.GetRecord();
    }
}
    
public GetOrCreateRecord(bool useCache)
{
    var record = GetRecord(useCache);
    if(record == null){
        record = new Record;
    }
    return record;
}

现在我们有两个更简单的方法,它们做着名称所暗示的事情。 但是 useCache 的参数是一个可以消除的任意布尔值。 作为 GetRecord 函数的消费者,我不应该指定它从哪里获取记录。
根据需要,有几种解决方案。 最简单的方法是创建另一个方法。 我通常认为使用缓存是默认的,除非另有说明,所以我将创建另一个方法如下:

public Record GetRecordNoCache()
{       
    return database.GetRecord();
}

我们的其他方法则变为:

public Record GetRecord()
{       
    return cache.GetRecord() ?? GetRecordNoCache();
}

public GetOrCreateRecord()
{
    return GetRecord() ?? new Record();
}

现在,代替

public Record GetRecord(bool autoCreate, bool useCache)
{
    Record record;
    if(useCache){
        record = cache.GetRecord();
    }else{
        record = database.GetRecord();
    }
    if(autoCreate && record == null){
        record = new Record;
    }
    return record;
}

GetRecord(autoCreate: false, useCache: true);
GetRecord(autoCreate: false, useCache: false);
GetRecord(autoCreate: true, useCache: true);

我们有

public Record GetRecordNoCache()
{       
    return database.GetRecord();
}   
public Record GetRecord()
{       
    return cache.GetRecord() ?? GetRecordNoCache();
}   
public GetOrCreateRecord()
{
    return GetRecord() ?? new Record();
}

GetRecord();
GetRecordNoCache();
GetOrCreateRecord();

这又是朝着使我们的代码更具可读性迈出的进一步。

© . All rights reserved.