: Standard kodowania

Pary_anime

W wyniku przeprowadzonego g³osowania grupa ochotników zaakceptowa³a propozycjê standardy kodowania dla projektów OpenSource.

Prace nad "Standardem..." przebiega³y w burzliwej atmosferze. By³y d³ugotrwa³e dyskusje, przekonywania sie (co tu ukrywac) za¿artych k³ótniach. Dyskusjom nie by³o koñca. Ostatecznie zdecydowano siê poddaæ projekt Standardu pod g³osowanie. [/b] Uznali¶my, ¿e lepsze jest wrogiem dobrego, a nasze akademickie dyskusje mog± siê ci±gn±æ w nieskoñczono¶æ. Zawsze mo¿na niedoci±gniêcia poprawiæ pó¼niej.

Do g³osowania zostali zaproszeni nie tylko uczestnicy dyskusji, ale równie¿ inni zwolennicy PHP i Open Source . G³osowanie zakoñczy³o siê 20 grudnia 2002, a wiêc jeszcze przed

Bo¿ym Narodzeniem.

Przyjêty standard jest kompromisem i mo¿e uledz dalszym zmianom. Nikt nie zak³ada, ¿e zosta³ stworzony raz na zawsze, a jego cel to stworzenie konwencji zapisywania kodu.

Jeszcze przed g³osowaniem, ¿e osoby wstrzymuj±ce siê od g³osu nie wp³ywaj± na wynik g³osowania, ale ich g³os wskazuje, ¿e uwa¿aj± za konieczne rozwa¿enie w przysz³osci zmian w przypadku ewentualnego przyjecia poszczególnych elementów "Standardu...).

Wyniki g³osowania w procentach (za / wsztrzyma³o siê / przeciw):

l Po co jaki¶ standard? ( 76 / 11 / 11 )
lStyl pracy nad projektem ( 75 / 6 / 18 )
lUk³ad strony ( 41 / 47 / 11 )
lTworzenie nazw ( 56 / 12 / 31 )
lKomentarze ( 37 / 37 / 25 )
lNawiasy i spacje ( 43 / 31 / 25 )
lIstotne warunki co do kodowania PHP ( 82 / 5 / 11 )
lKodowanie PHP na styku z SQL i tablicami ( 75 / 6 / 18 )
lKodowanie baz danych ( 58 / 5 / 35 )
lKodowanie HTML ( 88 / 5 / 5 )

Zg³oszone od dzi¶ propozycje zmian bêd± mog³y byæ g³osowane w po¼niejszym czasie.
Dla celów zg³aszania zmian stworzony zosta³ temat: Standard kodowania - propozycje zmian i korekt



Wk³ad w powstanie niniejszej standaryzacji wnie¶li (uk³ad alfabetyczny):
antyqjon, roodee, Sl@o

Podczas prac nad standaryzacj± korzystano z opracowañ:
http://utvikler.start.no/code/php_coding_standard.html
http://srparish.net/writings/php_code_standards.html
http://pear.php.net/manual/en/standards.php

W przypadku watpliwosci lub rozbieznosci o wyborze decydowac bedzie sposob zapisu stosowany z manualem PHP.

Duzy wklad w powstanie niniejszego standardu kodowania dla aplikacji PHP na niniejszym forum wniesli uczestnicy grupy dyskusyjnej pl.comp.lang.php oraz liczni go¶cie na forum Skorosze.pl

Po co jaki¶ standard?

Niniejsze opracowanie opiera siê na dyskusji grupy projektowej i jest czê¶ci± projektu Open Source. Niniejszym standaryzacja ma system otwarty, mo¿e byæ modyfikowana, rozbudowywana, skracana, etc, Autorzy licz± jednak na informowanie o naniesionych poprawkach w celu aktualizacji niniejszej standaryzacji.

Okre¶lenie to ma sprzyjaæ powstaniu ³atwego do przegl±dania i modyfikowania kodu PHP jak najblizszego temu podanemu bibli kazdego PHPowca, tj. w manualu PHP. Nie mniej wa¿nym celem jest konieczno¶æ okre¶lenie konwencji pisania aplikacji.

Niniejszy standard kodowania jest bliski tradycyjnej unixowej formule kodowania. Jednak¿e w wielu miejscach zdecydowano siê na rozwi±zania praktyczne, które sta³y w sprzeczno¶ci z podej¶ciem tradycyjnym. Ale siê bêd± wkurzaæ )). Od unixowej tradycji wieksza wage ma dla nas manual PHP.

Dlaczego nie warto stosowaæ standaryzacji w oprogramowaniu Open Source?

Standaryzacja to straszna przeszkoda i same k³opoty.



A teraz ju¿ serio

Styl pracy nad projektem

Z uwagi na Ustawe o jezyku polskim, aplikacje beda pisane w Polsce w jêzyku polskim, a czesci powstale za granica tlumaczone na jêzyk polski. Jednak dla celów upublicznienia równolegle powinna powstawac wersja w jezyku o charakterze miedzynarodowym.

Z uwagi na tworzenie systemu Open Source:
    l wszystkie nazwy zmiennych, funkcji, metod, tablic, pol, klas. etc powinny byc pisane w jezyku o charkaterze miedzynarodowym (wskazany: angielski). l komentarze i naglowki w wersji udostepniane jako kolejne wersje aplikacji powinny byæ podane w jezyku o charakterze miedzynarodowym (wskazany: angielski) - w przypadku wersji lokalnych mog± byæ podane w lokalnej wersji jezykowej.

Uk³ad strony
Najwa¿niejszym celem standaryzacji jest pisanie czytelnego i zrozumia³ego dla innych kodu.

1. Szeroko¶æ strony


2. Wciêcia:
    l Standardowo nale¿y u¿ywaæ wciêcia o d³ugo¶ci 4 spacji w przypadku kodu PHP i dwie w przypadku kodu HTML.

(To wci±¿ jest sprawa otwarta, gdy¿ niektóre standardy zalecaj±, w zwi±zku z edytorem vim, w ka¿dym przypadku dwie, co nie osobi¶cie siê bardzo podoba.)
Nie wolno stosowaæ tabulatorów, chyba, ¿e tabulator dzia³a jako forma wpisywania okre¶lonej liczby spacji do kodu. Takie mo¿liwo¶ci daje chocia¿by Emacs, gdzie nale¿y ustawiæ indent-tabs-mode do nil.

Jedynym wyj±tkiem jest mo¿liwo¶æ wstawienia tabulatora pomiêdzy koñcem linii kodu, a pocz±tkiem komentarza w tym samym wierszu. W przypadku kilku linii komentarza, równe ich ustawienie pozwol± na wiêksz± czytelno¶æ.

    l Je¶li istnieje konieczno¶æ z³amania wiersza kodu ze wzglêdu na kod, to nale¿y tak go z³amaæ, by poni¿sza cze¶æ kodu by³a dok³adnie poni¿ej pierwszej zmiennej w wy¿szym wierszu.

codeDivStart() $rezultat = stworz_uzytkownika ($uzytkownik, $haslo, $nazwisko
                                $telefon, $email);



Tworzenie nazw

Nazwy s± jednym z kluczowych elementów kodu PHP - sercem aplikacji.
Nazwy powinny opisywaæ to co nazywaj± i do czego s³u¿± w sposób jak najbardziej jednoznaczny.
Zaleca siê unikanie w opisowej czê¶ci wiêcej cz³onów ni¿ trzy, gdy¿ zazwyczaj utrudnia to zrozumienie kodu ni¿ poprawê jego czytelno¶æ. Poza tym takie nazwy s± bardziej przemy¶lane i rzadko potrzebuj± wiêcej cz³onów ni¿ 3.

Pakiety
Wszystkie, rozdzielane podkre¶lenie, cz³ony nazwy pakietu powinny byæ pisane wszystkim du¿ymi literami.
Np.
codeDivStart() OPEN_SOURCE

Klasy
Klasy powinny byæ jak najdok³adniejszymi ich opisami. Je¶li to mo¿liwe to zaleca siê unikanie skrótów. Ka¿dy cz³on nazwy powinien byæ pisany z du¿ej litery, a cz³ony powinny byæ rozdzielane za pomoc± podkre¶lenia.
Np.
codeDivStart() Logowianie, Logowanie_Uzytkownika, Wprowadzenie_Nowego_Szablonu.

W przypadku korzystania z biblioteki klas, jako prefiksu nale¿y u¿yæ nazwy pakietu.
Np.
codeDivStart() OPEN_SOURCE_Wprowadzenie_Nowego_Szablonu

Funkcje i Metody
System ten nazywany jest "camel caps". Nazwa pochodzi od wygl±du napisu, który przypomina garby wielb³±da. Pierwszy cz³on nazwy jest pisana z ma³ej litery, a ka¿dy nastêpny wyraz z du¿ej, a dodatkowo brak jest znaku (spacja to te¿ znak) rozdzielaj±cego. W przypadku funkcji nale¿y stosowaæ (a przynajmniej siê zaleca) prefiksów okre¶laj±cych nazwê pakietu, z którego pochodz± funkcje, co zapobiegnie kolizji miêdzy pakietami.
Np.
codeDivStart() polacz(), pobierzDane(), OPEN_SOURCE_specyfikujPotrzeby()

Zalecane skróty sufiksy
Max - maksymalna mo¿liwa warto¶æ
Cnt - aktualnie zliczona warto¶æ
Key - warto¶æ kluczowa
Np.
OdpowiedziMax - maksymalna liczba mo¿liwych odpowiedzi,
OdpowiedziCnt - aktualna warto¶æ odpowiedzi

Is - do zadawania pytania, czy cos jest.
Get - w celu pobrania warto¶ci
Set - w celu ustalenia warto¶ci.
Np.
IsOdpowiedz - Czy jest odpowied¼?

Np.
Poprawnie: GetHtmlStatystyka
Niepoprawnie: GetHTMLStatystyka
    l W przypadku funkcji w tzw. klasach prywatnych zaleca siê je poprzedzaæ pojedyñczym podkresleniem.
Np.
_sortuj(), _inicjujDrzewko(), $this ->_status

Warto¶ci sta³e
Wszystkie cz³ony nazwy powinny byæ pisane wszystkimi wielkimi literami ³±czonymi podkre¶leniami. W przypadku, gdy warto¶æ ma zwi±zek z nazw± klasy/pakietu to jej/jego nazwa powinna byæ zapisana wielkimi literami.

Zmienne
Wszystkie cz³ony pisane ma³ymi literami i rozdzielone podkre¶leniem.

Elementy tablic
Pisane podobnie jak zmienne. Nigdzie nie u¿ywaj my¶lnika "-". Zawsze u¿ywaj apostrofów lub cudzys³owów do wyodrêbnienia elementów.
codeDivStart() $myarr['foo_bar'] = 'Hello';  //poprawnie
$myarr['foo-bar'] = 'Hello';  //niepoprawnie

Warto¶ci globalne
W razie potrzeby definiowania warto¶ci globalnych ich nazwa powinna byæ poprzedzona prefiksem w postaci pojedynczego podkre¶leniem, nazwy pakietu oraz kolejnego podkre¶lenia.
Np.
codeDivStart() $_OPEN_SOURCE_jaki_ladny_jest_swiat

Warto¶ci predefiniowane
Takie warto¶ci jak true, false, null powinny byæ pisane z ma³ej litery.

Nazwy w bazach danych SQL
    klucz podstawowy
    l Ka¿da tabela musi mieæ ustawiony serial index jako jej klucz podstawowy (primary key), a w nazwie powinien zawieraæ cz³on id.

    Nazwy tabel
    l Nazwami tabel nie mog± byæ samodzielnie (tzn. jako jedyne cz³ony, bez prefiksów, etc) s³owa zarezerwowane dla SQL, tj.:

codeDivStart() abort add all allocate alter analyze and any are as asc assertion at authorization avg begin between binary bit bit_length both by cascade cascaded case cast catalog char character character_length char_length check close cluster coalesce collate collation column commit connect connection constraint continue convert copy corresponding count create cross current current_date current_session current_time current_timestamp current_user cursor date datetime deallocate dec decimal declare default delete desc describe descriptor diagnostics disconnect distinct do domain drop else end escape except exception exec execute exists explain extend external extract false fetch first float for foreign found from full get global go goto grant group having identity in indicator inner inout input insert intersect interval into is join last leading left like listen load local lock lower max min module move names national natural nchar new no none not notify null nullif numeric octet_length offset on open or order out outer output overlaps partial position precision prepare preserve primary privileges procedure public references reset revoke right rollback rows schema section select session session_user set setof show size some sql sqlcode sqlerror sqlstate substring sum system_user table temporary then timespan to trailing transaction translate translation trim true union unique unknown unlisten until update upper usage user using vacuum value values varchar varying verbose view when whenever where with without work write
    l Nazwy tablel s± zapisane w ca³o¶ci ma³ymi literami, a poszczególne s³owa rozdzielone s± podkre¶leniami
    l Nazwy tabel s± podawane w liczbie mnogiej zgodnie z tym co zawieraja, tj. zawsze nale¿y pisac uzytkownicy zamiast uzytkownik
.

    Nazwy pól
    l Nazwy pól s± zapisane w ca³o¶ci ma³ymi literami, a poszczególne s³owa rozdzielone s± podkre¶leniami l Nazwy pól s± podawane w liczbie pojedynczej, chyba ¿e zawieraj± tre¶æ wskazuj±c± na wiele elementów
    l Nazwy pó³ s± poprzedzone prefiksem sk³adaj±cym siê z pierwszych liter poszczególnych cz³onów nazwy tabeli, np. dla tabeli kategorie_uzytkownokow - ku_id
    l W przypadku nazw pól nie jest zabronione stosowanie nazw zastrze¿onych, gdy¿ zgodnie z niniejsz± zasad± nazwy pól s± zawsze poprzedzane prefiksem od nazwy tablicy. W innym przypadku nazwy nie moglyby zawieraæ nazw zastrze¿onych.

Komentarze

Zazwyczaj, po przygotowaniu skryptu, gdy patrzymy na piêknie napisany kod widz±c jego przejrzysto¶æ jeste¶my zafascynowani, ¿e nawet nie potrzeba s³owa komentarza. Wszystko jest oczywiste. Ale ju¿ tydzieñ pó¼niej tak oczywistym to nie jest, a po miesi±cu... Po trzech to ju¿ czara magia.
No có¿ ka¿dy przez to przeszed³.

Komentarze powinny opisaæ jak wszystko dzia³a. W zasadzie nigdy komentarzy zbyt wiele, ale jak pominiesz to, ¿e "obieca³e¶ zrobiæ co¶ z tym plikiem tydzieñ temu, ale, ¿e zabalowa³e¶, to dopiero zabra³e¶ za niego trzy dni pó¼niej a tak naprawdê to robisz dopiero dzisiaj i strasznie boli Ciê g³owa, etc... to chyba siê nikt nie pogniewa.

Nag³ówek
Ka¿dy plik powinien zawieraæ informacje wed³ug poni¿szego wzoru, gdzie cze¶æ:

Poni¿ej przedstawiam przyk³ad takiego nag³ówka:
codeDivStart() /* nazwa edytora:
 +-------------------------------------------------------------------+
 | PHP version 4                                                     |
 +-------------------------------------------------------------------+
 | index.php                                                         |
 +-------------------------------------------------------------------+
 | Niniejszy plik jest czê¶ci± projektu System Obs³ugi Stron WWW     |
 +-------------------------------------------------------------------+
 | 1. Czynno¶æ pierwsza jaka robi niniejszy plik                     |
 | 2. Czynno¶æ druga                                                 |
 | 3. Czynno¶æ trzecia                                               |
 | 4. Czynno¶æ czwarta                                               |
 | 5. Czynno¶æ pi±ta                                                 |
 +-------------------------------------------------------------------+
 | Zmienne:                                                          |
 |    $zmienna1 - ot taki przyk³ad                                   |
 |    $zmienna2 - ot taki przyk³ad                                   |
 |    $zmienna3 - ot taki przyk³ad                                   |
 +-------------------------------------------------------------------+
 |    haselka.php - bardzo wazny plik                                |
 +-------------------------------------------------------------------+
 |          OPROGROMAWANIE MO¯NA STOSOWAC POD WARUNKIEM,             |
 |        ZE UWAZA SIÊ I Z TY ZGADZA DO TEGO CO NASTEPUJE:           |
 | Autorzy nie ponosza odpowiedzialnosci za dzialanie programu. Cala |
 | odpowiedzialnosc spoczywa na osobach konfigurujacych aplikacje    |
 | lub w inny sposob korzystajacy z kodu                             |
 | Prawa autorskie: Grupa programistów pracuj±cych spo³ecznie i bez  |
 | jakichkolwiek pieniedzy w ramach projektow OPEN SOURCE.           |
 | Pozostawiane jest prawo do swobodnego kopiowania, zmieniania kodu |
 | jego upowszechniania na zasadach licencji GNU GPL.                |
 |                                                                   |
 | UWAGA:                                                            |
 |       W przypadku wykorzystania niniejszego oprogramowania lub    |
 | jego czesci nale¿y umiescic niniejsza uwage, ze nikt nie ma prawa |
 | do wlaczania niniejszego kodu w calosci lub tylko jego czesci     |
 | do aplikacji, za które bêdzie pobieral jakiekolwiek wynagrodzenie |
 | Kod ten powinna byæ zawsze dostepna dla wszystkich bezplatnie     |
 | Z tego ograniczenia sa zwolnieni wszyscy, którzy sa wskazani jako |
 | autorzy w projekcie wskazanym w naglowku.                         |
+-------------------------------------------------------------------+
 | Autorzy:                                                          |
 |     rooddee <roodee.serwer.com>                                   |
 |     ktos_inny < ktos_inny.polbox.com>                             |
 +-------------------------------------------------------------------+
*/

Za autorów uwa¿a siê inicjatorów powstania kodu wraz z osobami, które dokona³y przynajmniej od 10% do 20% zmian w kodzie. Prosta reorganizacja kodu i poprawienie b³êdów nie mo¿e byæ uwa¿ana za wystarczaj±c± podstawê do dodania do listy autorów.

Komentarze w kodzie PHP:
codeDivStart() /* Jedna linia komentarza (zajmuje ca³± liniê)  */

codeDivStart() Kod(); // Komentarz w tej samej linii, w której znajduje siê linia.

codeDivStart() /*
 * Bardzo wa¿na jedna linia komentarza
 */
codeDivStart() /*
 * Wielowierszowy komentarz. Tutaj ju¿ mog± znale¼æ ca³e
 * zdania. Wygl±dem swym przypominaj± paragraf
 */
U¿ywany w perlu i shelu sposób komentowania przy pomocy # jest nie poprawny! !

S³owa specjalne w komentarzach
W komentarzach stosuje siê równie¿ s³owa specjalne. Mog± one byæ pomocne w czasie parsowania skryptu.
:TODO: topic
Oznacza, to co jest do zrobienia, po to by o tym nie zapomnieæ

:BUG: [ID_bledu] topic
tak wpisujesz zauwa¿one b³êdy, wyja¶ñ tu co siê dzieje i prawdopodobne przyczyny b³êdu oraz ewentualnie nadaj ID b³êdowi

:KLUDGE:
Je¶li nie jeste¶ zadowolony z wykonanej pracy, to poinformuj o tym i napisz co by¶ zmieni³, gdyby¶ mia³ wiêcej czasu. Ale bez fa³szywej skromno¶ci

:TRICKY:
Poinformuj, ze ta czesc kodu mo¿e kryæ niespodzianku, tak, by je¶li kto¶ chce zmieniaæ kod, to najpierw d³ugo o tym mysla³.

:WARNING:
Ostrze¿ przed czym¶

:PARSE:
czasami nie da siê nic zrobiæ z kodem i trzeba obej¶æ problem. Powiadom o tym.

:ATTRIBUTE: value
Mo¿esz tworzyæ w³asne atrybuty o nazwach stworzonych przez siebie.

W przypadku stosowania s³ów kluczowych w komentarzach wskazane jest by slowo kluczowe by³o pierwszym slowem komentarza, a nastepnie nazwa zapisujacego komentarz i date wpisu w formacie YYMMDD oraz nazwa problemu. Ponizej nale¿y opisaæ problem.
Np.
codeDivStart() /*
 * TODO: Sl@o 020907 dokonczyæ ten standard kodowania
 * Musze czym szybciej dokoñczyæ ten system kodowania i umie¶ciæ
 * go na forum, by inni go skomentowali i nanie¶li
 * w³asne poprawki. Mam nadzieje, ze nie skrzycz±.
*/

Komentarze w wersji podstawowej pisane sa w jezyku polskim. Dla celow szerszego upublicznienia aplikacji wykonywane beda wersje w jezyku o charakterze miedzynarodowym.

Nawiasy i spacje z nimi zwiazane

Nawiasy sze¶cienne {}

Nawiasy ()
Np. codeDivStart() function jakastam()                           // Komentarz
{
    if ($warunek) {mie¶ci siê w jednej linii}
    elseif ($warunek)                     // Komentarz
    {
        d³ugi lub wieloliniowy tekst
    }
    elseif ($warunek)                      // Komentarz
    {
        if ($warunek2)
        {
            while ($warunek3)              // Komentarz
            {
                d³ugi lub wieloliniowy tekst
            }
        }
    }
}

strcmp($s1, $s2);

return 1;

Istotne warunki co do kodowania PHP



Wskazania i preferencje co do kodowania PHP
    l Zmienna $GLOBAL nigdy nie mo¿e byæ u¿yta w funkcjach lub klasach funkcji, z wyj±tkiem warto¶ci konfiguracyjnych
    l Dane konfiguracyjne powinny byæ w³±czone ze specjalnych plików konfiguracyjnych i powinny w jak najmniejszym stopniu zawieraæ tablice z opcjami zale¿nymi l Do funkcji powinno byæ dodanych kilka linii komentarza opisuj±cego opis funkcji, definicje i wyja¶nienia co do argumentów, prawdopodobne typy wyników i ich warto¶ci oraz wyja¶nienia ich znaczeñ, a równie¿ przyk³ady zastosowañ funkcji l Nale¿y u¿ywaæ raczej komendy print ni¿ echo
    lUnikaj czêstych prze³±czeñ pomiêdzy PHP i HTML w przypadku ich blisko¶ci.


Obs³uga b³êdów
    l Sprawdzaj system, czy nie ma b³êdów, chyba, ¿e chcesz znane b³êdy ignorowaæ.
    l Wprowad¼ informacjê z nazwami b³êdów do ka¿dej informacji o b³êdach.

Kodowanie PHP na styku z SQL i tablicami

Kod nale¿y pisaæ tak, by ³atwo by³o go modyfikowaæ, a szczególnie odpluskwiaæ. Wyniki zapytañ zawsze musza byæ sprawdzane pod wzglêdem zwracanych wyników i zg³aszanych wyników.

codeDivStart() $zap = "SELECT u_uzytkownik AS uzytkownik, u_imie AS imie,
              u_nazwisko AS nazwisko
       FROM uzytkownik, grupy_uzytkownikow, grupy
       WHERE
         u_id = ugm_u_id
           AND
         ugm_g_id = g_id
           AND
         g_name ='$okreslona_grupa'
       ORDER BY uzytkownik ASC";

    l W przypadku b³êdów nigdy nie powinna wy¶wietlaæ siê tre¶æ zapytania ($query), chyba, ¿e celowo zosta³o to tak ustawione. Wy¶wietlenie zmiennej $query mog± pozwoliæ u¿ytkownikowi na poznanie struktury danych, a przez to u³atwiæ uszkodzenie bazy danych, a mo¿e i ca³ej aplikacji.
    l W przypadku s³ów kluczowych i warto¶ci umieszczanych w array, powinny one byæ ujête w cudzys³ów.
    codeDivStart() $tmp =$array[key];  //¼le
    $tmp =$array["key"];  //dobrzel Unikaj umieszczania tablic w ¶rodku cudzys³owów dla kodu PHP
codeDivStart() $str = "To jest niew³a¶ciwy sposób wstawiania $array[w_ten_sposób]";
$str = "To jest w³a¶ciwy sposób wstawiania" . $array ["w_ten_sposób"];

Kodowanie baz danych


Kodowanie HTML

Kodowanie HTML opiera siê na rekomendacji Konsorcjum W3 co do XHTML
Nizej podane sa niektore zmiany w stosunku do tego co wiekszosc zna z czystego html. Stsowanie pelnego formatowania z XHTML mile widziane i zalecane.


  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • wyciskamy.pev.pl
  • img
    \