Używanie var/val vs podanie typu

0

Co sądzicie o var? Warto używać czy lepiej zawsze podać typ? W innych językach np. w Kotlinie zazwyczaj widziałem coś takiego: val x: int, czyli oprócz var/val był podany typ jeszcze, ale w Javie czy C# się tak nie da zrobić.

2

Da się. Można napisać po prostu int x = 5; ;-)

Jak typ masz znany/możliwy do obliczenia compile time to wystarczy val/var, zakładając że uzywa się nowoczesnego ide a nie notatnika.

3

Przeciez var w C# powstało po to, żeby nie podawać typu...

Używam namiętnie, w szczególności zamiast target-typed new, czyli zamiast A a = new() wolę var a = new A().

1

Ja ?

Sympatyzuję wyłącznie dla zmiennym mocno lokalnych, dla krótkich bloków.

I/lub nad mocno wstępnym / twórczym etapie, gdy sam nie wiem jak się kod ukształtuje, np co naprawdę będę wybierał wyrażeniami (funkcyjnymi acz nie tylko) z kolekcji itd...

W każdym innym przypadku generowane zmienne przez IDE.

0

Można używać varów, trzeba tylko potem wyskoczyć z okna z dziesiątego piętra.

Jeśli używasz valów to prawie zawsze oznacza to tyle, że źle zaprojektowałeś swój kod. U mnie vary występują tylko wtedy, gdy używam jakiegoś zewnętrznego kodu i mogę szybko pójść do przodu bez domyślania się co autor miał na myśli (jedyny case gdzie pamiętam, że varów używam w Scali, to chyba do pisania do Azure Tables, ale nie mam pewności).

Co do typów: dyskusyjne. Jeśli piszesz w miarę prosty kod to warto, ale jak już zaczynają się jakieś pojebane wielokrotne zagnieżdżenia to trzeba się zastanowić czy to ma sens. Ja piszę proste rzeczy to zawsze podaję, oszczędza mi to potem masę pracy przy zastanawianiu się dlaczego coś nie działa.

1

var/val czy bardziej wnioskowanie typów (czyli kompilator ma sam znaleźć typ) służy wiekszej elastyczności kodu, przy jednoczesnym zwiększeniu kontroli typów.
Zwiększeniu, bo jak programista nie musi pisać pół kilometra typów to jest większa szansa, że ich użyje.

Niestety var w javie to troche parodia (strzelam z kontekstu, że o to chodziło). Działa tylko wewnątrz metody więc za bardzo nie poszalejemy. Coś jak mieć automatyczną skrzynię biegów, która ma tylko 2 przełożenia.

0
jarekr000000 napisał(a):

Niestety var w javie to troche parodia (strzelam z kontekstu, że o to chodziło). Działa tylko wewnątrz metody więc za bardzo nie poszalejemy. Coś jak mieć automatyczną skrzynię biegów, która ma tylko 2 przełożenia.

Nie wyobrażam sobie, aby szersza idea (idea szerszego użycia) miała sens. Albo nie rozumiem co masz na myśli

1

Używać ale nie nadużywać.

Używać tam gdzie typ wynika z kontekstu np. var users = new List<User>() lub var msg = "foo"

Nie nadużywać jak w tym przykładzie, gdzie w sumie to nie wiadomo co jest jakim typem:

var doc = documentFactory().blankDocument();
doc.addPages(titlePage);
doc.close();
var bytes = doc.stream().bytes();
save(bytes)

Niby kod prosty i czytelny ale w sumie nie wiadomo co tam śmiga pod maskę i w IDE trzeba tracić czas aż wyświetlą się type hinty.

W Scali jest taka zasada:

  • Używaj var/val wszędzie gdzie się da.
  • Ale... twórz małe krótkie funkcje i metody który wykonują jedną zadaną czynność.
1
AnyKtokolwiek napisał(a):

Nie wyobrażam sobie, aby szersza idea (idea szerszego użycia) miała sens. Albo nie rozumiem co masz na myśli

Normalnie:

  • pola z wnioskowanym typem,
  • return type method wnioskowany
  • argumenty wnioskowane (choć to nie działa w kotlinie i scali też)

(zresztą zobacz, że w przypadku lambd masz w javie normalnie wnioskowanie argumentów in i out, tylko dla metod to nie działa)

1

var używam tylko do wyników wyrażeń linq, wszędzie gdzie znam typ zmiennej opisuje go tym typem.

1

Polecam stosowanie 'var' w C# z uwagi na krótki zapis. IDE podpowiada jaki typ się pod tym kryje.
Trochę definiowanie pełnych długich klas jest jak z komentarzami, można pisać, ale jak kod jest dobry to programista raczej się domyśli o co chodzi.

0

Ja zaproponuję odmienne podejście czyli: "Naucz się dobrze języka w którym piszesz". Jakie to ma znaczenie czy użyjesz var czy podasz typ, jak każde porządne IDE w pół sekundy umie zamienić jedno na drugie. W takim IntelliJ to jest Alt+Enter,Enter (otwarte przybornika, i akceptacja) żeby zmienić jedno w drugie. Jak się jest we flow to trwa to jakąś jedną dziesiątą sekundy.

Więc na pytanie: "var/val vs. typ", odpowiem: "a co za różnica"?

1

W C# var ma lokalny zasięg, więc jak ktoś nie pisze metod na 300 linii, to spokojnie var można używać, nawet w sytuacjach, gdy zwracany typ nie jest oczywisty. A jak się nazywa odpowiednio metody i zmienne to już w ogóle poezja, np var pageJson = document.GetPage(pageNumber).ToJsonString();
Poza tym kompilator podpowiada typ po najechaniu kursorem.

0
Nofenak napisał(a):

oprócz var/val był podany typ jeszcze, ale w Javie czy C# się tak nie da zrobić.

Jasne że się da, tylko po co pisać dwa słowa "var int" jak można samo "int" i z takiego samego założenia wyszli twórcy tych języków.
Stosuję wszędzie i nie widzę potrzeby pisania typu, jeśli chcemy się dowiedzieć co to za typ to wystarczy najechać myszką, natomiast w większości przypadków nie powinno nas to za bardzo interesować i powinno być jasne po nazwach metod / zmiennych i zwracanych typach (które w większości języków musimy jasno określić).

Gdy "var" wszedł do języka to używałem go ostrożnie tylko do długich typów i nie widziałem sensu pisać "var" zamiast np "int" jeśli to tyle samo znaków, ale czasy były inne, code review robiło się w jakichś przestarzałych narzędziach i ludzie się krzywili gdy widzieli za dużo varów. Aktualnie nie widzę sensu podawania typu jeśli da się to ominąć, a nie podawanie ma praktycznie same zalety - krótszy i bardziej przejrzysty kod bardziej otwarty na zmiany.
Na przykład gdy nagle okaże się że nie zmieścimy się w int i potrzeba longa lub że do ID użyjemy jednak GUIDa, lub że gdzieś przydałoby się zwrócić obiekt / tupla zawierającego kilka własności zamiast samego stringa to zmianę wystarczy często wprowadzić w zaledwie paru miejscach zamiast kilkunastu / kilkudziesięciu.

0

Oprócz czytania kodu z dwoma rękami i w IDE otwartym na bieżącym projekcie, są inne sytuacje.

  • Czytanie go w githubie / przez Notepad++ (bo grepuję archiwa różnych projektów, bo "coś podobnego kiedyś robiłem", nowoczesne IDE pękają funkcjonalnie (nie są zdolne ad hoc skompilować i zrozumieć typy) a o szybkości to nawet nie wspominam. Większość IDE rozumiejąca typy znacznie wymięka poza aktywnym projektem

  • Przy IDE, ale w lewej ręce mam kanapkę, i trzy palce prawej w majonezie. (wiem, niezdrowe zwyczaje)

2
AnyKtokolwiek napisał(a):

Oprócz czytania kodu z dwoma rękami i w IDE otwartym na bieżącym projekcie, są inne sytuacje.

No i co z tymi sytuacjami? Nazwa zmiennej powinna mówić jasno co zawiera i po niej da się zazwyczaj domyślić co to za typ, a jeśli to jakiś złożony typ to do niczego mi jego konkretna nazwa nie jest potrzebna plus w wielu przypadkach nawet nie dostajemy konkretnego typu tylko nazwę interfejsu i jeśli faktycznie chcemy dojść do implementacji to w takich przypadkach musimy pogrzebać głębiej.

Typ mi jest potrzebny podczas pisania kodu żeby wiedzieć jakie mam dostępne metody i własności i żeby kompilator mi wykrył błędy niezgodności typów; podczas czytania kodu który wiem że się kompiluje mogę z całą pewnością uznać że typy parametrów i argumentów są zgodne i wszystkie użyte metody i własności istnieją a jak się nazywa typ który je dostarcza? Zazwyczaj jest to nieistotne

4
AnyKtokolwiek napisał(a):
  • Przy IDE, ale w lewej ręce mam kanapkę, i trzy palce prawej w majonezie. (wiem, niezdrowe zwyczaje)

Dobry patent z tą kanapką.
Wyobraź sobie: odpalasz kompilację, mieli się, mieli się, mieli i wreszcie pokazuje build successful, a wtedy do pokoju wchodzi żona i widzi te trzy palce w majonezie. Tego się nie da wytłumaczyć.

0

Piszę aktualnie w dart/flutter i znacznie częściej używam final bez typu niż var (w Javie chyba tak się nie da):

https://dart.dev/tools/linter-rules/prefer_final_fields

Mam za to trochę inny dylemat, tzn pomiędzy late final czy nullable. Z jednej strony nulle komplikują kod, z drugiej late jest podatne na bo trzeba mieć pewność że to zostanie zainicjowane potem.

0
Nofenak napisał(a):

Co sądzicie o var? Warto używać czy lepiej zawsze podać typ?

Warto, inferencja nie jest za darmo, kosztuje cykle procesora i pamięci, jeśli więc cenisz szybkie iteracje to zawsze podawaj typ bo zaoszczędzisz czas na kompilacji.

4
  1. Jeśli ktoś potrzebuje wiedzieć jaki typ ma dana zmienna, to znaczy, że jest kompilatorem, więc pisząc tutaj łamie regulamin 4p, bo to forum jest przeznaczone dla osób, nie programów.
  2. Jeśli ktoś nie wie, co i po co znajduje się pod danym identyfikatorem, to informacja o typie mu w tym nie pomoże, niech lepiej popracuje nad nazewnictwem identyfikatorów.
0
somekind napisał(a):

niech lepiej popracuje nad nazewnictwem identyfikatorów.

Czyli notacja węgierska wraca? Będzie wiadomo bez typu jaki to typ

1

Przecież nie o to chodzi...
Z nazwy masz wiedzieć co biznesowo przetrzymujesz a nie w czym.

Nie potrzebujesz określać typu w nazwie, bo zazwyczaj nie jest do niczego potrzebne czytając kod.

1

Owszem, ale to nie znaczy że nigdy nie potrzebujesz jawnie określić jaki to typ. Nie wiem jak w C#, ale jak w Dart np zrobię tak:

var list = []

To kompilator nie wie jakiego typu to lista. A potem może to rodzić problemy, bo jak np jakaś metoda przyjmuje List<string> to próba podania tam List<dynamic> spowoduje błąd kompilacji.

No ale faktycznie, jak nie będzie pusta, np tak:

var tab = ['dupa'];

To już wiadomo że to tablica stringów. No ostatecznie jak bym się upierał na var to można tak:

var tab = []<string>

Ale tak czy inaczej podaję typ więc nie wiem co tu var wnosi

1

No ale to jest jasne że typ musi zaistnieć po prawej stronie jeżeli go nie ma po lewej. (Sprawdzić czy nie JS)

4

Tak, to przecież całkiem sensowne nazwać zmienną zawierającą listę list, czemu nie.
Można jeszcze dodać gdzieś tam obok komentarz w stylu: // deklaracja listy o nazwie list, wtedy będzie perfekcyjnie.

2

@somekind: to czy nazwa list jest sensowna czy nie to IMHO zależy od kontekstu.

0
somekind napisał(a):
  1. Jeśli ktoś potrzebuje wiedzieć jaki typ ma dana zmienna, to znaczy, że jest kompilatorem, więc pisząc tutaj łamie regulamin 4p, bo to forum jest przeznaczone dla osób, nie programów.

Czyli wrzucanie konspektów na forum łamie regulamin 4p?

1
hauleth napisał(a):

@somekind: to czy nazwa list jest sensowna czy nie to IMHO zależy od kontekstu.

Tak, gdy piszesz kod po polsku, i przygotowujesz e-maila do wysyłki.
Poza tym ma tyle sensu co int number albo string chars.

1
somekind napisał(a):
hauleth napisał(a):

@somekind: to czy nazwa list jest sensowna czy nie to IMHO zależy od kontekstu.

Tak, gdy piszesz kod po polsku, i przygotowujesz e-maila do wysyłki.
Poza tym ma tyle sensu co int number albo string chars.

Czasem można spotkać returnList

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.