Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy znacie te uczucie gdy...
Forum PHP.pl > Inne > Hydepark
daniofantasy
...gdy 00:00 juz dawno temu minelo, mysli zamiast prowadzic do klarownych rozwiazan slimacza sie we wszystkich kierunkach lepiac sie do siebie nawzajem i nawet budowanie foreacha wymaga zebrania sie w sobie i skupienia uwagi?

... termin oddania projektu za kilka godzin - w poniedzialek rano wink.gif - szczesliwie calosc na finishu, ostatnie kody w phpie, potem jeszcze animowany slider z karuzelka w jquery i calosc bedzie smigac jak ta lala biggrin.gif - tylko czemu koncowki projektow z krotkimi terminami sa zawsze takie ciezkie?
Calibri
Bo ja wiem. Pamiętam, jak ja miałem oddać pracę z przedmiotu Inżynieria Oprogramowania. Wyobraź sobie że wtedy dwa razy nie spałem pod rząd. Jak zacząłem pisać końcówkę programu o 22:00 w środę tak o 7 w czwartek skończyłem (zero snu). Potem to na autobus i na studia. Brak snu doprowadziło mnie do picia kawy (choć nie lubię).

Coś w tym jest. biggrin.gif
phpion
A wystarczy umiejętnie rozplanować sobie zadania, a nie robić wszystko na ostatnią chwilę. Nie wiem czy macie się czym chwalić...
starach
Bo ci się nie chce. smile.gif Tak jak napisał ~phpion jeśli sobie roboty nie rozplanujesz tylko dłubiesz na bieżąco to z każdym skończonym etapikiem masz dosyć i myślisz że zrobiłeś TYYYYYLE że czas na przerwę. Dokładne rozplanowanie rozwiązuje całą sprawę. UML FTW!
erix
Scrum, scrum, scrum... snitch.gif
thek
A czy Ty znasz to uczucie, gdy siadasz do kodu, który sam pisałeś kilkanaście tygodni temu i gdyby nie komentarze oraz przebłyski jak to miało mniej więcej działać za żadne skarby bez analizy kodu byś nie załapał po jaką cholerę zrobiłeś tak a nie inaczej? tongue.gif
  1. $random_existance = array( 'count' => mt_rand( 0, 2 ), 'place' => array() );
  2. if( $random_existance['count'] > 0 ) {
  3. $random_text = array(
  4. '<p>Random text 1.</p>',
  5. '<p>Random text 2.</p>',
  6. '<p>Random text 3.</p>',
  7. '<p>Random text 4.</p>'
  8. );
  9. $loops = min( $random_existance['count'], count($random_text) );
  10. $place = array_rand( array_flip( range( 1, 5 ) ), $loops );
  11. foreach( (array)$place AS $miejsce ) {
  12. shuffle( $random_text );
  13. $random_existance['place'][ $miejsce ] = array_pop( $random_text );
  14. }
  15. }
Ja dziś wziąłem do ręki ten kod (dla utrudnienia usunąłem komentarze), a i tak patrzyłem na swoje niektóre konstrukcje i zastanawiałem się "Ki czort?". Tak niewiele linijek, ale trochę czasu mi zajęło zanim zakminiłem czemu obliczanie $place wygląda tak, a nie inaczej i dlaczego w foreachu mam dodatkowo rzutowanie na tablicę wink.gif To właśnie tam bowiem tkwi cały sekret dlaczego później mam możliwość prostego użycia gdzieś w czeluściach kodu prostego sprawdzenia "jest-nie ma".
mike
Ja stosuję zasadę, że jeśli kod wymaga komentarzy to jest to najzwyklej w świecie kod źle napisany.
Należy go wtedy przepisać tak by był czytelny bez komentarzy.

Zasada ta należy do manifestu uchu Agile Software Craftsmanship
kicaj
Cytat(thek @ 12.10.2011, 15:58:09 ) *
A czy Ty znasz to uczucie, gdy siadasz do kodu, który sam pisałeś kilkanaście tygodni temu i gdyby nie komentarze oraz przebłyski jak to miało mniej więcej działać za żadne skarby bez analizy kodu byś nie załapał po jaką cholerę zrobiłeś tak a nie inaczej? tongue.gif


Znam doskonale to uczcie, teraz komentuje staram sie komentowac wszystko, dowolnie ale komentowac...
mike
Cytat(kicaj @ 12.10.2011, 18:51:25 ) *
Znam doskonale to uczcie, teraz komentuje staram sie komentowac wszystko,

Tracisz energię i czas na niepotrzebną czynność. Jeśli kod jest tak nieczytelny, że jego zrozumienie wymaga dodatkowych komentarzy to jest do przepisania. Kod sam w sobie powinien się łatwo czytać i być zrozumiały. Jeśli jest niezrozumiały jest kiepskiej jakości i nie poprawisz jego jakości dodając komentarze.
Kod podlega przenosinom, refactoringowi i wielu innym modyfikacjom. Rzadko za tym idzie modyfikacja komentarzy. A nawet jeśli to dokładasz sobie dwa razy więcej pracy bo utrzymujesz kod i komentarze.
Najczęściej jest tak, że są one nieaktualne, niekompletne i mylące.

Tym bardziej, że robisz to na odwal aby było:
Cytat(kicaj @ 12.10.2011, 18:51:25 ) *
dowolnie ale komentowac...
thek
@Mike: Potrzebowałem losowych X liczb z zakresu 1 do X. Używałbym rand lub mt_rand, gdyby nie fakt, że nie mogą się powtarzać. Zobacz więc co robię z place i powiedz czy da się prościej. Biorę tworzę tablicę jako zakres liczb od 1 do X. Teraz losuję bez powtórzeń (range) i muszę wybrać X losowych spośród nich, więc rusza array_rand. Ale on zwraca klucz lub klucze. Na dodatek jeśli to jeden klucz to zwraca go jako typ jakiego jest ów element, więc wymusza na mnie w foreach rzutowanie na array. A skoro losuje klucze to muszę wartości zamienić z kluczami i stąd array_flip. Tylko tak mam pewność, że wybierze zawsze z zakresu bez powtórzeń. Nie ma wbudowanej funkcji w php, która by losowała X liczb z zakresu zadanego bez powtórzeń. Tego raczej nie da się już prościej zapisać, bo inne metody będą bazować na tym, że losujemy w pętli tak długo, aż nie wylosujemy X i w razie trafienia tej samej, nie branie tego przebiegu pod uwagę. Innymi słowy zamiast jakiejś mogacej się wykonywać długo pętli w stylu
  1. $random_from_range = array();
  2. while( count( $random_from_range ) <= $loops ) {
  3. $temp = $mt_rand( $start_range, $end_range );
  4. if( array_search( $temp, $random_from_range ) == false ) {
  5. $random_from_range[] = $temp;
  6. }
  7. }

zrobiłem jednolinijkowca
  1. $random_from_range = (array) array_rand( array_flip( range( $start_range, $end_range ) ), $loops );
Nie sprawdzałem wydajności, gdyż każdy z nich ma swoje wady i zalety a zastosowanie jest zalezne od sytuacji. Ale ten zapis drugi, choć bardziej zawiły dla laika, na pewno ma ten plus, iż nie ma pustych przebiegów, nawet w przypadku gdy losowanie odbywa się przy liczbie losowanych bliskiej ilości liczb w zakresie. A to jest główna wada pętli, ktora zapewne nieraz wtedy trafi wielokrotnie w tę samą liczbę.

@Mike: Tak, wiem, że pierwszy przykład to nie jedyny z możliwych innych, bo tych można napisać jeszcze wiele bazując na shuffle i array_slice czy shuffle i array_pop dla przykładu (bliższe już wtedy 2 wariantowi). Ale najczęstsze implementacje są jednak bardzo podobne do tego pierwszego własnie. Nie jest to optymalne zawsze, podobnie jak moje w pewnych przypadkach, ale kwestia zawsze jest tego gdzie i jak często stosujemy.
mike
~thek ale ja nie mówię tym by każda operacja była jednym poleceniem. Twój przykład jest jak najbardziej OK. No może poza tym, że nazwa zmiennej $loops jest od czapy wzięta. Zamykając to wszystko w funkcję:
  1. <?php
  2.  
  3. public class SomeClass {
  4. public getRandomNumbersFromRange($resultNumbersCount, $startRange, $endRange) {
  5. return (array) array_rand(array_flip(range($startRange, $endRange)), $resultNumbersCount);
  6. }
  7. }
  8.  
  9. ?>
... sprawiasz, że kod sam się komentuje. Najzwyklej w świecie używając odpowiednich nazw funkcji, zmiennych e.t.c. oraz wydzielając atomowe operacje do funkcji sprawiasz, że wszelkie komentarze są zbędne.
Obawiam się, że podałeś zły przykład lub nie zostałem do końca zrozumiany.
ixpack
Cytat(mike @ 12.10.2011, 19:30:31 ) *
Tracisz energię i czas na niepotrzebną czynność. Jeśli kod jest tak nieczytelny, że jego zrozumienie wymaga dodatkowych komentarzy to jest do przepisania. Kod sam w sobie powinien się łatwo czytać i być zrozumiały. Jeśli jest niezrozumiały jest kiepskiej jakości i nie poprawisz jego jakości dodając komentarze.
Kod podlega przenosinom, refactoringowi i wielu innym modyfikacjom. Rzadko za tym idzie modyfikacja komentarzy. A nawet jeśli to dokładasz sobie dwa razy więcej pracy bo utrzymujesz kod i komentarze.
Najczęściej jest tak, że są one nieaktualne, niekompletne i mylące.


QFT, jestem przeciw zbędnym komentarzom. Moje komentarze to ewentualnie przypomnienie co następująca funkcja, metoda, jakaś spójna część kodu "robi" - choć rzadko, bo w większości wypadków sama nazwa np. funkcji, klasy dużo mówi. Ja akurat jestem zwolennikiem dłuższych nazw zmiennych etc. tzn. jak mam np. zmienną, która tylko "tu" się przyda, to nazywam ją $tempNumbers albo $tempSortedNumbers - netbeans i tak podpowiada.
A ponieważ nadal się uczę - to mam jeszcze wiele kodu śmieciowego w swoich "biblioteczkach" - masakra... Wtedy nie komentowałem z lenistwa i często piszę od nowa kod bo jak można używać czegoś, czego się nie rozumie wink.gif
mike
~thek ten pierwszy przykład równiez można napisać w dużo bardziej czytelny i samodokumentujący się sposób:
  1. <?php
  2.  
  3. public class SomeClass {
  4.  
  5. public getRandomNumbersFromRange($resultNumbersCount, $startRange, $endRange) {
  6. $randomNumbers = array();
  7. while (count($randomNumbers) <= $resultNumbersCount) {
  8. $randomNumber = mt_rand($startRange, $endRange);
  9. addRandomNumberIfUnique($randomNumbers, $randomNumber);
  10. }
  11.  
  12. return $randomNumbers;
  13. }
  14.  
  15. private addRandomNumberIfUnique($randomNumbers, $randomNumber) {
  16. if (array_search($randomNumber, $randomNumbers) == false) {
  17. $randomNumbers[] = $randomNumber;
  18. }
  19. }
  20. }
  21.  
  22. ?>

Kolejne dwie zasady, które staram się stosować to:
1. Unikać nazw zmiennych pod tytułem temp. One kompletnie nic nie mówią bo chodzi o zawartość.
2. Wydzielać bloki kodu do oddzielnych funkcji. Nawet te najmniejsze jeśli tylko pomoże to w czytelności kodu.

Znów kompletnie brak miejsca na komentarze. Jest naprawdę bardzo niewiele miejsc gdzie komentarze są przydatne. A jeszcze mniej gdzie są potrzebne.
blooregard
Cytat
Znów kompletnie brak miejsca na komentarze. Jest naprawdę bardzo niewiele miejsc gdzie komentarze są przydatne. A jeszcze mniej gdzie są potrzebne.


Chyba, że istnieje wymóg stworzenia dokumentacji (javadoc lub phpdocumentor). wink.gif

Poza tym, ja osobiście uważam, że używanie zmiennych typu 'temp' czy 'tmp' we fragmentach kodu, gdzie te zmienne faktycznie istnieją jedynie na chwilę, w celu przechowania jakiejś tymczasowej wartości (np. jakieś obliczenia w pętli, gdzie przechowują wynik cząstkowy), ma sens pod warunkiem, że faktycznie służą tylko i wyłącznie temu. Nawet nazwa takiej zmiennej sugeruje, że jest ona chwilowa i że jej wartość nie jest nigdzie dalej wykorzystywana.

Co oczywiście nie przeszkadza w niczym nazwać jej np. 'temporarySum' czy cos takiego smile.gif
mike
Cytat(blooregard @ 13.10.2011, 10:25:03 ) *
Chyba, że istnieje wymóg stworzenia dokumentacji (javadoc lub phpdocumentor). wink.gif
No tak zdarza się, że ktoś postawi taki wymóg sad.gif
Warto się wtedy ograniczyć do komentowania tylko publicznego API najważniejszych modułów. Udokumentowanie wtedy klas oraz pakietów zazwyczaj może wystarczyć.
Z rzeczy, które niemal zawsze przydaje się udokumentować w komentarzach to informacje o rzucanych wyjątkach.
Tho
Oj znamy to uczucie, programowanie to nie praca, to coś o wiele straszniejszego laugh.gif
thek
@mike: w przykładzie chodziło mi o to, że nawet pozornie jednolinijkowa operacja może mieć taki kod, który bez chwili rozknimki nie jest dla Ciebie zrozumiały i nie chodzi tutaj o to, że nie jest to ujęte w klasie i problem rozwiązuje zastosowanie określonego nazewnictwa. Czasem konieczne jest skomentowanie czemu tak, a nie inaczej, by przeglądając kod po kilku tygodniach wiedziećy na czym polega ów fragment, gdyż zastosowaliśmy jakieś niezbyt dla siebie typowe rozwiązanie, które wydaje się na pierwszy rzut oka nieczytelne lub nie pasujące do całości. Tak więc nie chodzi mi tu o to by trzymać konwencje, ale wchodzić z komentarzami tam, gdzie to jest uzasadnione logiką i naszym zapominalstwem. Na poziom poniżej tego, który podpowiada nam IDE bazując choćby na PHPdoc. Przykładowo, jeśli tu czy tam użyliśmy algorytmu X, który można znaleźć na stronie Y lub Z. Ja w tym kodzie miałem, że służy on mi do tego i tamtego, ale ważne było dla mnie także, dlaczego taką składnię zastosowałem, a tego mi już konwencja nazewnictwa po kilku tygodniach nie powie. Fakt, nazwa $loops jest nic nie mówiąca, ale została po pierwotnej wersji podczas optymalizowania. To zresztą fragment wtyczki do Wordpressa, która dość mocno mieli, więc zamiast dodatkowo obciążać serwis kolejnym poziomem abstrakcji, zastosowałem podejście strukturalne jako szybsze, zwłaszcza że dane pobierane są z innego serwisu (XMLRPC) i już tutaj wiele tracę na nawiązanie połączenia oraz oczekiwanie na dane, więc musiałem optymalizować pod kątem czasu wykonania. Przez to pewne rzeczy i kruczki musiałem opisać by po kilku tygodniach nie patrzyć się na to jak cielę na malowane wrota smile.gif
blooregard
Cytat(mike @ 13.10.2011, 10:33:15 ) *
No tak zdarza się, że ktoś postawi taki wymóg sad.gif
Warto się wtedy ograniczyć do komentowania tylko publicznego API najważniejszych modułów. Udokumentowanie wtedy klas oraz pakietów zazwyczaj może wystarczyć.
Z rzeczy, które niemal zawsze przydaje się udokumentować w komentarzach to informacje o rzucanych wyjątkach.

Dokładnie to miałem na myśli.

mike
~thek zgodzę się. Czasem krótko można napisać o algorytmie, który jest zastosowany jeśli jest on na przekład nieintuicyjny, autorski lub nieznany szerokiemu gronu.
To jest jedna z sytuacji kiedy krótki komentarz jest OK.
ixpack
$temp - nigdy samego nie używam zawsze tempCos - i tylko jak blooregard pisał wtrącam taką zmienną w odpowiednich momentach ; ) np:
  1. $tempNumbers = $prepared_smsAnalytics->fetch(\PDO::FETCH_OBJ);
  2. ($tempNumbers->delivered != '') ? $tempDelivered = array_unique(explode(",", $tempNumbers->delivered)) : $tempDelivered = null;
  3. ...
  4. return array($tempDeliveredNumbers, $tempBouncedNumbers, $tempRejectedNumbers);

Chociaż tak myślę czytając "2-gą radę" mike'a - mógłbym oddzielić to do osobnej funkcji - co będzie bardziej czytelne.

Jak widać "prepared_" - to taki mój prefix, obok używam query_, exec_ - wówczas gdy potrzebuję użyć to znowu wpisuję $prepared_ np. i netbeans sam podpowiada - pomaga mi jak akurat potrzebuję dostępu do bazy i konkretnych danych. W sumie tak sobie myślę, że mógłbym każdą taką rebeliancką akcję powydzielać do malutkich funkcji, a nóż później funkcja dojrzeje wink.gif i się w coś przekształci.


A co chciałem do tematu powiedzieć: każdy ma swoje "ulepszenia", które przyśpieszają pracę nad kodem wink.gif
blooregard
Cytat
A co chciałem do tematu powiedzieć: każdy ma swoje "ulepszenia", które przyśpieszają pracę nad kodem


Tylko trzeba pamiętać o tym, że ktoś kiedyś może będzie ten kod utrzymywał i Twoje "ulepszenia" mogą wtedy bardzo ten proces utrudnić wink.gif
mike
Skoro tak temat powędrował to ja przy okazji gorąco polecam: Clean Code: A Handbook of Agile Software Craftsmanship. Książka naprawdę bardzo dobra.
Niby opisane zasady i podpowiedzi tyczą się niemal podstaw, które dobry programista już dawno powinien osiągnąć to jednak nieźle trzepie po głowie. Ja mocno polepszyłem warsztat po przeczytaniu książki.
Pozycja z naciskiem na Javę (zawiera trochę tekstu, który dość mocno tyczy się tego języka) ale w ogólności kierowana dla użytkownika każdego języka.
thek
Wiem, że mało adekwatny nieco, ale posłużę się linijką z kodu jaki już podałem i tyczy właśnie wyliczania niefortunnego $loops smile.gif
  1. $loops = min( $random_existance['count'], count($random_text) );
Dla siebie dodatkowo skomentowałem, że jest ono potrzebne w ramach zabezpieczenia. Może być bowiem sytuacja, że tekstów losowych jest podanych mniej niż wylosowana liczba. Niby drobiazg, ale bez niego w określonych sytuacjach kod się może wyłożyć. Komentarz tutaj informuje więc mnie, że jest to miejsce na które muszę zwrócić uwagę podczas ewentualnej optymalizacji kodu. Myślę, że ma tutaj więc uzasadnienie komentarz, gdyż jest to potencjalna pułapka w sytuacji dostarczania danych z zewnątrz. Ja dla siebie więc i późniejszego zrozumienia lubię stosować. Nie by pisać elaborat, ale gdy siadam po długim czasie znowu do kodu tegoż, wiedzieć co z czym zjeść. A takiej informacji konwencje nie obejmują. Konwencje tyczą bowiem czytelności kodu i pewnych podstawowych informacji, a nie jego głebszej warstwy logiczno-informacyjnej tak naprawdę. Z samego nazewnictwa, układu kodu i jego ustrukturyzowania tego nie uzyskam w żaden sposób.
mike
Cytat(thek @ 13.10.2011, 11:24:28 ) *
Myślę, że ma tutaj więc uzasadnienie komentarz, gdyż jest to potencjalna pułapka w sytuacji dostarczania danych z zewnątrz.
Jakbyś zrobił z tego funkcję (opisaną przez jej nazwę):
  1. <?php
  2.  
  3. class SomeClass {
  4. private function calculateRandomNumbersCount($randomExistance, $randomText) {
  5. return min( $randomExistance['count'], count($randomText) );
  6. }
  7. }
  8.  
  9. ?>

... to użycie komentarza już nie jest takie oczywiste. Aczkolwiek racja, troszeczkę pomocne.
thek
Gdybym oparł o klasy lub robił specjalnie funkcje, choć wiem, że dany kod będzie wykonywany jednokrotnie przez całe wywołanie funkcji i nigdzie indziej w kodzie, to fakt, miało by to jakiś sens. Jak jednak wspomniałem, świadomie zrezygnowałem z warstwy abstrakcji i zamykania wszystkiego w funkcje celem minizowania wszelkich narzutów czasowych, a takim wypadku cierpi czytelność. Zyskuje na czasie wykonania, tracę na połapaniu się w kodzie i chcąc, nie chcąc, przy takim podejściu komentarze stają się niemal obowiązkiem. Gdyby nie ten fakt, który stanął jako podwalina, to zrobiłbym zapewne jak mówisz i ładnie bym się trzymał standardów OOP. A tak jedyną pomocą jaką mogłem zastosować było trzymanie konwencji nazewnictwa, choć i tu mi się zdarzyło walnąć gdzieniegdzie byczka smile.gif
mike
Czyli brniesz w negatywne skutki poprzednich błędnych decyzji smile.gif I brniesz dalej i dalej ...
W programowaniu bardzo łatwo nadziać się na efekt stłuczonej szyby.
vokiel
thek czy dodanie jednej klasy i kilku metod będzie zauważalnym narzutem w wykorzystaniu zasobów, czasu działania?

Moim zdaniem będzie to bardzo daleka pozycja po przecinku. Czas poświęcony na pisanie komentarzy, albo później przy każdej zmianie - na wgryzanie się w kod, będzie dużo dłuższy i będzie generował dużo większe koszty niż dodatkowa pamięć czy czas serwera.
thek
@mike: jeśli nie naprawiałbym "dziur", to masz rację smile.gif "Problem" w tym, że skrypt jest kompletny i nie wymaga poprawek od strony logiki. Jedyne które mogą go dotknąć tyczą się właśnie optymalizacji wydajnościowych. Albo wtedy poprawiam czytelność i obniżam wydajność, albo na odwrót. W moim wypadku wybrałem to "na odwrót"
@vokiel: masz częściowo rację. Z tym, że komentarze piszę tak, że nawet kompletny debil by zrozumiał smile.gif Siadając po nawet roku do kodu i mając poprawne nazewnictwo oraz takie komentarze nie miałbym prawa się nie połapać w chwilę co zrobiłem smile.gif
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.