Skip to content

可维护性反模式

识别和避免影响代码可维护性的问题。


📋 文档信息

属性
难度中级
阅读时间20 分钟
前置知识代码质量基础
相关文档反模式索引最佳实践

反模式 1: 硬编码字符串

❌ 错误做法

csharp
public void GenerateCode()
{
    var code = @"
namespace MyNamespace
{
    public class MyClass
    {
        public void MyMethod()
        {
            // 硬编码的命名空间和类名
        }
    }
}";
}

✅ 正确做法

csharp
private const string DefaultNamespace = "MyNamespace";
private const string DefaultClassName = "MyClass";

public void GenerateCode(string namespaceName = null, string className = null)
{
    namespaceName ??= DefaultNamespace;
    className ??= DefaultClassName;
    
    var code = $@"
namespace {namespaceName}
{
    public class {className}
    {
        // 使用参数化的名称
    }
}";
}

反模式 2: 缺少文档

❌ 错误做法

csharp
public void Process(ISymbol s)
{
    var t = s as ITypeSymbol;
    if (t != null)
    {
        var n = t.Name;
        // 做一些事情...
    }
}

✅ 正确做法

csharp
/// <summary>
/// 处理符号并提取类型信息
/// </summary>
/// <param name="symbol">要处理的符号</param>
public void ProcessSymbol(ISymbol symbol)
{
    // 尝试将符号转换为类型符号
    if (symbol is ITypeSymbol typeSymbol)
    {
        var typeName = typeSymbol.Name;
        // 处理类型名称...
    }
}

反模式 3: 复杂的嵌套逻辑

❌ 错误做法

csharp
public void ProcessNode(SyntaxNode node)
{
    if (node != null)
    {
        if (node is ClassDeclarationSyntax cls)
        {
            if (cls.Members.Count > 0)
            {
                foreach (var member in cls.Members)
                {
                    if (member is MethodDeclarationSyntax method)
                    {
                        if (method.Modifiers.Any(m => m.IsKind(SyntaxKind.PublicKeyword)))
                        {
                            // 深度嵌套...
                        }
                    }
                }
            }
        }
    }
}

✅ 正确做法

csharp
public void ProcessNode(SyntaxNode node)
{
    // 早期返回减少嵌套
    if (node == null) return;
    if (node is not ClassDeclarationSyntax cls) return;
    if (cls.Members.Count == 0) return;
    
    foreach (var member in cls.Members)
    {
        ProcessMember(member);
    }
}

private void ProcessMember(MemberDeclarationSyntax member)
{
    if (member is not MethodDeclarationSyntax method) return;
    if (!IsPublicMethod(method)) return;
    
    // 处理公共方法...
}

private bool IsPublicMethod(MethodDeclarationSyntax method)
{
    return method.Modifiers.Any(m => m.IsKind(SyntaxKind.PublicKeyword));
}

反模式 4: 代码重复

❌ 错误做法

csharp
public void ProcessClass(ClassDeclarationSyntax cls)
{
    var name = cls.Identifier.Text;
    var namespaceName = GetNamespace(cls);
    var fullName = $"{namespaceName}.{name}";
    // 使用 fullName...
}

public void ProcessStruct(StructDeclarationSyntax str)
{
    var name = str.Identifier.Text;
    var namespaceName = GetNamespace(str);
    var fullName = $"{namespaceName}.{name}";
    // 使用 fullName...
}

✅ 正确做法

csharp
public void ProcessClass(ClassDeclarationSyntax cls)
{
    var fullName = GetFullTypeName(cls);
    // 使用 fullName...
}

public void ProcessStruct(StructDeclarationSyntax str)
{
    var fullName = GetFullTypeName(str);
    // 使用 fullName...
}

private string GetFullTypeName(BaseTypeDeclarationSyntax typeDecl)
{
    var name = typeDecl.Identifier.Text;
    var namespaceName = GetNamespace(typeDecl);
    return $"{namespaceName}.{name}";
}

关键要点

  • ✅ 避免硬编码字符串,使用常量或配置
  • ✅ 添加清晰的文档和注释
  • ✅ 减少嵌套深度,使用早期返回
  • ✅ 提取重复代码到共享方法

相关文档


最后更新: 2026-02-06

基于 MIT 许可发布