在编程过程中,代码的可读性是一个非常重要的方面。良好的可读性不仅有助于其他开发者理解代码,也方便未来的维护和扩展。本文将探讨如何通过改进方法参数的使用,提高代码的可读性。
在调用方法时,参数的明确性至关重要。例如,在C#中,如果调用一个方法如下:
GetRecord(true, false);
读者可能不清楚这些布尔值代表什么。如果这些值是变量或参数,可能会有一些提示:
var autoCreate = true;
var useCache = false;
GetRecord(autoCreate, useCache);
或者:
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;
}
与其使用任意参数,不如将其分解成多个方法,使其更易读和可用。
可以将GetRecord方法重构为两个更简单的方法:
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();