Почему StyleCop рекомендует метод префикса или вызовы свойств с "этим"?


Я пытался следовать рекомендациям StyleCop по проекту, чтобы увидеть, был ли полученный код лучше в конце. Большинство правил разумны или это вопрос мнения о стандарте кодирования, но есть одно правило, которое меня озадачивает, потому что я не видел, чтобы кто-то еще рекомендовал его, и потому что я не вижу явной выгоды для него:

SA1101: вызов {имя метода или свойства} должен начинаться с ' this. префикс, указывающий, что элемент является членом класс.

с другой стороны, код явно более подробный, так что каковы преимущества следования этому правилу? Кто-нибудь здесь следует этому правилу?

9 61

9 ответов:

это может сделать код яснее с первого взгляда. Когда вы используете this, Это легче:

  • скажите статические и экземплярные члены друг от друга. (И отличать методы экземпляра от делегатов.)
  • отличать элементы экземпляра от локальных переменных и параметров (без использования соглашения об именовании).

Я действительно не следую этому руководству, если я не нахожусь в сценариях, которые вам нужны:

  • есть фактический неясность - главным образом это влияет либо на конструкторы (this.name = name;) или такие вещи, как Equals (return this.id == other.id;)
  • вы хотите передать ссылку на текущий экземпляр
  • вы хотите вызвать метод расширения на текущий экземпляр

кроме этого я считаю, что это беспорядок. Так что я поворачиваю правило выключено.

Я думаю, что эта статья объясняет немного

http://blogs.msdn.microsoft.com/sourceanalysis/archive/2008/05/25/a-difference-of-style.aspx

...блестящий молодой разработчик в Microsoft (хорошо, это был я) решил взять на себя задачу написать небольшой инструмент, который мог бы обнаружить отклонения от стиля C#, используемого в его команде. Родился StyleCop. В течение следующих нескольких лет мы собрали все рекомендации по стилю C#, которые мы могли найти различные команды в Microsoft, и выбрал все лучшие практики, которые были общими для этих стилей. Они сформировали первый набор правил StyleCop. Одним из самых ранних правил, которые вышли из этого усилия было использование этой префикс для вызова членов класса и удаления любых префиксов подчеркивания из имен полей. Стиль C# официально отделился от своего старого племени C++.

this.This 
this.Does 
this.Not 
this.Add 
this.Clarity 
this.Nor 
this.Does 
this.This 
this.Add 
this.Maintainability 
this.To 
this.Code

использование "этого."когда используется чрезмерно или принудительное требование стиля, это не что иное, как изобретение, используемое под видом того, что есть

Как только вы начнете печатать, Intellisence отобразит содержимое, доступное в области, где вы печатаете: "это."не надо выставлять класс члены, и если вы не полностью невежественны к тому, что вы кодируете для вас должны быть в состоянии легко найти элемент, который вам нужен.

даже если вы совершенно невежественны, использовать "это."намекнуть, что доступно, но не оставляйте его в код. Есть также множество дополнений, таких как Resharper, которые помогают внести ясность в область и более эффективно раскрывать содержимое объектов. Лучше научиться пользоваться предоставленными вам инструментами, чтобы потом развить вредную привычку, которую ненавидят большое количество ваших сотрудников.

любой разработчик, который по своей сути не понимает область статического, локального, классового или глобального контента, не должен полагаться на "подсказки" для указания области. "этот."хуже, чем венгерская нотация, поскольку, по крайней мере, венгерская нотация дает представление о типе, на который ссылается переменная, и служит некоторой пользе. Я бы предпочел увидеть " _ " или "m", используемые для обозначения членов поля класса, а затем увидеть " это." везде.

У меня никогда не было проблема, ни видел проблему с другим разработчиком, который неоднократно борется с областью действия кода или пишет код, который всегда глючит из-за не использования "это." явно. Это необоснованный страх, что " это."предотвращает будущие ошибки кода и часто является аргументом, используемым там, где ценится невежество.

кодеры растут с опытом, " это."это как просить кого-то поставить колесики на велосипеде, как взрослый, так это то, что они сначала должны были использовать, чтобы научиться ездить на велосипеде. И для взрослых может упасть с велосипеда 1 в 1000 раз они попадают на него, но это не причина, чтобы заставить их использовать тренировочные колеса.

"это."следует запретить определение языка для C#, к сожалению, есть только одна причина для его использования, и это должно решить неоднозначность, которая также может быть легко решена с помощью лучших методов кода.

обратите внимание, что компилятору все равно, префикс ли вы ссылки с this или нет (если нет столкновения имени с локальной переменной и полем или вы хотите вызвать метод расширения на текущем экземпляре.)

это зависит от вашего стиля. Лично я снимаю this. из кода, как я думаю, это уменьшает отношение сигнал / шум.

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

  • имена типов находятся в PascalCase
  • имена параметров находятся в camelCase
  • интерфейсы должны иметь префикс с буквой I
  • используйте особые имена для перечислений, за исключением тех случаев, когда они [флаги]

...но то, что происходит в частных владениях ваш код, разумеется. Делайте все, что ваша команда согласится.

последовательность тоже важна. Это уменьшает когнитивную нагрузку при чтении кода, особенно если стиль кода соответствует вашим ожиданиям. Но даже при работе с иностранным стилем кодирования, если он последователен, то это не займет много времени, чтобы привыкнуть к нему. Используйте такие инструменты, как ReSharper и StyleCop, чтобы обеспечить согласованность там, где вы считаете это важным.

использование .NET Reflector предполагает, что Microsoft не так уж хорошо придерживается стандартов кодирования StyleCop в BCL в любом случае.

несколько основных причин для использования this (и я по совпадению всегда префикс значения класса с именем класса, из которого они являются частью, а также - даже в самом классе).

1) ясность. Вы знаете прямо сейчас, какие переменные вы объявили в определении класса и которые вы объявили как локальные, параметры и еще много чего. Через два года вы этого не узнаете, и вы отправитесь в чудесное путешествие повторного открытия, которое абсолютно бессмысленно и не требуется, если вы в частности, укажите родителя спереди. Кто-то другой, работающий над вашим кодом, понятия не имеет с самого начала и, таким образом, мгновенно выигрывает.

2) Intellisense. Если вы наберете ' это."вы получаете все экземпляры конкретных членов и свойств в справке. Это делает поиск вещей намного проще, особенно если вы поддерживаете чей-то код или код, который вы не смотрели в течение нескольких лет. Это также поможет вам избежать ошибок, вызванных неправильными представлениями о том, какие переменные и методы объявлены где и как. Это может помочь вам обнаружить ошибки, которые в противном случае не появлялись бы до тех пор, пока компилятор не захлебнулся вашим кодом.

3) Конечно, вы можете достичь того же эффекта с помощью префиксов и других методов, но это вызывает вопрос о том, почему вы бы изобрели механизм для решения проблемы, когда есть механизм для этого встроенный в язык, который фактически поддерживается IDE? Если вы касаетесь типа, даже частично, это в конечном итоге уменьшит частоту ошибок, тоже не заставляя вы должны взять свои пальцы из домашней позиции, чтобы добраться до клавиши подчеркивания.

Я вижу много молодых программистов, которые делают большое дело, они будут экономить, не набрав символ или два. Большая часть вашего времени будет потрачена на отладку, а не на кодирование. Не беспокойтесь так много о вашей скорости набора текста. Беспокоиться больше о том, как быстро вы можете понять что происходит в коде. Если вы сэкономите в общей сложности пять минут кодирования и выиграете, потратив дополнительные десять минут отладки, вы замедлили себя, независимо от того, как быстро вы посмотреть как вы собираетесь.

Я следую за ним, потому что я думаю, что это действительно удобно, чтобы иметь возможность различать доступ к статическим и членам экземпляра на первый взгляд.

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

кроме того, можно дублировать имена переменных в функции, поэтому использование "this" может сделать его более ясным.

class foo {
  private string aString;

  public void SetString(string aString){
    //this.aString refers to the class field
    //aString refers to the method parameter        
    this.aString = aString; 
  }
}

Я следую за ним, в основном для intellisense причинам. Это так приятно печатать this. и получение списка consise свойств, методов и т. д.