Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przejrzystość kodu
Forum PHP.pl > Forum > PHP
caladan
Witam.
Często w kodach można się spotkać z zapisami zmiennych np. $sNazwa, $aNazwa, $_nazwa. Rozumiem że 's' ,'a' to określenie typów zmiennych. Po co się to stosuje i kiedy to jest przydatne i czy nejlepiej zawsze jest to stosować. Czy nie wystarczy w komentarzach klasy opisać typ zmiennej. No i jeszcze '_' - to kompletnie nie wiem co oznacza. Fajnie jakby ktoś rzucił linkiem żebym mógł poczytać, bo googlarkę nie wiem o co pytać.
LBO
To jest tzw notacja węgierska.
Vielta
Zależy od osoby. Jedni stosują, inni nie. Stosuje się to po to, żeby nie zastanawiać się/sprawdzać jaki typ ma dana zmienna. Przydatne jest w zasadzie zawsze. $_nazwa osobiście używam przy zmiennych statycznych, nie wiem czy ma to jakieś inne użycie.
LBO
Cytat(Vielta @ 26.06.2009, 16:44:43 ) *
Zależy od osoby. Jedni stosują, inni nie. Stosuje się to po to, żeby nie zastanawiać się/sprawdzać jaki typ ma dana zmienna. Przydatne jest w zasadzie zawsze.


Dlaczego przydatne zawsze? Osobiście nigdy nie potrzebowałem tego typu podpowiedzi - szczególnie w dobie zaawansowanych IDE, gdzie najeżdżam na atrybut/zmienną i wiem wszystko co potrzebuję.

Cytat(Vielta @ 26.06.2009, 16:44:43 ) *
$_nazwa osobiście używam przy zmiennych statycznych, nie wiem czy ma to jakieś inne użycie.


W standardzie kodowania ZF takim prefiksem oznacza się zmienne i funkcje prywatne/chronione.
Vielta
Dla mnie przydatne ze względu na programowanie na różnych komputerach, czasem w domu, czasem poza domem na laptopie, czasem dopisywanie czegoś w biegu na telefonie (bo coś "nagle, samo z siebie przestało działać" tongue.gif). Więc nie zawsze z dostępem do eclipse, z którego to korzystam.

Z ZF styczności zbytnio dużej nie mam, miałem chęci nauczenia się korzystania z tego tałatajstwa ale jakoś nie wiedziałem do końca z której strony się zabrać. Parafrazując stare przysłowie, co programista to obyczaj.


Zresztą, co ten temat robi w tym dziale?;o
erix
Cytat
Więc nie zawsze z dostępem do eclipse, z którego to korzystam.

Jeśli używasz phpDoc, to po co Ci dostęp do Eclipse? tongue.gif
dr_bonzo
Kiedys uzywalem tej "notacij wegierskiej" - niepotrzebna, a potem jak potrzebujesz wpisac zmienna wraz z uzyciem podpowiadania to.... musisz wiedziec jakiego jest typu, a skoro musisz wiedziec to po co ci go zapisywac.

$sNa<ctrl+spacja>

wiec jest to bez sensu.

Nazwy moich zmiennych jednoznacznie wskazuja na typ zmiennej:
$userName; // string
$postCount; // int
$post; // object
$posts; // array/collection of objects

tam gdzie sie tak nie da - to coz pozostaja komentarze.

Zmienne statyczne (rozumiem ze klasy) - po co jakos je wyrozniac skoro i tak sie do nich odwolujemy przez
self::$statyczna;
a deklarujemy uzywajac "static"
Vielta
Cytat(erix @ 26.06.2009, 17:17:03 ) *
Jeśli używasz phpDoc, to po co Ci dostęp do Eclipse? tongue.gif
A teraz mi pokaż gdzie napisałem o używaniu phpDoc.
osl
w zupełności zgadzam się z dr_bonzo. notacji węgierskiej używam tylko przy JS, a i tam można bez tego - kwestia przyzwyczajenia.
Poza tym, tak jak napisał przedmówca, dla mnie również najważniejsze jest to, żeby nazwa zmiennej jak najwięcej mówiła o sobie, ale bez zbędnych przyrostów.

A jak widze czasem zmienne typu $a,$b,$zmienna... to mnie krew zalewa winksmiley.jpg
batman
Notacji węgierskiej używałem z powodzeniem przez długi czas i bardzo dobrze mi służyła. Jednak w momencie, jak przesiadłem się na Eclipse, od razu z takiego zapisu zrezygnowałem. Obecnie stosuję taki zapis, jak przedstawił ~dr_bonzo.
Notacja węgierska dobrze się sprawdza w bazie danych. Przede wszystkim odpada problem słów kluczowych.
A znak podkreślenia ( _ ) nie został wymyślony przez ZF. Jest to powszechna praktyka stosowana do oznaczenia prywatnych i chronionych metod i właściwości.
erix
~Vielta - napisałeś o przenośności, ja odpowiedziałem. [;

Czytaj, co piszę.
dr_bonzo
Cytat
A znak podkreślenia ( _ ) nie został wymyślony przez ZF. Jest to powszechna praktyka stosowana do oznaczenia prywatnych i chronionych metod i właściwości.

...za czasow php 4 gdzie nie dalo sie okreslac poziomu widocznosci zmiennych - wszytkie byly publiczne.
A dobre IDE - podpowie ci nazwe zmiennej, a na liscie, obok zaznaczy poziom jej widocznosci. Wiec.... ja tej metody nie uzywam smile.gif
Vielta
@erix:
Mea culpa, późna godzina jest (tjaa). Notacja węgierska to w moim wypadku przyzwyczajenie po czasach gdy pisałem jeszcze korzystając z np. N++ czy innych programów, w których podpowiadanie składni, etc. nie jest takie dobre jak w Eclipse czy Netbeansie. W sumie czas zacząć używać phpdoc'a tongue.gif
starach
Używam NetBeans 6.5 i notacji węgierskiej. Dzięki niej łatwiej mi się segreguje zmienne w końcowej fazie przez co jeśli muszę coś zmienić jest to banalnie proste. Nie muszę używać żadnych skrótów czy klikać po menusach, żeby wiedzieć za co odpowiada jaka zmienna. Polecam stosowanie tej metody w PHP.
i = integer
s = string
c = char
m = mixed
b = boolean
a = array
r = resource
_ = private / protected ( przestałem stosować to w zmiennych kiedy przerzuciłem się na notacje węgierską. Teraz tego prefiksu używam tylko w nazwach metod )

Dzisiaj na przykład machnąłem sobie klasę która mi pobiera pliki z serwera FTP i je obrabia.
  1. <?php
  2. private $sFtpUser = '';
  3. private $sFtpPass = '';
  4. private $sFtpAddress = '';
  5. private $rFtpLink;
  6.  
  7. public function init(Context $c)
  8. {
  9.    // Connect to FTP server
  10.    $this->rFtpLink = ftp_connect($this->sFtpAddress);
  11.  
  12.    // check connection and login
  13.    if(!$this->rFtpLink || !ftp_login($this->rFtpLink, $this->sFtpUser, $this->sFtpPass))
  14.    {
  15.        throw new Error('app.ctrl.data.update.auth');
  16.    }
  17.  
  18.    //(...)
  19.  
  20.    // close the FTP stream
  21.    ftp_close($this->rFtpLink);
  22. }
  23. ?>
W sumie wydaje mi się że takie manipulacje na FTP powinny odbywać się w modelu, ale już nie chciało mi się bawić w te ceregiele zwłaszcza że model w moim FW jest kiepsko obsługiwany.
Crozin
@orglee: ftpUser, ftpPass, ftpAddress - już po tym widać co w tej zmiennej jest. rFtpLink zamień na ftpStream czy ftpHandle.
Ale w sumie... jak Ci pasuje to zostaw jak jest, trochę śmieszne jest bo rFtpLink czasami jest resourc'em, a czasami booleanem tak naprawdę, ale.. winksmiley.jpg
batman
Cytat(Crozin @ 27.06.2009, 08:27:18 ) *
...rFtpLink czasami jest resourc'em, a czasami booleanem tak naprawdę, ale.. winksmiley.jpg
I tutaj dochodzimy do największej wady PHP - brak ścisłej kontroli typów. Pół biedy, gdyby funkcje zwracały zawsze ten sam tym danych, a nie raz zasób, a raz bool.
bim2
Cytat(Crozin @ 27.06.2009, 06:27:18 ) *
rFtpLink czasami jest resourc'em, a czasami booleanem tak naprawdę, ale.. winksmiley.jpg

Dlatego należy traktować to jako "oczekujemy resource" smile.gif
Crozin
@batman: czy brak ścisłej kontroli typów to największa wada PHP? Nie powiedziałbym. Ale wsteczna kompatybilność powoduje że taka ftp_connect() zamiast rzucić wyjątkiem zwróci false.

@bim2: I jaki to ma wtedy sens skoro programista nadal musi dojść do tego jakim typem jest dana zmienna/pole? Bo na oznaczeniu w nazwie nie może do końca polegać, a kod staje się wtedy wręcz zdradziecki:
  1. <?php
  2.  
  3. $aMyArray = array(...);
  4. $aMyArray = doSth();
  5.  
  6. if($aMyArray === false){
  7.   //wtf?
  8. }
  9. ?>
LBO
Proszę, bez demonizowania winksmiley.jpg PHP nie jest ściśle typowany i nie będzie. Koniec i kropka.
Ma to swoje wady (trudniejszy debug) i zalety (niski próg wejścia)

Cytat
I jaki to ma wtedy sens skoro programista nadal musi dojść do tego jakim typem jest dana zmienna/pole? Bo na oznaczeniu w nazwie nie może do końca polegać, a kod staje się wtedy wręcz zdradziecki


  1. <?php
  2. /**
  3.  * @var array|bool
  4.  */
  5. $aMyArray;
  6.  
  7. // Da się? da.
  8. ?>


Mimo wszystko kod, który przedstawiłeś, jest po prostu złym kodem i nie świadczy u ułomności PHP, a raczej o kiepskich zdolnościach programisty.
batman
~LBO
Kod przedstawiony jest jak najbardziej na miejscu. Oto przykład:
  1. <?php
  2. // z jakiegos powodu w zmiennej jest false, a nie tablica
  3. $aMyArray = false;
  4. echo implode('.', $aMyArray);
  5. ?>

Powyższy kod spowoduje powstanie warninga:
Cytat
Warning: implode() [function.implode]: Invalid arguments passed in

Przy ścisłej kontroli typów nie byłoby to możliwe. A jeśli PHP byłoby napisane z sensem, to funkcja, która zwróciła false, rzuciłaby wyjątkiem lub zwróciła pustą tablicę (taki bezsens wydaje mi się bardziej możliwy, patrząc na obecne dokonania twórców PHP).
LBO
@batman, ja nie piszę, że się nie da. Ja piszę, że ten przykładowy kod jest gówniany i każdy programista, który żongluje tak typami (ponieważ się da, phi) byłby u mnie skreślony.

Podobnie jest na wyższym poziomie abstrakcji - dajmy na to OOP. Wiele rzeczy można tam zrobić, ale nie oznacza to, że się powinno. Jeden wzorzec pasuje do rozwiązania z dziedziny problemu.. inny nie.

Zdaje sobie sprawę, że ze ścisłym typowaniem PHP byłoby lepszym językiem, ale radzę sobie bez tego.
batman
Cytat(LBO @ 27.06.2009, 16:05:24 ) *
@batman, ja nie piszę, że się nie da. Ja piszę, że ten przykładowy kod jest gówniany i każdy programista, który żongluje tak typami (ponieważ się da, phi) byłby u mnie skreślony.
Daleko szukać: mysql_query - zwraca albo zasób albo false. Podobnych funkcji jest cała masa. Bez okrętek nie da się napisać dobrze kodu i nie zależy to od poziomu programisty, tylko od poziomu języka, z którego on korzysta.
LBO
To są naleciałości i tutaj, faktycznie stoi się na przegranej pozycji. Podobnie jest z niekonsekwentnym nazewnictwem w API.

Różnica w tym, że np ja projektując obiekty już tych błędów nie popełniam.
batman
Cytat(LBO @ 27.06.2009, 16:30:55 ) *
Różnica w tym, że np ja projektując obiekty już tych błędów nie popełniam.
Nie Ty jeden. I z tego właśnie względu powstały różne notacje, między innymi wspomniana notacja węgierska.
LBO
I wracamy do tego, że posiadając potężne IDE tej notacji używać nie muszę ( nie wspominając o meaningful names dla zmiennych).

Tylko proszę nie wspominać znów o kodowaniu na komórce, czy na 5 maszynach na raz. Programista narzędzia i zaplecze mieć musi, a nie w... notatniku.
dr_bonzo
Cytat(LBO @ 27.06.2009, 16:42:00 ) *
Tylko proszę nie wspominać znów o kodowaniu na komórce, czy na 5 maszynach na raz. Programista narzędzia i zaplecze mieć musi, a nie w... notatniku.


Tzn usprawniajmy sobie prace z narzedziem z ktorego korzystamy w 99% czasu a nie 1%.

Cytat(batman)
Daleko szukać: mysql_query - zwraca albo zasób albo false. Podobnych funkcji jest cała masa. Bez okrętek nie da się napisać dobrze kodu i nie zależy to od poziomu programisty, tylko od poziomu języka, z którego on korzysta.

A jak mysql_query() ma wskazac ze polaczenie sie nie udalo - i nie ma do dyspozycji wyjatkow. Takich funkcji jest multum. Pewnie ze lepiej kaby byly obiekowe + korzystaly z wyjatkow, ale tak nei jest.

Cytat
// z jakiegos powodu w zmiennej jest false, a nie tablica
$aMyArray = false;
echo implode('.', $aMyArray);


1. Funkcja ktora ustawila $aMyArray na false, nie mogla inaczej wskazac nieprawidlowego wykonania (nie korzysta przeciez z wyjatkow), zwracanie pustej tablicy moglo by byc niewskazane bo moglo by oznaczac np. plik jest pusty (dla file()) zamiast plik nie istnieje, itd.

2. Jesli funkcja moze ci zwrocic false, to Ty, powinienes sprawdzic czy pozniej ta wartosc moze isc do funkcji implode().

Cytat
Przy ścisłej kontroli typów nie byłoby to możliwe

Przy scislej kontroli typow mozesz dostac null'a - czyli jest to mozliwe, ale sie rzuca wyjatkiem.
batman
Cytat
Przy scislej kontroli typow mozesz dostac null'a - czyli jest to mozliwe, ale sie rzuca wyjatkiem.
Oczywiście przy założeniu, że jest to PHP. Jak na razie nie spotkałem się jeszcze z sytuacją, w której C# zwraca mi null, a nie rzuca wyjątkiem.

Cytat
2. Jesli funkcja moze ci zwrocic false, to Ty, powinienes sprawdzic czy pozniej ta wartosc moze isc do funkcji implode().
I tak też robię, jednak jest to klepanie dodatkowego kodu, który rak naprawdę nic nie wnosi do aplikacji.

Różne notacje powstały po to, by pomóc programistom w takich sytuacjach. Notacja węgierska najlepiej nadawała się do PHP, ponieważ jasno dawała do zrozumienia (przy poprawnie napisanym kodzie) co w zmiennej piszczy. Jednak z nadejściem epoki IDE podpowiadających składnię, zapis węgierski nie jest już potrzebny, ponieważ IDE pokaże co znajduje się w zmiennej.

Nie zmienia to jednak faktu, że PHP nie jest user frienly i to edytor musi korygować błędy języka.
erix
Cytat
Daleko szukać: mysql_query - zwraca albo zasób albo false.

A ktoś używa czystej implementacji tych funkcji...? Zawsze jest jakiś sterownik albo PDO. No czasem mysqli, ale cóż...
batman
Cytat(erix @ 27.06.2009, 20:27:46 ) *
A ktoś używa czystej implementacji tych funkcji...? Zawsze jest jakiś sterownik albo PDO. No czasem mysqli, ale cóż...
To był tylko przykład. Takich funkcji jest cała masa.
ndx
Cytat(batman @ 27.06.2009, 09:04:47 ) *
I tutaj dochodzimy do największej wady PHP - brak ścisłej kontroli typów. Pół biedy, gdyby funkcje zwracały zawsze ten sam tym danych, a nie raz zasób, a raz bool.

PHP jest językiem typowanym dynamicznie, więc to nie jest wada języka...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.