Czy piszecie słowo this w metodach?

Czy piszecie słowo this w metodach?
Nie używam wcale
52%
52% [25]
Używam tylko do pól
15%
15% [7]
Używam tylko do metod
0%
0% [0]
Używam do pól i metod
23%
23% [11]
Inaczej
10%
10% [5]
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
1

Powiedzmy, że mamy prostą klasę i mamy wybrać czy i kiedy używamy słowa kluczowego, które odnosi się do bieżącej instancji. Można w ogóle nie pisać:

Kopiuj
public class Person {
	private String name, surname;

	private void metoda() {}

	private void dupa() {
		metoda();
	}

	public String getName() {
		return name;
	}

	public void setName(String name_) {
		name = name_;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname_) {
		surname = surname_;
	}

}

Można też zapisać z użyciem this (albo self czy czegoś w tym stylu).

Kopiuj
public class Person {
	private String name, surname;

	private void metoda() {}

	private void dupa() {
		this.metoda();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

}

Czy może macie jeszcze inne rozwiązanie?


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 1x, ostatnio: PerlMonk
.andy
public void setSurname(String surname_) { surname = surname; } Masz błąd 😁
PerlMonk
👍
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

Tylko w konstruktorach ew. setterach jak już je pisze bo tak ktoś wybrał :/


Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

W C# używam nie powszechnej ale dosyć często spotykanej konwencji zaczynania nazw pól od podkreślnika (czy jak to się tam zwie). Do właściwości nie używam nic. A więc z this nie korzystam wcale.

Kopiuj
class SomeHandler
{
  private readonly IRepository _repository;

  public SomeHandler(IRepository repository)
  {
    _repository = repository;
  }
}

Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
WeiXiao
gdyby tylko vs by default generował private readonly z podkreślnikiem bez potrzeby konfigurowania tego, to pewnie byłoby to powszechniejsze, a dziwne że tak się nie dzieje, gdyż jest to oficjalna konwencja Use camel casing ("camelCasing") when naming private or internal fields, and prefix them with _.
Aventus
@WeiXiao: ciekawy zbieg okoliczności, bo rękę dałbym uciąć że VS domyślnie generował pola właśnie z podkreślnikiem, a dosłownie parę dni temu straciłem tę konwencję- chyba po aktualizacji. Musiałem dodać to manualnie do ustawień, czego wcześniej nie musiałem robić...
WeiXiao
@Aventus: dziwne, ja zawsze to dodawałem tak: https://i.imgur.com/LwFtHU2.png Może jakiś extension? resharper?
Aventus
No właśnie ja też to musiałem tak dodać ostatnio, mimo że wcześniej miałem to ustawione. Może faktycznie dodawałem to ręcznie, i nie pamiętam :D R# to na pewno nie to, bo prywatnie nie używam.
Sarrus
Resharper to robi domyślnie, ale VS nie.
SO
Można to skonfigurować VS by pola prywatne zaczynały się od _
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około godziny
  • Lokalizacja:Silesia/Marki
  • Postów:5505
6

Im mniej kodu i znaków tym lepiej (oczywiście w granicach rozsądku) dlatego nie pisze this


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
LU
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Gdańsk
9

Tylko gdy argument koliduje z polem


jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:34 minuty
  • Postów:3460
11

Używam bo w PHP muszę.

Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:2 minuty
  • Postów:1659
7

a ja staram sie pisać coby łatwiej potem odczytać kod


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
cerrato
Chociaż jedną pokrewna dusza. Albo tak samo niekompetentna - kwestia interpretacji ;)
cerrato
Ale zgadzam się w pełni - to, tak samo jak nadmiarowe nawiasy, nie przeszkadzają w niczym, to 5-6 dodatkowych znaków do napisania nie jest bardzo obciążające, kompilator tego nie odczuje, a osoba czytająca od razu jest pozbawiona cienia wątpliwości o co chodzi i co autor miał na myśli.
Miang
co do nawiosów to ja jako osoba pisząca wolę być pewna że nie namieszam z kolejnością, a co dopiero jak czytam czyjś kod
Silv
Twój komentarz, @Miang , brzmi dobrze. :)
Grzyboo
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:206
1

Tylko w konstruktorach.
W setterach nie piszę bo ich nie mam, ewentualnie jak już są to generuje je lombok.
W każdym innym miejscu nie używam. Od wskazywania, że czy użyta nazwa jest atrybutem obiektu czy lokalnie zadeklarowaną zmienną jest IDE.

edytowany 1x, ostatnio: Grzyboo
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:2 minuty
  • Postów:4886
7

Używam, self :-D


Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2
Miang napisał(a):

a ja staram sie pisać coby łatwiej potem odczytać kod

Chodzi Ci tylko o pola klas czy również metody? Jeśli również metody to w jaki sposób to ułatwia czytanie kodu Twoimi zdaniem?


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Miang
metody wtedy kiedy to może być mylące
Aventus
@Miang: ok ale nadal niewiele mi to mówi. Kiedy to może być mylące? Możesz podać przykład? Oraz o jakim języku mowa? Pytam z czystej ciekawości.
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:14 dni
5

W C++ this-> potrafi zmienić zachowanie kodu, przykładowo:

Kopiuj
template<typename T>
struct Base {
  int answer() { return 42; }
};

template<typename T>
struct Deriv : Base<T> {
  int run() { return answer(); }
};

To się nie skompiluje, za to to:

Kopiuj
template<typename T>
struct Base {
  int answer() { return 42; }
};

template<typename T>
struct Deriv : Base<T> {
  int run() { return this->answer(); }
};

Już jak najbardziej tak.


AL
od tego jest using Base<T>::answer; ;)
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:2 dni
  • Postów:1873
4

W js nie da się inaczej :)


”Engineering is easy. People are hard.” Bill Coughran
Zobacz pozostałe 3 komentarze
Charles_Ray
W TS tak samo, a to just cywilizowany język
Aventus
@Charles_Ray: no ale to chyba wynika z natury JS której TS nie jest w stanie ominąć. Jakoś trzeba wyłapać kontekst, i TS tutaj nic nie zmienia. Czy się mylę?
PerlMonk
W każdym razie w JS, PHP czy Pythonie sprawa ma się trochę inaczej. Nie ma tak prosto, że "this.zmienna to pole a zmienna" to też pole, jeśli istnieje.
Charles_Ray
@Aventus: zgadza się, natomiast nie nazwałbym TS językiem szatana :)
Aventus
@Charles_Ray: naturalnie, ten tytuł jest zarezerwowany tylko dla JS ;)
Ales
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:121
1

Używam w konstruktorze lub w metodach z klasy, z której dziedzicze. W ten sposób wiem skąd pochodzi dana metoda

katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
8

Jestem formalistą więc używałem i używam zawsze :-)
Nie lubię skrótów myślowych w kodzie źródłowym... Takie przyzwyczajenie a może "starcze" dziwactwo.
Uważam jednak, że to ułatwia czytanie kodu, szczególnie komuś kto czyta kod z języka, który nie jest jego "podstawowym".

Nawet w Delphi używałem w PHP muszę w JavaScript w starym zapisie chyba też było to konieczne a nawet self zrzutowane na var self = this;
W nowym ES6 nawet nie wiem czy jest wymagane ale też używam.


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
6

Tak, jak pisali powyżej chociażby @Miang czy @katakrowa - zawsze staram się to stosować, nawet jeśli nie jest to wymagane. Bo dodanie tych kilku liter nie jest czymś, co będzie realnie odczuwalnym utrudnieniem podczas pisania, w żaden sposób nie ma to wpływu na prędkość kompilacji czy później działania aplikacji, a o tych kilkuset dodatkowych znakach w kodzie w ogóle nie ma co pisać bo to totalny absurd.

Odpowiadając na pytanie @Aventus - czyli "w czym to pomaga":

  • jak masz clientHeight = screenHeight to co tak naprawdę wiesz? Po pierwsze - można podejrzewać, że clientHeight jest czymś należącym do klasy, ale może np. ktoś trzasnął jakąś zmienną globalną? :P
  • idąc dalej - ustalamy, że na pewno clientHeight należy do klasy (czyli dałoby się zapisać w postaci this.clientHeight). W takim razie wiemy, że do pola clientHeight podstawiamy screenHeight
  • ale ponownie - nie wiemy, czym to coś jest. Czy to jest funkcja, inna składowa naszej klasy, zmienną globalną albo czymś w jakiś inny sposób widocznym w naszym zakresie?
  • a zamieniając to na zapis this.clientHeight = this.screenHeight() od razu wiemy o co chodzi, na pierwszy rzut oka jest to czytelne. Do pola clientHeight należącego do klasy w której grzebiemy podstawiamy wartość zwróconą przez funkcję screenHeight, która także jest elementem tej samej klasy co clientHeight.

Poza tym - wprawdzie tego nie dotyczy wprost ten wątek, ale i tak dodam ;) :

  • nawet jeśli dany język tego nie wymaga, a funkcja nie ma żadnych argumentów/parametrów, to i tak daję pusty nawias przy wywołaniu funkcji. W ten sposób wiadomo, że do zmiennej podstawiamy wartość zwróconą przez funkcję, a nie inną zmienną
  • nawiasy w przypadku if i innych podobnych strukturach: można napisać if (a > b && jakisBool) (zapis przykładowy, może w rożnych językach jest inna kolejność, ale przyjmijmy że tutaj mamy ważniejsze porównanie, a potem dopiero iloczyn). To samo można napisać if ((a > b) && jakisBool) - przy założeniu podanym w nawiasie, efekt będzie dokładnie taki sam, ale dla mnie jest to czytelniejsze, nie ma nawet chwili zastanowienia się jak to się będzie ewaluować.

Oczywiście - bez tych "sztuczek" także da się zrozumieć co zostało napisane, ale czasem może być (przy bardziej złożonych konstrukcjach) potrzebna chwila na zastanowienie, a po drugie - czasem kod czyta ktoś mniej biegły, kto nie zna dobrze danej technologii itp. No i jeszcze jest taka sprawa, że mając te nawiasy, trudniej jest popełnić błąd, coś źle wstawić itp.

Trzeba pamiętać, że tak naprawdę kod się pisze dla innych ludzi a nie kompilatora. Jakby chodziło tylko o kompilator to byśmy nie tworzyli opisowych nazw zmiennych (bo a1, a2, b1, b2 itp. by działały dokładnie tak samo), nie stosowali wcięć, rozbijania na wiele plików (dawaj Pan całą apkę do main.c) i połowy z rzeczy, które są uważane za "dobre praktyki". Ale to robimy - po to, żeby inni programiści (albo my sami za parę miesięcy) mogli łatwo odczytać co autor miał na myśli. I to this, nawiasy itp. właśnie to ułatwiają.


edytowany 2x, ostatnio: cerrato
Miang
nazwy zmiennych a,b,c... próbowaliście kiedyś zrozumieć o co biega w tak skompilowanyc ;) js
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Wrocław
5

Prywatnie tak, zawodowo zależy od konwencji w projekcie.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1

Ja nie pisze niepotrzebnego kodu. this. w miejscu gdzie nie jest to konieczne to niepotrzebny kod - niepotrzebny, bo bez niego program działałby tak samo. Używam go tylko w dwóch przypadkach:

  • chcę gdzieś przekazać referencje do aktualnego obiektu, wtedy przekazuje this
  • pole i zmienną lokalna nazywają się tak samo, wtedy używam this, żeby je rozróżnić.

Ps: jeśli ktoś mi wyjedzie i powie "używanie pół bez this jest nieczytelne" mam odpowiedź - naucz się języka, bo takie gadanie wynika z nieznajomości języka programowania, albo ewentualnie z wielkich klas których się nie da zrozumieć. A do osób które powiedzą "u mnie w firmie mamy wielkie klasy których nie mogę zmienić" - wrong, możesz, tylko musisz dobrze znać język programowania i widzieć co robisz.

edytowany 1x, ostatnio: Riddle
KR
Z tą czytelnością się nie zgodzę. Explicit jest lepsze niż implicit. Pisanie this umożliwia np. natychmiastowe znalezienie wszystkich miejsc w kodzie, gdzie następuje dostęp do prywatnych pól obiektu (zwlaszcza że IDE potrafi podświetlić wybrany symbol we wszystkich miejscach - od razu widać). Jak nie piszesz this to możesz tylko dla każdego pola osobno znaleźć użycia.
Riddle
@Krolik: Nooo, z jednej strony zgadzam się że explicit lepsze niż implicit, ale z drugiej nie zgadzam się że ma to zastosowanie tutaj. Nie sądzę że jest to takie czarno-białe, bo jak użyjesz zasady "explicit > implicit" wszędzie, to Ci wyjdą takie argumenty jak to, że absolutne ścieżki zawsze są lepsze niż relatywne (bo przecież relatywne są implicit, względem cwd), a takie argumenty prowadzą do nikąd.
Riddle
@Krolik: Co do drugiej części Twojego komentarza, to tak: po pierwsze, po co chciałbyś znaleźć wszystkie odniesienia do pól prywatnych? W dobrze zaprojektowanych klasach powinno ich być max. 1-3, może 3-5 w jakichś ciężkich przypadkach, także nie jest to jakiś częsty case. A dodatkowo, nawet gdybyś chciał tak robić, to to nie jest rzetelne, dlatego że nie znajdziesz wszystkich odniesień do pól prywatnych, a tylko tych z zapisem z this. Gdybyś przypisał this do zmiennej lokalnej, albo np próbował odczytać pola innej instancji tej samej klasy (np w equals()). No to...
Riddle
...no to takich już nie znajdziesz, bo Twoja metoda wyszukania ich polega na "zapisie"/notacji , a nie na elementach języka programowania. Tutaj lepsze byłyby wyszukania z IDE. Dodatkowo, Twoja metoda wyszuka je również w stringach i komentarzach które mają w sobie "this". Także moim zdaniem, jako narzędzie do wyszukiwania, mokm zdaniem pomysł raczej słaby.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:2 dni
  • Postów:2964
4

W Javie w kodzie firmowym tylko jak jest konflikt ze zmienną lokalna bo taka jest konwencja w projektach. W Rust zawsze self bo trzeba i dzięki temu nie ma wątpliwości jak należy pisać i programiści nie tracą czasu na dyskusje o szczegółach stylistycznych.

edytowany 1x, ostatnio: Krolik
somekind
O, czyli ktoś pomyślał projektując język. Czyli jednak się da!
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
7

niepotrzebny, bo bez niego program działałby tak samo

Oczywiście - tak samo się skompiluje i później wykona.
Więc proponuję też rezygnację z wcięć, opisowych nazw zmiennych i funkcji (a, b, c, d a jak się skończą to wariacje w stylu aa1, aba, bac) i innych rzeczy zgodnych z tzw. "clean code" i dobrymi praktykami.

Przecież to nie chodzi o to, czy to this jest potrzebne ze względu na kompilator, ale mamy sobie tym życie ułatwiać.

używanie pół bez this jest nieczytelne" mam odpowiedź - nacz się języka, bo takie gadanie wynika z nieznajomości języka

Ok, Ty to wiesz, pewnie większość z osób tutaj piszących także sobie bez tego poradzi. Ale to nie znaczy, że z tym this nie jest to bardziej czytelne. Poza tym - możesz mieć w projekcie kogoś z mniejszym doświadczeniem, jakiegoś juniora itp. i tej osobie to może pomóc zrozumieć kod, a może i uniknąć błedu. Zresztą - w wielu branżach mamy określone procedury postępowania. Taki pilot samolotu mimo tego, że lata od 30 lat, i tak musi przejść całą ścieżkę przed startem (chociaż w dużej mierze jest to nadmiarowe). Tak samo maszynista - co chwilę musi wciskać przycisk potwierdzający, że nie zasnął. Takich procedur bezpieczeństwa w róznych sytuacjach jest pełno, a dla mnie dodanie this jest właśnie czymś takim - w niczym totalnie nie przeszkadza (bo wybacz, ale nie uważam tych kilku dodatkowych znaków do wpisania za jakiekolwiek utrudnienie), a może pomóc. Więc nic nie tracisz, a możesz mieć jakiś zysk - głupio nie skorzystać.


edytowany 1x, ostatnio: cerrato
Miang
rezygnacja z wcięć w yamlu prawem kodera
cerrato
@Miang: a czy w YAML stosujemy this? :P
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

Dałem okejkę dla posta @cerrato nie dla tego że się zgadzam ale za rzeczową odpowiedź. Tak naprawdę to podkreśliła ona że debata "this czy nie this" bez uwzględnienia jednego, konkretnego języka trochę nie ma sensu. Ja pisałem w kontekście C#, ale ewidentnie to naprawdę zależy od konkretnego języka (gdzie np. w takim JS bez this się nie obędzie co już zostało wspomniane wcześniej). Odnosząc się do postu cerrato aby podeprzeć moją tezę:

jak masz clientHeight = screenHeight to co tak naprawdę wiesz? Po pierwsze - można podejrzewać, że clientHeight jest czymś należącym do klasy, ale może np. ktoś trzasnął jakąś zmienną globalną?

W C# nie ma czego takiego jak zmienne globalne.

idąc dalej - ustalamy, że na pewno clientHeight należy do klasy (czyli dałoby się zapisać w postaci this.clientHeight). W takim razie wiemy, że do pola clientHeight podstawiamy screenHeight

Punkt wyżej.

ale ponownie - nie wiemy, czym to coś jest. Czy to jest funkcja, inna składowa naszej klasy, zmienną globalną albo czymś w jakiś inny sposób widocznym w naszym zakresie?

Punkt wyżej oraz dodatkowo to zależy od konwencji języka (Które oczywiście ktoś może łamać). W C# nazwy metod zgodnie z konwencją zaczynają się od dużych liter, zmiennych nie. Rozróżnienie jest więc łatwe Właściwości co prawda również zaczynają się od dużych liter, ale tutaj ułatwieniem jest forma nazewnictwa- właściwości w odróżnieniu od metod (znów- zgodnie z konwencją) nie mają wydźwięku nakazującego, np. Calculate..., Get..., Build... itp.

Nie piszę tego przeciwko używaniu this bo tak jak już wspomniałem- to całkowicie zależy od konkretnego języka.

Raz jeszcze w kontekście C# to naprawdę tylko kwestia preferencji. Moja preferencja jest taka że nie ma potrzeby z tego korzystać więc tego nie robię, inni (np. @somekind) uważają inaczej. I to w zasadzie tyle.

EDIT: Dodam jeszcze że raz pracowałem w projekcie gdzie dla pól ani nie używano this, ani nie używano podkreślnika. Z dwojga "złego" zdecydowanie już wolał bym używać this niż nie używać nic, bo wtedy kod jest zdecydowanie mniej czytelny:

Kopiuj
void DoSomething()
{
  // ...
  finalResult = currentResult + someValueToAdd; // Które z tych to pola, a które to zmienne lokalne?
}

Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
0

Tak, @Aventus słusznie zauważyłeś, że w różnych językach to różnie bywa. I z automatu bym olał te, w których jest to obowiązkowe, bo tam się po prostu daje i nie ma dyskusji.

W C# nazwy metod zgodnie z konwencją zaczynają się od dużych liter, zmiennych nie. Rozróżnienie jest więc łatwe

Konwencja to jest jedynie zbiór dobrych praktyk/zaleceń, więc może ktoś się pojawić, kto to zignoruje, się pomyli, albo nie będzie o tym wiedział. I teraz, paradoksalnie, bez tego this możesz przyjąć błędne założenie - bo zastosowany sposób nazywania elementów będzie sugerować jedną wersję, ale naprawdę będzie to coś innego (tylko nazwane niezgodnie z tą konwencją) :P


Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

@cerrato: to prawda, ale zakładam że odstępy od normy zostaną wyłapane na etapie code/peer review. Może w wyidealizowanym świecie żyje :P

Oraz taka ciekawostka dla niektórych- jeśli chodzi o konwencje typu nazewnictwo metod oraz właściwości to w przypadku C# jest to naprawdę raczej standard.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
cerrato
Biorąc pod uwagę co ludzie czasem wrzucają do WTF... nie byłym taki pewien :D
Aventus
Zobacz edit. Oczywiście wiem co masz na myśli, ale jeśli chodzi o zaczynanie metod jak i właściwości od dużych liter to jeszcze nigdy nie spotkałem się z tym żeby ktoś to zrobił inaczej. Oczywiście nie wątpię że kiedyś jakiś hindus wpadł na inny pomysł :D
cerrato
No ja c C# nie mam totalnie nic wspólnego, więc muszę wierzyć Ci na słowo ;)
Grzyboo
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:206
2

@Aventus:

Z dwojga "złego" zdecydowanie już wolał bym używać this niż nie używać nic, bo wtedy kod jest zdecydowanie mniej czytelny:

Kopiuj
void DoSomething()
{
  // ...
  finalResult = currentResult + someValueToAdd; // Które z tych to pola, a które to zmienne lokalne?
}

Nie macie kolorowania składni w VisualStudio czy w czym się tam aktualnie programuje C#? :P

screenshot-20211030223746.png

nalik
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 2 lata
  • Postów:1039
0

Prywatnie nie używam. Zawodowo, zależy od konwencji i pobliskiego kodu.

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

@Grzyboo: akurat kolorowanie składni to słaby argument bo to może się diametralnie różnić nie tylko między IDE ale również w zależności od motywu jaki programista używa w jednym IDE.

Paradoksalnie, choć zazwyczaj promuję różne nowości języka czy też framework'a, to nie lubię obecnego trendu nadmiernego kolorowania składni gdzie każdy typ/rodzaj kodu ma inny kolor itp. Jak dla mnie to wprowadza zbyt wiele zamieszania. No ale jak wcześniej wspomniałem, to kwestia osobistych preferencji :)


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 2x, ostatnio: Aventus
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
cerrato napisał(a):

Ok, Ty to wiesz, pewnie większość z osób tutaj piszących także sobie bez tego poradzi. Ale to nie znaczy, że z tym this nie jest to bardziej czytelne.

No niby tak, ale dla mnie to niepotrzebny kod. Z this. działa, bez niego też działa. Niepotrzeny kod. Tak samo widzę == True, int + 0, albo int * 1. Czy można je dodać, tak żeby program nadal dział? Tak. Czy jest to potrzebne? Nie.

Poza tym - możesz mieć w projekcie kogoś z mniejszym doświadczeniem, jakiegoś juniora itp. i tej osobie to może pomóc zrozumieć kod, a może i uniknąć błedu.

Na to mam inną odpowiedź. Lepiej podnosić skille juniorów do poziomu projektu, niż zaniżać poziom projektu do skilli juniorów.

Dla juniora kod if (user.active == true) jest czytelniejszy, spora część z resztą pisze taki. Ale czy to jest powód żeby używać tego w projekcie? Ja nigdy nie pozwoliłbym na == True w projekcie, jeśli powodem jest to że "dla juniora to jest czytelniejsze". Podobnie nie zezwoliłbym na this, jeśli powód jest ten sam. Oczywiście powody dla tych konstruktów mogą być inne - ja się staram tylko zilustrować ze argument "bo dla juniora może być cięższe" jest nieadekwatny.

Oczywiście, powinniśmy dbać o czytelność kodu i readibilty. Ale dodawanie redundatnych kawałków kodu jak this albo == True to nie jest droga do tego moim zdaniem.

edytowany 3x, ostatnio: Riddle
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
2

this. działa, bez niego też działa.

Tak samo jak wspomniane już wcześniej opisowe nazwy i wcięcia :P

int + 0, albo int * 1

OK, to jest bzdura... ale nigdy się z czymś takim nie spotkałem. Czy możesz przybliżyć okoliczności, w których ktoś mógłby chcieć z takich konstrukcji korzystać?

if (user.active == true)

Tutaj trochę się kłania kwestia nazw zmiennych. W tej postaci jest to OK, ale moim zdaniem to jest to błędnie nazwane. Ja bym dał if (user.isActive) i wtedy ten fragment z równa się oraz true byłby zbędny. Ale w podanym przez Ciebie przykładzie to go rozumiem i nie jest niczym rażącym.


edytowany 1x, ostatnio: cerrato
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
2

@cerrato zapominasz (a @hauleth zdaje się tego nie podkreślać) o konwencjach nazewniczych. U mnie w projektach z reguły zacznijOdMalej to metody, m_nazwa to pola, ZacznijOdDuzej to static methods a STALA to const/constexpr. I wtedy ten this jest faktycznie staje się hałasem. Co do == true tak samo się zgadzam z @hauleth
Tylko potem MISRA expert przyjdzie i powie, że safety, VW, BMW, Volvo i ogólnie weź to pisz bo explicit true i better explicit. Jest to podwójnie śmieszne kiedy zamiast static_cast<bool> ktoś wpisał w coding standard !!3, no ale co zrobisz jak nic nie zrobisz ;P

edytowany 1x, ostatnio: alagner
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
5

Do obroncow this: A dlaczego piszecie new Foo() zamiast new com.example.company.duper.super.library.Foo(). Przeciez nawet nie wiadomo skad ta klasa sie bierze?! XD


λλλ
Zobacz pozostałe 9 komentarzy
stivens
@cerrato: Java Javą. Czy chcialbys tak pisac w dowolnym jezyku? (Pominmy czy sie da czy nie)
cerrato
@stivens: oczywiście, że nie. ALE - po pierwsze, nie stawiaj znaku równości między tym całym ciągiem który podałeś a napisaniem 4 liter this. A po drugie - podtrzymuję, że dzięki this całość jest bardziej czytelna. Możesz uważać inaczej, nie zamierzam Cię na siłę przerabiać.
stivens
Dobrze, ja Ciebie tez nie bede przerabial
stivens
Ale jeszcze co do tego znaku rownosci... Tutaj nie ma znaku rownosci. Taki ciag niesie duzo wiecej informacji w sobie niz this. Np. com.google.guava.graph.Graph. Mimo to jest absolutnie bezuzyteczny i jedynie zaciemnia :)
somekind
A żonę przestałeś bić po tym jak rzuciłeś wódkę, czy wcześniej?
SA
  • Rejestracja:około 12 lat
  • Ostatnio:około 2 godziny
  • Postów:1431
1

Nie piszę this jeśli nie muszę, a muszę rzadko. Poza tym explicit nie zawsze jest lepsze niż implicit, jak się ludzie przyzwyczaja do pisania niepotrzebnego kodu to im się później wydaje że inaczej się nie da, nie będzie działać albo będzie działać inaczej - np. wywołanie bezparametrowego konstruktora klasy bazowej w C# może być implicit lub explicit, ale przyzwyczajenie się do pisania tego może budować mylne wrażenie, że bez tego base() konstruktor się nie wywoła. Podobny syf jak pisanie pustych konstruktorów, bo to też przecież jest explicit, zamiast polegania na konstruktorze domyślnym.

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)