Dlaczego StyleCop zaleca prefiksowanie wywołań metody lub właściwości Z "this"?

Starałem się postępować zgodnie z wytycznymi Stylecopa dotyczącymi projektu, aby sprawdzić, czy wynikowy kod był lepszy w końcu. Większość zasad jest rozsądna lub kwestia opinii na temat standardu kodowania, ale jest jedna zasada, która mnie zastanawia, ponieważ nie widziałem, aby ktoś inny ją polecał i ponieważ nie widzę wyraźnych korzyści z tego: {]}

SA1101: wywołanie {nazwa metody lub właściwości} musi zaczynać się od 'this."prefiks oznaczający, że element jest członkiem klasy.

Na minusie, kod jest wyraźnie bardziej gadatliwy w ten sposób, więc jakie są korzyści z przestrzegania tej zasady? Czy ktoś przestrzega tej zasady?

Author: Drew Noakes, 2009-10-13

9 answers

Może sprawić, że kod będzie jaśniejszy na pierwszy rzut oka. Kiedy używasz this, łatwiej jest:

  • odróżnij statyczne i instancyjne elementy od siebie. (I odróżnić metody instancji od delegatów.)
  • odróżnia instancje od lokalnych zmiennych i parametrów (bez użycia konwencji nazewnictwa).
 64
Author: Jeff Sternal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 13:08:29

Tak naprawdę nie stosuję się do tych wskazówek, chyba że jestem w scenariuszach, których potrzebujesz:

  • Istnieje rzeczywista niejednoznaczność - głównie dotyczy to konstruktorów (this.name = name;) lub rzeczy takich jak Equals (return this.id == other.id;)
  • chcesz przekazać odwołanie do bieżącej instancji
  • chcesz wywołać metodę rozszerzenia na bieżącej instancji
Poza tym uważam ten bałagan. Więc wyłączam zasadę.
 76
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-13 19:56:32

Myślę, że ten artykuł trochę to wyjaśnia

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

...genialny młody programista w Microsofcie (ok, to ja) postanowił wziąć na siebie napisanie małego narzędzia, które wykrywałoby różnice w stylu C# używanym w jego zespole. Urodził się StyleCop. W ciągu następnych kilku lat zebraliśmy wszystkie wytyczne dotyczące stylu C#, które mogliśmy znaleźć w różnych zespołach w Microsoft i wybrał wszystkie najlepsze praktyki, które były wspólne dla tych stylów. Tworzyły one pierwszy zestaw reguł StyleCop. Jedną z najwcześniejszych zasad, które powstały w wyniku tego wysiłku, było użycie prefiksu this do wywoływania członków klasy oraz usunięcie wszelkich prefiksów podkreślenia z nazw pól. Styl C# oficjalnie rozwinął się poza swoim starym plemieniem C++.

 35
Author: JeremyWeir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 09:09:03
this.This 
this.Does 
this.Not 
this.Add 
this.Clarity 
this.Nor 
this.Does 
this.This 
this.Add 
this.Maintainability 
this.To 
this.Code

Użycie "to.", gdy jest używany nadmiernie lub wymuszony wymóg stylu, jest niczym więcej niż wymyśleniem używanym pod pozorem, że istnieje

Jak tylko zaczniesz pisać, Intellisence wyświetli zawartość dostępną w zakresie miejsca, w którym piszesz, " to."nie jest konieczne ujawnianie członków klasy, i chyba że jesteś całkowicie nieświadomy tego, co kodujesz, powinieneś być w stanie łatwo znaleźć przedmiot, którego potrzebujesz.

Nawet jeśli jesteś całkowicie bez pojęcia, użyj "to."podpowiedź, co jest dostępne, ale nie zostawiaj tego w kodzie. Istnieje również mnóstwo dodatków, takich jak Resharper, które pomagają zwiększyć jasność zakresu i efektywniej eksponować zawartość obiektów. Lepiej nauczyć się korzystać z dostarczonych narzędzi, a następnie rozwinąć zły nawyk, który jest znienawidzony przez dużą liczbę Twoich współpracowników.

Każdy programista, który z natury nie rozumie zakresu statycznej, lokalnej, klasowej lub globalnej zawartości, nie powinien polegać na" podpowiedziach", aby wskazać zakres. "to."jest gorsza niż węgierska notacja, ponieważ przynajmniej węgierska notacja dostarczyła wyobrażenia o typie, do którego odnosi się zmienna i służy pewnym korzyściom. Wolałbym zobaczyć " _ " lub " m "używane do oznaczania członków pola klasy, a następnie zobaczyć" to."wszędzie.

Nigdy nie miałem problemu, ani nie widziałem problemu z innym programistą, który wielokrotnie walczy z zakresem kodu lub pisze kod, który jest zawsze błędny, ponieważ nie używa "tego"."wprost. Jest to nieuzasadniony strach, że " to."zapobiega przyszłym błędom kodu i jest często argumentem używanym tam, gdzie ignorancja jest ceniona.

Programiści rosną z doświadczeniem, " to."to jak proszenie kogoś, aby założył koła treningowe na rowerze jako dorosły, ponieważ to jest to, czego najpierw musieli użyć, aby nauczyć się jeździć na rowerze. A dorosły może spaść z roweru 1 na 1000 razy, ale to nie jest powód, aby zmuszać ich do korzystania z kół treningowych.

" to."powinno być zakazane z definicji języka dla C#, niestety jest tylko jeden powód, aby go używać, a to jest rozwiązanie dwuznaczności, które można również łatwo rozwiązać poprzez lepsze praktyki kodowe.

 12
Author: ChrisCW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 16:05:19

Zauważ, że kompilator nie dba o to, czy prefiks referencji zawiera this, czy nie (chyba że nazwa kolizji ze zmienną lokalną i polem lub chcesz wywołać metodę rozszerzenia na bieżącej instancji.)

To zależy od Twojego stylu. Osobiście usuwam this. z kodu, ponieważ uważam, że zmniejsza to stosunek sygnału do szumu. To, że Microsoft używa tego stylu wewnętrznie, nie oznacza, że musisz. StyleCop wydaje się być narzędziem MS-internal upublicznionym. I ' m all za przestrzeganie Konwencji Microsoftu dotyczących rzeczy publicznych, takich jak:
  • nazwy typów są w PascalCase
  • nazwy parametrów są w camelCase
  • interfejsy powinny być poprzedzone literą I
  • używaj nazw pojedynczych dla enum, z wyjątkiem gdy są [flagi]

...ale to, co dzieje się w prywatnych domenach Twojego kodu, jest prywatne. Rób, na co twój zespół się zgodzi.

Spójność jest również ważna. Zmniejsza obciążenie poznawcze, gdy czytanie kodu, zwłaszcza jeśli styl kodu jest taki, jakiego się spodziewasz. Ale nawet jeśli mamy do czynienia z obcym stylem kodowania, jeśli jest on spójny, nie zajmie dużo czasu, aby przyzwyczaić się do niego. Użyj narzędzi takich jak ReSharper i StyleCop, aby zapewnić spójność tam, gdzie uważasz, że jest to ważne.

Używanie. NET Reflector sugeruje, że Microsoft nie jest tak dobry w przestrzeganiu standardów kodowania StyleCop w BCL i tak.

 9
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-13 20:06:25

Kilka podstawowych powodów używania this (i przypadkowo zawsze prefiks wartości klasy z nazwą klasy, której są częścią, jak również - nawet w samej klasie).

1) jasność. W tej chwili dobrze wiesz, które zmienne zadeklarowałeś w definicji klasy, A które zadeklarowałeś jako lokalne, parametry i takie tam. Za dwa lata nie będziesz tego wiedział i wyruszysz w cudowną podróż ponownego odkrycia, która jest absolutnie bezcelowa i nie jest wymagana, jeśli konkretnie podać rodzica z góry. Ktoś inny pracujący nad Twoim kodem nie ma pojęcia od samego początku, a tym samym od razu odnosi korzyści.

2) Intellisense. Jeśli to napiszesz.'w pomocy otrzymasz wszystkie elementy i właściwości specyficzne dla instancji. Sprawia, że znajdowanie rzeczy jest o wiele łatwiejsze, zwłaszcza jeśli utrzymujesz czyjś kod lub kod, na który nie patrzyłeś od kilku lat. Pomaga również uniknąć błędów spowodowanych błędnym zrozumieniem, jakie zmienne i metody są deklarowane, gdzie i jak. Może pomóc ci odkryć błędy, które w przeciwnym razie nie pojawiłyby się, dopóki kompilator nie zadławił się Twoim kodem.

3) wprawdzie możesz osiągnąć ten sam efekt używając prefiksów i innych technik, ale nasuwa się pytanie, dlaczego wymyśliłeś mechanizm do obsługi problemu, skoro istnieje mechanizm do tego wbudowany w język, który jest faktycznie obsługiwany przez IDE? Jeśli dotkniesz-type, nawet w części, to ostatecznie zmniejszy swój poziom błędu, zbyt, nie zmuszając cię do podjęcia twoje palce z pozycji głównej, aby dostać się do klawisza podkreślenia.

Widzę wielu młodych programistów, którzy robią wielką sprawę z czasu, który zaoszczędzą, nie wpisując znaku lub dwóch. Większość czasu poświęcisz na debugowanie, a nie kodowanie. Nie martw się tak bardzo o szybkość pisania. Martw się bardziej o to, jak szybko możesz zrozumieć co dzieje się w kodzie. Jeśli zaoszczędzisz łącznie pięć minut kodowania i zyskasz dodatkowe dziesięć minut debugowania, zwolnisz siebie w dół, bez względu na to, jak szybko będziesz wyglądać, jakbyś jechał.

 7
Author: YrthWyndandFyre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-29 22:24:38

Podążam za nim, ponieważ myślę, że jest to naprawdę wygodne, aby móc odróżnić dostęp do statycznych i instancji członków na pierwszy rzut oka.

I oczywiście muszę go używać w moich konstruktorach, ponieważ normalnie nadaję parametrom konstruktora te same nazwy, do których pola przypisywane są ich wartości. Więc potrzebuję "tego", aby uzyskać dostęp do pól.

 4
Author: Maximilian Mayerl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-19 15:55:40

Ponadto możliwe jest powielanie nazw zmiennych w funkcji, więc użycie 'this' może uczynić to jaśniejszym.

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; 
  }
}
 3
Author: Michael Gattuso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-14 18:17:04

Podążam za nim głównie dla intellisense Powodów. Jest to tak miłe wpisanie this. i uzyskanie Konsylium właściwości, metod itp.

 1
Author: James Lawruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 01:40:14