Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Czy znacie te uczucie gdy...
daniofantasy
post 10.10.2011, 02:53:55
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 14.06.2007
Skąd: Chesterfield UK

Ostrzeżenie: (0%)
-----


...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?
Go to the top of the page
+Quote Post
Calibri
post 10.10.2011, 06:47:33
Post #2





Grupa: Zarejestrowani
Postów: 26
Pomógł: 4
Dołączył: 22.07.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
phpion
post 10.10.2011, 07:09:03
Post #3





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A wystarczy umiejętnie rozplanować sobie zadania, a nie robić wszystko na ostatnią chwilę. Nie wiem czy macie się czym chwalić...
Go to the top of the page
+Quote Post
starach
post 10.10.2011, 07:22:49
Post #4





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
erix
post 11.10.2011, 14:17:41
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Scrum, scrum, scrum... snitch.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
thek
post 12.10.2011, 14:58:09
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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".


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
mike
post 12.10.2011, 15:25:46
Post #7





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
kicaj
post 12.10.2011, 17:51:25
Post #8





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


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...


--------------------
PHP Developer

"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola
Go to the top of the page
+Quote Post
mike
post 12.10.2011, 19:30:31
Post #9





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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...


Ten post edytował mike 12.10.2011, 19:46:49
Go to the top of the page
+Quote Post
thek
post 13.10.2011, 08:22:25
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




@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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
mike
post 13.10.2011, 08:33:17
Post #11





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~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.
Go to the top of the page
+Quote Post
ixpack
post 13.10.2011, 08:35:37
Post #12





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

Ostrzeżenie: (0%)
-----


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


--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post
mike
post 13.10.2011, 08:58:08
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~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.

Ten post edytował mike 13.10.2011, 08:59:47
Go to the top of the page
+Quote Post
blooregard
post 13.10.2011, 09:25:03
Post #14


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
mike
post 13.10.2011, 09:33:15
Post #15





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Tho
post 13.10.2011, 09:34:37
Post #16





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 26.07.2011

Ostrzeżenie: (20%)
X----


Oj znamy to uczucie, programowanie to nie praca, to coś o wiele straszniejszego laugh.gif

Ten post edytował Tho 13.10.2011, 09:35:21
Go to the top of the page
+Quote Post
thek
post 13.10.2011, 09:36:02
Post #17





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




@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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
blooregard
post 13.10.2011, 09:36:17
Post #18


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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.



--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
mike
post 13.10.2011, 09:40:40
Post #19





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~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.
Go to the top of the page
+Quote Post
ixpack
post 13.10.2011, 09:48:40
Post #20





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

Ostrzeżenie: (0%)
-----


$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

Ten post edytował ixpack 13.10.2011, 09:52:25


--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 10:45