Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Projektowanie aplikacji w PHP. Część pierwsza.

Standardy kodowania.

Podobnie jak "fizyczna" część aplikacji, część logiczna także powinna się stosować do określonych konwencji. Klasy, funkcje i zmienne powinny być nazwane w logiczny sposób tak, aby ich nazwy dobrze oddawały naszą intencję. Logiczna część aplikacji to nic innego jak kod, więc przejdźmy do przykładów. Na początek przyjrzyjmy się przykładowi, który po prostu źle obrazuje intencję i psuje czytelność:

<?php
 $_X = foo(2);
 print $_X;
 
 function foo($bar) {
 return $bar * $bar; }
?>

Chociaż jest to czysto akademicki przypadek, dobrze prezentuje omawiany problem. Zmienna "$_X" i funkcja "foo" wcale nie oddają ich celu - aby dowiedzieć się, co zostanie wyświetlone na ekranie, musisz się przyjrzeć kodowi funkcji. Wyobraź sobie, że funkcja "foo" implementuje skomplikowany algorytm i może zwracać różnorakie kody, w zależności od ewentualnego wystąpienia błędu. Musiałbyś w takiej sytuacji studiować kod linijka po linijce, aby dowiedzieć się, o co tak naprawdę chodzi.

Przykład ten jest wadliwy w kilku innych aspektach. Zawiera beznadziejnie sformatowany kod wewnątrz funkcji "foo". Na dodatek, nazwanie zmiennej wielkimi literami, sugeruje, że zmienna jest albo stałą(:D), albo zmienną superglobalną, co w tym przypadku jest nieprawdą. Rozważ ulepszoną wersję naszego przykładu:

<?php
 $myNumber = 2;
 $mySquaredNumber = square($myNumber);

 function suqare($number)
{
  return $number * $number;
}
?>

Oprócz znacznie większej czytelności kodu, nazwy zmiennych i funkcji są jasne i oczywiste jest, co robi kod, nawet nie czytając definicji funkcji. Nazwy zmiennych są sformatowane podobnie jak nazwy plików - każde nowe słowo rozpoczynane jest wielką literą - to sprawia, że łatwo się je czyta i wpisuje. Klamerki w definicji funkcji są w pojedynczych liniach, co zwiększa czytelność definicji funkcji. Ponadto, kod w klamerkach zawsze powinien być poprzedzony jednym tabulatorem, aż do zamykającej klamerki. Rozważmy jeszcze jeden przykład, zanim odczytamy kompletną listę konwencji kodowania:

<?php
 print new foo_class(2);
 
 class foo_class{
 function foo_class($foo) { return $foo * $foo; }}
?>
<literal>

Ten przykład jest jeszcze gorzej sformatowany niż poprzedni. Na początek, użycie klasy w takim kontekście jest bezsensowne i całkowicie nie na miejscu. Poza tym, nazwa klasy nam nic nie mówi, a konstruktor jest użyty do zwracania kwadratu liczby. Jest to kolejny raczej akademicki przykład, ale jestem pewien, że większość programistów widziała kiedyś taki kod - nigdy nie jest łatwo patrzeć na takie "coś". Replay!(ulepszony):
<literal class='php'>
<?php
 $myNumber = 2;
 $myNumberSquared = Math::square($myNumber);
 print $myNumber;
 
 class Math 
 {
  function square($number)
  { 
   if (is_numeric($number) == false)
   {
    return 0;
   }
   
   return $number * $number;
  }
 }
?>

Powyższy przykład zajmuje dużo więcej miejsca na ekranie, ale jest ale jest zdecydowanie milszy dla oka. Zmienne mają teraz jasne nazwy, precyzyjnie określające ich cel. Nazwa naszej klasy, inaczej niż w przypadku zmiennych lub funkcji, rozpoczyna się wielką literą. Klasy powinny mieć nazwy w omawianym wcześniej formacie, ale z pierwsza litera powinna być wielką - to pozwala na łatwe zauważenie, w którym miejscu używana jest klasa, a także wysokie umiejscowienie klasy w hierarchii aplikacji.

Kod wewnątrz klasy jest starannie zagnieżdżony, a każda klamerka umieszczona jest we własnej linii, co pozwala łatwo odróżnić poszczególne bloki kodu. Przykład dodaje nawet prostą formę weryfikacji argumentów metody "square" - sprawdza, czy argument jest liczbą, czy można go podnieść do kwadratu. Zauważ przeprowadzanie właściwego testu na wartości zwracanej przez funkcję "is_numeric", unikając w ten sposób używania zwartej logiki. Wrócimy do tego w dalszej części.

Aby podsumować zastosowane konwencję, przygotowałem prostą listę zasad:

1. Zmienne powinny posiadać adekwatne do swojego przeznaczenia nazwy, zaczynające się z małej litery, używające formatu omówionego przy okazji nazewnictwa plików.

2. Klasy powinny posiadać intuicyjne nazwy, dobrze opisujące ich przeznaczenie, powinny używać tego samego formatu co zmienne, tyle że pierwsza litera ich nazwy powinna być literą wielką.

3. Funkcje powinny być nazywane według tych samych zasad co zmienne, podobnie ich argumenty.

4. Klamerki winny pojawiać się w osobnych liniach, a kod w nich zawarty powinien być zagnieżdżony(1 tabulator).

5. Nazwy stałych powinny być zapisane w całości wielkimi literami.

6. Właściwości klasy obowiązują te same zasady co zwykłe zmienne. Ponadto, do zmiennych klasy nie powinno się odwoływać z zewnątrz klasy - unikniemy wtedy pomyłek podczas odwoływania się do metod - które niekiedy mają takie same nazwy jak właściwości klasy. W PHP5 problem ten znika - można tam bowiem określić widoczność elementów klasy.

7. Klasy, funkcje i zmienne nie powinny być niepotrzebnie dodatkowo nazywane. Na przykład: funkcja nie powinna się nazywać "fn_square", a klasa z kolei nie powinna się nazywać "MathClass".

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (7)
Pętla
Czwartek 07 Luty 2013 2:13:59 pm - mayu11 <kontakt_at_mariuszolszowski.pl>

Ym.. z tą pętlą to może lepiej:

for( $i = count( $arr ); $i > 0; --$i )
{
foo( $i );
}

Przy nieobowiązkowej dobrej kolejności, chyba jest ok ;) I nie trzeba trzech zmiennych.

Typo
Sobota 11 Grudzień 2010 11:58:48 am - mambax7

Zamiast:

function suqare($number)

powwino byc:

function square($number)

petla for
Środa 23 Styczeń 2008 6:36:47 pm - xiann

Do dobrze, ale dlaczego:
for ($i = 0, $ii = count($myArray); $i < $ii; $i++) {
print $myArray[$i];
}

skoro mamy:

foreach ($myArray as $v) {
print $v;
}

??

Referencje
Sobota 18 Sierpień 2007 5:36:39 pm - kkasprzak

Niestety autor artykułu mija się trochę z rzeczywistością jeśli chodzi o referencje w PHP4. Używanie referencji nie zawsze prowadzi do oszczędności pamięci wręcz w pewnych przypadkach prowadzi do zwiększenia jej zużycia. Referencje jak sugeruje autor nie zostały też stworzone po to aby oszczędzać pamięć ale po to żeby można było operować na oryginalnym obiekcie a nie na jego kopii w metodach klasy czy funkcjach. Samo przekazanie instancji klasy do funkcji nie prowadzi do stworzenia jego kopii jak stwierdza autor - nadal działa mechanizm przekazywania przez wartość. Kopia obiektu jest tworzona w momencie gdy wywołamy jedną z metod klasy lub nadpiszemy wartość któregokolwiek z atrybutów klasy w tej że funkcji/metodzie. Zauważmy jednak że odczyt atrybutów klasy nie wymaga już tworzenia kopii obiektu, dlatego też php4 tego nie robi. Dlatego też możemy bezpiecznie przekazywać obiekty przez wartość dopóki wykorzystujemy obiekt jako obiekt przenoszący dane (DVO) z jednym zastrzeżeniem, że czytamy bezpośrednio z atrybutów klasy a nie poprzez gettery. Każde wywołanie jakiejkolwiek metody na rzez obiektu prowadzi do stworzenia jego kopii!!!

Referencja nie jest żadnym wskaźnikiem do wyimaginowanego miejsca w pamięci, jest to tylko inna nazwa jednego z kontenerów zmiennych. Po prostu w tablicy symboli jedna lub więcej nazw wskazuje na ten sam kontener.

Przeanalizujmy poniższy przykład:

<?php

function suma(&$v) {
return array_sum($v);
}

$a = range(1, 1000000);
$b = $a;

$c = suma($a);

?>

Wierzcie lub nie ale ,,dzięki'' temu, że tablica do funkcji jest przekazywana przez referencję zmusiliśmy php do stworzenia dodatkowej kopii tablicy $a i stało się to dokładnie w momencie wywołania funkcji suma(). Dlaczego....? Dlatego, że php próbuje być sprytne i nie tworzy kopii zmiennej dopóki nie musi. W naszym przypadku gdy przypiszemy $b = $a nie jest tworzona kopia tablicy oba symbole wskazują na ten sam kontener zmiennej. Jednak gdy do gry wchodzi referencja php musi stworzyć dodatkową kopię ponieważ w przypadku gdy dokonalibyśmy modyfikacji zmiennej przekazanej przez referencję zmiany widoczne by były zarówno w zmiennej $a i $b.

Zainteresowanych szczegółami mechanizmu referencji i zmiennych w php4 odsyłam do jednego z numerów phparchitect lub lepiej kodu php.

Pozdrawiam
Karol Kasprzak

Ciekawe informacja z petla for
Niedziela 04 Luty 2007 12:56:04 am - andrews_p <andrews_p_at_o2.pl>

Zaciekawiła mnie informacja na temat pętli for i obliczania długości tablicy w pierwszej części fora.

for(i=0, dlugosc=count(array); i<dlugosc; i++)
{
//kod
}

Ciekawe rozwiązanie co faktycznie zmniejsza ilość obliczeń. Chodź nie istotne przy małym projekcie ale gdy na stronie jest kilkadziesiąt osób może dać duże rezultaty.

Mały błędzik
Piątek 22 Wrzesień 2006 1:54:25 pm - arqon <lilika_at_wp.pl>

W poddziale standarty kodowania , w trzecim listingu powinno być print $myNumberSquared; aby wyświetlał rezultat metody :)
Super artykuł...

Klamry zbyt rozwlekłe
Piątek 14 Kwiecień 2006 4:42:54 pm - akubiczek

Wszystko fajnie, chociaż klamry w osobnych liniach wydają mi się zbyt rozwlekłym rozwiązaniem, już lepiej trzymać się tego co proponuje pear, czyli klamra otwierająca w tej samej lini:

function foo() {
//do some
}

Nie nie traci się na czytelności, a wprost przeciwinie - może być bardziej czytelnie, bo więcej kodu da sie objąć wzrokiem.

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2017 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System