布尔参数与代码可读性






4.82/5 (24投票s)
参数注解 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();
这又是朝着使我们的代码更具可读性迈出的进一步。