1. 卫语句(guard clause)
卫语句用于提前处理特殊情况,避免深层嵌套的条件判断,使代码逻辑更清晰。
传统嵌套写法
public string processorder(int quantity, double price, double discount)
{
if (quantity > 0)
{
if (price > 0)
{
if (discount >= 0)
{
double total = quantity * price * (1 - discount);
return $"total cost: {total}";
}
else
{
return "discount must be non-negative";
}
}
else
{
return "price must be positive";
}
}
else
{
return "quantity must be positive";
}
}
使用卫语句改进
public string processorder(int quantity, double price, double discount)
{
// 卫语句:提前检查特殊情况
if (quantity <= 0)
return "quantity must be positive";
if (price <= 0)
return "price must be positive";
if (discount < 0)
return "discount must be non-negative";
// 主逻辑:无需嵌套
double total = quantity * price * (1 - discount);
return $"total cost: {total}";
}
优点:
- 减少嵌套层次,代码更易读。
- 提前处理异常情况,逻辑更清晰。
2. 使用枚举替换嵌套条件
枚举可以用来替换某些场景下的嵌套条件判断,尤其是当代码中存在多个固定的状态或类型时。
传统嵌套写法
public string getpermissionlevel(string role)
{
if (role == "admin")
{
return "full access";
}
else if (role == "editor")
{
return "edit access";
}
else if (role == "viewer")
{
return "view access";
}
else
{
return "no access";
}
}
使用枚举改进
public enum role
{
admin,
editor,
viewer
}
public string getpermissionlevel(role role)
{
switch (role)
{
case role.admin:
return "full access";
case role.editor:
return "edit access";
case role.viewer:
return "view access";
default:
return "no access";
}
}
优点:
- 枚举值具有明确的语义,避免硬编码字符串。
- 减少嵌套条件判断,代码更简洁。
3. 使用字典映射 进一步优化
如果每个枚举值对应的行为是固定的,可以使用字典来进一步简化逻辑。
使用字典映射改进
public enum role
{
admin,
editor,
viewer
}
public class permissionmanager
{
private static readonly dictionary<role, string> permissionlevels = new dictionary<role, string>
{
{ role.admin, "full access" },
{ role.editor, "edit access" },
{ role.viewer, "view access" }
};
public string getpermissionlevel(role role)
{
if (permissionlevels.trygetvalue(role, out var permissionlevel))
{
return permissionlevel;
}
return "no access";
}
}
优点:
- 完全消除嵌套条件判断。
- 添加新角色时只需更新字典,无需修改函数逻辑。
4. 单一职责原则(srp)
每个函数或类应该只负责一项任务,这样可以提高代码的可读性、可维护性和可测试性。
改进前
public string processorder(int quantity, double price, double discount)
{
if (quantity <= 0)
return "quantity must be positive";
if (price <= 0)
return "price must be positive";
if (discount < 0)
return "discount must be non-negative";
double total = quantity * price * (1 - discount);
return $"total cost: {total}";
}
改进后
public class orderprocessor
{
public void validateinput(int quantity, double price, double discount)
{
if (quantity <= 0)
throw new argumentexception("quantity must be positive");
if (price <= 0)
throw new argumentexception("price must be positive");
if (discount < 0)
throw new argumentexception("discount must be non-negative");
}
public double calculatetotal(int quantity, double price, double discount)
{
return quantity * price * (1 - discount);
}
public string processorder(int quantity, double price, double discount)
{
validateinput(quantity, price, discount);
double total = calculatetotal(quantity, price, discount);
return $"total cost: {total}";
}
}
优点:
- 每个函数只做一件事,职责清晰。
- 更容易测试和复用。
5. 避免重复代码(dry - don’t repeat yourself)
重复代码会增加维护成本,容易引入错误。通过提取公共逻辑到函数或工具类中,可以避免重复。
改进前
public double calculateareaofsquare(double side)
{
return side * side;
}
public double calculateareaofrectangle(double length, double width)
{
return length * width;
}
改进后
public double calculatearea(string shape, params double[] dimensions)
{
switch (shape)
{
case "square":
return dimensions[0] * dimensions[0];
case "rectangle":
return dimensions[0] * dimensions[1];
default:
throw new argumentexception("unsupported shape");
}
}
优点:
- 减少重复代码,逻辑更集中。
- 更容易扩展新功能。
6. 使用有意义的命名
变量、函数和类的命名应该清晰表达其用途,避免使用模糊或缩写。
改进前
public double calc(double a, double b)
{
return a * b;
}
改进后
public double calculatearea(double length, double width)
{
return length * width;
}
优点:
- 代码更易读,减少理解成本。
- 减少注释的必要性。
7. 使用异常处理
合理使用异常处理可以提高代码的健壮性,避免程序崩溃。
改进前
public double divide(double a, double b)
{
return a / b; // 如果 b 为 0,会抛出异常
}
改进后
public double divide(double a, double b)
{
if (b == 0)
throw new dividebyzeroexception("division by zero is not allowed");
return a / b;
}
优点:
- 明确处理异常情况,避免意外错误。
- 提高代码的可靠性。
8. 编写单元测试
单元测试可以确保代码的正确性,并在修改代码时提供安全保障。
示例
using microsoft.visualstudio.testtools.unittesting;
[testclass]
public class mathoperationstests
{
[testmethod]
public void testadd()
{
assert.areequal(5, add(2, 3));
assert.areequal(0, add(-1, 1));
}
public int add(int a, int b)
{
return a + b;
}
}
优点:
- 确保代码逻辑正确。
- 支持重构和持续集成。
9. 使用设计模式
设计模式是解决常见问题的经典方案,可以提高代码的可扩展性和可维护性。
示例:工厂模式
public interface ianimal
{
string speak();
}
public class dog : ianimal
{
public string speak()
{
return "woof!";
}
}
public class cat : ianimal
{
public string speak()
{
return "meow!";
}
}
public class animalfactory
{
public static ianimal createanimal(string type)
{
switch (type)
{
case "dog":
return new dog();
case "cat":
return new cat();
default:
throw new argumentexception("unknown animal type");
}
}
}
// 使用
var dog = animalfactory.createanimal("dog");
console.writeline(dog.speak()); // 输出: woof!
优点:
- 解耦对象的创建和使用。
- 提高代码的灵活性。
10. 代码注释和文档
良好的注释和文档可以帮助他人理解代码的意图和实现细节。
示例
/// <summary>
/// 计算矩形面积。
/// </summary>
/// <param name="length">矩形的长度</param>
/// <param name="width">矩形的宽度</param>
/// <returns>矩形的面积</returns>
public double calculatearea(double length, double width)
{
return length * width;
}
优点:
- 提高代码的可读性。
- 方便团队协作和维护。
11. 使用版本控制工具
使用 git 等版本控制工具可以跟踪代码变更,方便协作和回滚。
示例
git init git add . git commit -m "initial commit"
优点:
- 记录代码历史,方便回溯。
- 支持团队协作开发。
12. 代码重构
定期重构代码,优化结构和性能,保持代码的健康状态。
改进前
public list<int> processdata(list<int> data)
{
list<int> result = new list<int>();
foreach (var item in data)
{
if (item % 2 == 0)
{
result.add(item * 2);
}
}
return result;
}
改进后
public list<int> processdata(list<int> data)
{
return data.where(item => item % 2 == 0).select(item => item * 2).tolist();
}
优点:
- 代码更简洁,性能更好。
- 减少潜在的错误。
总结
通过以下技巧可以显著改善代码质量:
- 卫语句
- 使用枚举替换嵌套条件
- 使用字典映射
- 单一职责原则
- 避免重复代码
- 使用有意义的命名
- 使用异常处理
- 编写单元测试
- 使用设计模式
- 代码注释和文档
- 使用版本控制工具
- 代码重构
结合这些技巧,可以编写出高质量、易维护的代码。
到此这篇关于使用c#改善代码质量的技巧和实践的文章就介绍到这了,更多相关c#改善代码质量内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论