【问题标题】:StyleCop Madness: protected fieldStyleCop 疯狂:受保护的领域
【发布时间】:2011-08-17 18:08:13
【问题描述】:

我被委托让其他人的代码尽可能符合一些 StyleCop 规则集。现在我想知道以下案例:

我有一个包含字段的抽象类

protected double[] coefficients;

Stylecop 说:SA1401:字段必须声明为私有访问。使用属性来公开字段。

所以我把它改成了:

protected double[] coefficients { get; set; } 

Stylecop 说:SA1300:属性名称以大写字母开头:系数。

由于它是一个抽象类,因此子类超出了我的控制范围。他们使用他们父母的班级字段base.coefficients..好吧。

所以.. 除了抑制(或禁用)它之外,没有其他方法可以消除此警告,对吧? :T

【问题讨论】:

    标签: c# inheritance protected stylecop


    【解决方案1】:

    嗯,实际上你没有。

    如果您想在未来的代码版本中清理它,您可以设置不推荐使用的 coefficients 属性,并提供一条消息,指出该属性将在任何后续版本的代码中删除。

    在当前版本中:

    private double[] _coefficients;
    
    // Using this property will produce a compile-time warning.
    [Obsolete("coefficients will be removed in future versions. Use Coefficients instead.")]
    protected double[] coefficients 
    { 
        get { return _coefficients; } 
        set { _coefficients = value; } 
    }
    
    protected double[] Coefficients 
    { 
        get { return _coefficients; } 
        set { _coefficients = value; } 
    }
    

    在以后的版本中:

    private double[] _coefficients;
    
    // Using this property will produce a compile-time error.
    [Obsolete("coefficients was removed. Use Coefficients instead.", true)]
    protected double[] coefficients 
    { 
        get { return _coefficients; } 
        set { _coefficients = value; } 
    }
    
    protected double[] Coefficients 
    { 
        get { return _coefficients; } 
        set { _coefficients = value; } 
    }
    

    【讨论】:

    • 非常感谢......虽然在其他人的 cmets 之后,我可能会压制警告并完成它。 ;)
    • 是的,当然我的回答只适用于你真的需要修复这个问题:)
    • 这个代码虽然会让你直接陷入 FxCop 违规,因为你的成员只是大小写不同:)
    • 修一个,得到一个。至少它是平衡的:)
    【解决方案2】:

    即使将字段更改为属性也是一个潜在的破坏性更改。如果您必须保持与您无法控制的已编译二进制文件的兼容性,我什至不建议进行 first 更改。

    关于 StyleCop,您必须记住的一点是,它顽固地坚持您要遵循编码准则,这与规则并不完全相同。您遇到的两个准则都是完全合理的。在编写新代码时,我总是跟随他们。你也应该。但是,如果像您的情况一样,兼容性更重要,那么忽略 StyleCop 的坚持可能是允许的。

    即使您要解决当前的警告,它可能会遇到的下一件事(或者如果没有,它should,FxCop 肯定会抓住这个)是永远不应该暴露数组作为接口的一部分(意思是,标记为protectedpublic)。相反,您应该公开IEnumerable<T>IList<T>ReadOnlyCollection<T> 之类的内容。

    冲洗,起泡,重复。如果你不能真正改变代码,你只是在追逐你的尾巴。

    为了看看我是否能让你更加疯狂,我会注意到,如果 FxCop 发现子类在不覆盖的情况下显式调用其父类的成员时,它会发疯该成员自己的实施。所以基本上,base.coefficients 首先是禁止的。如果您遵循所有指南,则可以更轻松地遵循它们。当然,合乎逻辑的推论是,如果您遵循所有准则,那么遵循它们就会变得更加困难。

    【讨论】:

    • 非常感谢实用的观点。正确看待指导方针是件好事。
    【解决方案3】:

    如果将字段更改为属性,派生类(来自其他编译的程序集)将找不到“系数”,因为属性是两种方法的快捷方式 - 不等于字段。

    如果您必须保持与其他程序集的兼容性,则兼容性必须是主要目标,而 StyleCop 规则是次要目标。

    【讨论】:

    • 是的。好吧,到目前为止,我通常能够判断是否可以更改某些内容以使其符合要求。例如间距、私有变量等 - 我只是不确定我是否过快宣布这种情况“无法解决”。
    • 嗯...你能详细说明一下吗? Florian 的解决方案似乎适用于我的单元测试。
    • 如果你用编辑过的源代码重新编译单元测试,没有问题。更改字段->属性的问题仅在于,如果依赖的代码已经编译并且无法重新编译。
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多