C# - redundancja this. Dobre praktyki.

C# - redundancja this. Dobre praktyki.
DU
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:106
0

Czołem, przejdę od razu do sedna.

W trakcie mojej kariery poznałem wiele języków programowania. Najwięcej czasu spędziłem przy PHP i Javie.
PHP jako backend stron, Java do Androida i aplikacji desktopowych, w tym game developmentu.

Nie przeraża mnie nauka kolejnych technologii. Zainteresowałem się silnikiem Unity3D i koduję sobie w C#. Jako fan rozwiązań świetnego IDE firmy JetBrains, mam dostęp do jednego z produktów rodziny intelliJ IDEA - Rider.

I teraz najgłupsze pytanie, a może i jednak nie, cholera wie... ale nie zasnę dopóki nie poznam opinii fachowców.
IDE podpowiada mi, że korzystanie z wskazywania pochodzenia zmiennych do instancji, czyli forma this.zmienna jest redundantna i nie należy korzystać z tego zapisu. Dla programisty Javy i PHP to szok. Na videotutorialach również pomijane jest słowo this. Jak żyć?

edytowany 1x, ostatnio: dualjack
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 13 godzin
0

... Dla programisty Javy (...) to szok....

Nie rozumiem. Byłem programistą Javy przez wiele lat (w tym 2,5 roku komercyjnie) i mało kto wstawiał niepotrzebnie this'a. W PHP programowałem krótko i nieobiektowo, więc się o nim nie wypowiem. Natomiast taki np Python wymaga użycia słówka kluczowego self w kółko jeśli chce się programować obiektowo. Java tego nie wymaga i się tego nie robi.

W Javie, C# (ale też Scali, C++, itd) słówka this używa się po to, aby np przekazać go gdzieś dalej albo po to by dostać się do przesłoniętych zmiennych. Jeśli nie ma przesłaniania to nie ma potrzeby używania this do dobierania się do zmiennych.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
0
dualjack napisał(a):

nie zasnę

Wyluzuj :-)
Różne są zalecenia co do formatowania i pisania kodu, różne są też przyjęte konwencje w poszczególnych językach.
Nie ma o co kruszyć kopii.
Jak piszesz dla siebie to pisz jak chcesz (byle z sensem), jak w wieloosobowym projekcie to i tak trzeba się trzymać tego co obowiązuje w danym projekcie choćby się nam coś nie podobało.

Co do słowa this w C# to zwykle je pomijam, ale nie zawsze.

edytowany 2x, ostatnio: Azarien
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
1
dualjack napisał(a):

IDE podpowiada mi, że korzystanie z wskazywania pochodzenia zmiennych do instancji, czyli forma this.zmienna jest redundantna i nie należy korzystać z tego zapisu.

To jest wymysł JetBrains, prawdopodobnie skutek nadmiernego spożywania napojów rozgrzewających w Sankt Petersburgu. Niektórzy rosyjscy agenci w Polsce też się tego stylu trzymają, niemniej jednak Microsoft od "prawie zawsze" zalecał używanie this. zamiast podkreślenia: https://blogs.msdn.microsoft.com/sourceanalysis/2008/05/25/a-brief-history-of-c-style/ http://stylecop.soyuz5.com/SA1101.html

Zasadniczo pisz jak wolisz, ważne aby było spójnie w projekcie. Ja np. teraz pracuję ze starymi ludźmi, więc używamy podkreślników, ale w swoich własnych projektach zawsze miałem this, podobnie w chyba wszystkich projektach do tej pory.

Zobacz pozostałe 3 komentarze
Wibowit
Brzmi jak całkiem rozsądne podejście. Jakieś argumenty przeciwko?
somekind
Te same co zawsze, ja wolę mieć this, bo lepiej widzę dzięki temu czy to czego używam jest na poziomie klasy czy lokalne i czy jest statyczne czy nie.
MA
W Core Microsoft wrócił do _
Wibowit
A to IDE masz na tyle upośledzone że ci inaczej nie pokoloruje? Po co zaśmiecać kod, jak można uwidocznić to co się chce widzieć bez zaśmiecania kodu? Poza tym kolorowanie działa na każdym kodzie, nie tylko tym gdzie powstawiałeś nadmiarowe słówka this.
somekind
IDE pokoloruje, ale np. GitHub nie. Poza tym ja lepiej widzę słowa niż kolory. Używanie this nie jest nadmiarowe tylko precyzujące.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
2
somekind napisał(a):
dualjack napisał(a):

IDE podpowiada mi, że korzystanie z wskazywania pochodzenia zmiennych do instancji, czyli forma this.zmienna jest redundantna i nie należy korzystać z tego zapisu.

Microsoft od "prawie zawsze" zalecał używanie this. zamiast podkreślenia: https://blogs.msdn.microsoft.com/sourceanalysis/2008/05/25/a-brief-history-of-c-style/ http://stylecop.soyuz5.com/SA1101.html

To ciekawe, co mówisz w kontekście C#. Gdyby tak było, to nowsze środowiska (np. już VS 2015) nie podpowiadałyby, że to niepotrzebne. Poza tym podkreślenie? Nie jest zgodne z konwencją nazewnictwa w C#. This można używać zawsze i wszędzie, jednak zazwyczaj nie ma sensu i MOŻE zaciemniać kod. This powinno używać się w wymaganych przypadkach:

  • kiedy przekazujemy referencję do obiektu, np:
Kopiuj
obj.DoSomeStuff(this);
  • kiedy przypisujemy parametr metody (zazwyczaj konstruktora) do pola klasy o tej samej nazwie, np:
Kopiuj
class MyClass
{
    int myVar;

    public MyClass(int myVar)
    {
        this.myVar = myVar;
    }
}
  • z Twojego linku wynika jeszcze użycie pola z tej klasy, zamiast z klasy bazowej.

We wszystkich innych przypadkach (po prostu wołanie zwykłej metody, czy zwykłego pola) this nie ma sensu. W php jest wymagane:

Kopiuj
$this->doSomeStuff();

Natomiast w C# nie jest to wymagane (poza przypadkami, o których napisałem oczywiście :)).
W C# doradzam używanie this tylko w tych przypadkach, w których trzeba, żeby bez sensu nie zaciemniać sobie kodu i nie zastanawiać się "czy ten this ma tu swoją przyczynę".

JU
@Adam Boduch: błąd, w kodzie nie widać wcięć, pomimo że w poście są wpisane.
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Kiedyś strasznie upierałem się żeby wszędzie obowiązkowo używać this. Dzisiaj używam tylko wtedy kiedy wymaga tego sytuacja, tak jak to napisał @Juhas. Zauważyłem też, że duże nagromadzenie this'ów zaczyna zaciemniać mi czytelność kodu i jednak jest lepiej kiedy linijka magicznie zmniejsza się o jedną trzecią przez usunięcie this. Podkreślenia dla pól prywatnych także nie używam i w zasadzie zawsze potrafię odróżnić pole prywatne od zmiennej lokalnej. Nie mam z tym problemów.

Może kiedyś mi się pozmienia...
BTW: projekty u nas też robione są bez this'ów.

edytowany 4x, ostatnio: grzesiek51114
JU
No z tymi prywatnymi polami, muszę przyznać rację, że uważam tutaj konwencję za nieco zbyt rygorystyczną. Chociaż zazwyczaj też nie mam problemu z rozpoznaniem, czy to pole, czy zmienna lokalna, ale jednak jakiś prefiks faktycznie byłby mile widziany (chociażby małe "m" jak w C++). Ale staram się pisać zgodnie z konwencją.
0

Każde normalne IDE oznacza innym kolorem zmienne lokalne, globalne, zadeklarowane jako prywatne albo publiczne więc podkreślenia nie mają sensu. Visual Studio akurat jeszcze wtedy gdy go ostatnio używałem, nie robił tego o ile pamiętam (JetBrains/Android Studio to robi). Więc cóż, może i podkreślenia wtedy.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
0
Juhas napisał(a):

W C# doradzam używanie this tylko w tych przypadkach, w których trzeba, żeby bez sensu nie zaciemniać sobie kodu i nie zastanawiać się "czy ten this ma tu swoją przyczynę".

Dlatego lepiej dodawać wszędzie i się nie zastanawiać. A przyczyna jest jasna - odróżnienie użycia instancyjnego elementu klasy od elementu statycznego.

Krzywy Programista napisał(a):

Każde normalne IDE oznacza innym kolorem zmienne lokalne, globalne, zadeklarowane jako prywatne albo publiczne więc podkreślenia nie mają sensu. Visual Studio akurat jeszcze wtedy gdy go ostatnio używałem, nie robił tego o ile pamiętam (JetBrains/Android Studio to robi). Więc cóż, może i podkreślenia wtedy.

Po pierwsze, to kod nie zawsze czyta się w IDE.
Po drugie jak niby kolorki w IDE rozwiązują ten problem?

Kopiuj
public Class(string a)
{
    a = a;
}
0

@somekind twój zapis oznacza przypisanie zmiennej do samej siebie (tak przynajmniej jest w Javie), bo brana jest pod uwagę zmienna zadeklarowana najbliżej.

A co do kolorków, to w Android Studio (i InteliJ) tak to by wyglądało:

title

https://imgur.com/a/WJ8iF

Kolorki:

  • nieużywane zmienne/klasy - szary
  • zmienna globalna wyróżniona

..itd. Pamiętam, że swego czasu w VS mi tego brakowało, chociaż może Resharper albo jakaś inna wtyczka może to dodać (albo już nawet jest - nie wiem, nie jestem na czasie).

0

Bez this zmienna globalna też będzie wyróżniona, więc nie widzę sensu w stosowaniu this poza przypadkami takimi jak ten (niejednoznaczność).

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Wrocław
0
Krzywy Programista napisał(a):

@somekind twój zapis oznacza przypisanie zmiennej do samej siebie (tak przynajmniej jest w Javie), bo brana jest pod uwagę zmienna zadeklarowana najbliżej.

No więc to jest dowód, że this się jednak przydaje, bo taki zapis jest jasny:

Kopiuj
public Class(string a)
{
    this.a = a;
}

a jeśli ktoś nie chce używać this bo pochodzi z Węgier, to robi tak:

Kopiuj
public Class(string a)
{
    _a = a;
}

..itd. Pamiętam, że swego czasu w VS mi tego brakowało, chociaż może Resharper albo jakaś inna wtyczka może to dodać (albo już nawet jest - nie wiem, nie jestem na czasie).

ReSharper to robi na pewno, a i nowsze VisualStudio może też.

1

Nikt nie mówi, że this się nie przydaje. Przydaje się do tego, żeby rozwiązać niejednoznaczność, ale nie jestem za tym, żeby zawsze stawiać this przy odwołaniu do pola klasy.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
1
somekind napisał(a):

Po drugie jak niby kolorki w IDE rozwiązują ten problem?

Przecież @Juhas podał właśnie taki przykład jako uzasadnione użycie this.

somekind
A kolorki w IDE nadal nie rozwiązują problemów składniowych.
MA
  • Rejestracja:około 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Poznań
  • Postów:216
0

Ostatnio w najnowszych produktach Microsoft wraca to praktyki z podkreśleniem, wystarczy przejrzeć kod np. ASP.NET Core: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs

Mi osobiście _ się podoba, ale zwykle dostosowuje się do istniejących zasad w projekcie.

somekind
A na końcu też stawiasz _ jak w nicku? :P
MA
_ Oczywiście, jak wszędzie to wszędzie - przede wszystkim konsekwencja _ :P
0

W kod źródłowy od MS to nie masz co patrzeć. Wszelakie designery nieraz generują np kod z klamerkami w tej samej linii, pomimo tego MS zaleca w C# używanie klamerek w nowej linii bo to jest generalnie standard w .NET. To samo może być z podkreśleniami.

1
somekind napisał(a):

A kolorki w IDE nadal nie rozwiązują problemów składniowych.

W którym miejscu ktoś pisał, że kolorki w ide rozwiązują problemy składniowe? Kolorki w ide wystarczająco określają, czym jest zmienna i nie trzeba już w tym celu stosować this. Zaiste, this trzeba stosować w celu rozwiązania problemów składniowych, bo to po this wymyślono.

V-2
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:671
0

Ja myślę, że to tak samo jak z zaimkiem "ja". Oczywiście przydaje się wielce i trudno wyeliminować go z języka. Ja przypuszczam jednak, że używanie go z automatu wszędzie, gdzie tylko się da, byłoby ciut redundantne.


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
edytowany 1x, ostatnio: V-2
Wibowit
ja umieć C#. ja pisać this :P
JP
Zaimek ja jest bardzo lubiany przez policjantów. Mi Pani funkcjonariuszka wpisywała w moje zeznanie w prawie każde zdanie :)
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 13 godzin
1
somekind napisał(a):

No więc to jest dowód, że this się jednak przydaje, bo taki zapis jest jasny:

Kopiuj
public Class(string a)
{
    this.a = a;
}

I niby R# w takim przypadku proponuje zamianę thisa na coś innego? W IntelliJu mi się takie propozycje nie zdarzyły ani w Javie ani w Scali.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
grzesiek51114
grzesiek51114
Jemu lepiej nie wspominać o Javie, bo jak przesadzisz to będę musiał wieźć go później swoim starym Peżotem na OIOM. To auto jest w sumie super ale jak się popsuje to mogę nie dowieźć...
JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Postów:1065
0

Nie mam R# ale normalne VS nie proponuje nic w takim przypadku.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)