你可以做 3 个非常简单的改变来清理你的代码
你可以做 3 个非常简单的改变来清理你的代码
Photo by Maico Amorim
一个代码重构总是给我一种成就感。尽管主要的重构是最令人满意的,但是每个项目并不总是保证它们。为了提高代码可读性,我对我的所有项目进行了 3 次快速简单的重构:
1.清除格式
代码的整体格式使得快速导航到感兴趣的区域成为可能。一致的缩进、换行符和模式有助于程序员浏览大块的代码。以下面的草率格式化的代码为例:
Inventory inventory = new Inventory();
for (int i = 0; i < cars.Count; i++){
inventory.Cars.Add(cars[i]);
var owner = owners.Where(x => x.VIN == cars[i].VIN).OrderByDescending(x => x.PurchaseDate).FirstOrDefault();inventory.PreviousOwners.Add(new Owner { VIN = cars[i].VIN,
Name = owner.Name});
}
和这个比较一下:
Inventory inventory = new Inventory();for (int i = 0; i < cars.Count; i++)
{
inventory.Cars.Add(cars[i]);
var owner = owners.Where(x => x.VIN == cars[i].VIN)
.OrderByDescending(x => x.PurchaseDate)
.FirstOrDefault(); inventory.PreviousOwners.Add(new Owner
{
VIN = cars[i].VIN,
Name = owner.Name
});
}
上面的第二个例子一致地缩进行,添加新行,并遵循一致的编码模式。这使得快速浏览代码变得很容易。
书籍有通过格式化定义的章节、标题和段落,这样很容易一眼就能找到需要的内容——格式化代码也使查找内容变得容易。
2.重命名类、方法和变量
类、方法和变量的命名应该有助于程序员理解代码中发生了什么。对象的范围越小,越允许使用较短的名字(比如在只有一两行的循环中用“I”作为计数器)。
在编写程序的“初稿”时,很容易使用无信息的名字,但是使用想到的名字并不总是最好的选择。看一下下面的例子:
public IEnumerable<string> GetData(int year)
{
var result = CallApi("/Cars", year); IEnumerable<string> output = new IEnumerable<string>(); foreach(var c in result)
{
output.Add(c.Make);
}
}
对比:
public IEnumerable<string> RetrieveCarMakes(int year)
{
var inventory = CallApi("/Cars", year); IEnumerable<string> carMakes = new IEnumerable<string>();
foreach(var car in inventory)
{
carMakes.Add(car.Make);
}
}
使用有意义的名字会让其他人(或者你的未来)更容易理解你的代码在做什么。
3.拆分长表达式
当您进入代码编写的最佳状态时,很容易将命令链接在一起或使用单行语法来加快编写速度。很多时候,一天后我回头看我的代码,我会看到类似这样的长表达式。看看这两行表达式:
bool hasHighSaleProbability = (daysOnLot < 60) ? true : (color == "Red" ? true : false);var highSaleProbabilityVehicles = Inventory.Where(x => x.DaysOnLot < 60 or x.Color == "Red").Select(x => new { Make = x.Make, Model = x.Model, Year = x.Year }).Distinct().Select(x => new RecentInventoryView { YearDropdown = new SelectListItem { Text = x.Year, Value = x.Year }, MakeModelDropdown = new SelectListItem { Text = x.Make + " " + x.Model, Value = x.Make + " " + x.Model } });
与这个被分成多行的表达式相比:
bool hasHighSaleProbability = false;if (daysOnLot < 60 || color == "Red")
{
hasHighSaleProbability = true;
}var distinctMakesModelsYears = Inventory
.Where(x => x.DaysOnLot < 60 or x.Color == "Red")
.Select(x => new
{
Make = x.Make,
Model = x.Model,
Year = x.Year
})
.Distinct()
.ToList();var recentInventoryView = distinctMakesModelsYears
.Select(x => new RecentInventoryView
{
YearDropdown = new SelectListItem
{
Text = x.Year,
Value = x.Year
},
MakeModelDropdown = new SelectListItem
{
Text = x.Make + " " + x.Model,
Value = x.Make + " " + x.Model
}
});
尽管第一段代码在技术上更短,行数更少,但它几乎不可读。第二个代码片段分解了 if 逻辑,并将所有链接的方法分解成更多的逻辑变量。结果呢?更容易理解的代码逻辑。
你有什么经常做的“快速重构”吗?请在下面的评论中分享!