StyleCop Madness: защищенное поле - PullRequest
4 голосов
/ 03 мая 2011

Мне было поручено сделать код других людей совместимым с каким-либо набором правил StyleCop, насколько это возможно ... теперь мне было интересно узнать о следующем случае:

У меня есть абстрактный класс, содержащий поле

protected double[] coefficients;

Stylecop говорит: SA1401: Поля должны быть объявлены с закрытым доступом.Используйте свойства для предоставления полей.

Поэтому я изменил его на:

protected double[] coefficients { get; set; } 

Stylecop говорит: SA1300: имена свойств начинаются с заглавной буквы: коэффициенты

Поскольку это абстрактный класс, дочерние классы находятся вне моего контроля.И они используют поле класса своих родителей base.coefficients .. хорошо.

Так что ... нет другого способа избавиться от этого предупреждения, кроме как подавить (или отключить) его, верно?: Т

Ответы [ 3 ]

8 голосов
/ 03 мая 2011

Ну, на самом деле это не так.

Если вы хотите очистить его в будущих выпусках кода, вы можете установить свойство 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; } 
}
4 голосов
/ 03 мая 2011

Даже изменение полей в свойствах является потенциально разрушительным изменением.Если вам нужно сохранить совместимость с скомпилированными двоичными файлами, которые вы не можете контролировать, я даже не рекомендую вносить first change.

В StyleCop следует помнить, чтоупорно настаивает на том, что вы следовать кодирования Рекомендации , которые не являются на самом деле то же самое, как правила.Оба руководства, с которыми вы столкнулись, вполне разумны.Я всегда следую за ними при написании нового кода.Тебе тоже следует.Однако, если, как и в вашем случае, совместимость важнее, возможно, допустимо игнорировать настойчивость StyleCop.

Даже если вы решите текущее предупреждение, следующая вещь, которую он, вероятно, поразит вас (или, если это не так, он должен , и FxCop определенно это улавливает) в том, что массивы никогда не должны отображаться как часть интерфейса (то есть, помеченные protected или public).Вместо этого вы должны выставить что-то вроде IEnumerable<T>, IList<T> или ReadOnlyCollection<T>.

Прополоскать, вспенить, повторить.Вы просто гоняетесь за хвостом, если не можете реально изменить код.

И просто чтобы посмотреть, смогу ли я довести вас до безумия, я отмечу, что FxCop бросил бы приступ, если бы это былообнаружьте, что дочерние классы явно вызывали член в своем родительском классе, если они не переопределяют реализацию этого члена сами.Так что, в основном, base.coefficients - это нет-нет.Если вы будете следовать всем инструкциям, это облегчит их соблюдение.Логичное следствие, конечно, заключается в том, что если вы не не следуете всем рекомендациям, это делает их выполнение гораздо более сложным.

1 голос
/ 03 мая 2011

Если вы измените поле на свойство, производные классы (из других скомпилированных сборок) не найдут «коэффициенты», потому что свойство является ярлыком для двух методов, а не равняется полю.с другими сборками совместимость должна быть основной, а правила StyleCop - вторичной целью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...