提高代码可读性的实践

在编程过程中,代码的可读性是一个非常重要的方面。良好的可读性不仅有助于其他开发者理解代码,也方便未来的维护和扩展。本文将探讨如何通过改进方法参数的使用,提高代码的可读性。

参数的明确性

在调用方法时,参数的明确性至关重要。例如,在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();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485