RSS

Spacje i tabulacje

Liczba odsłon: 105

Wcięcia ze spac­ji czy ta­bu­la­cji — to od­wiecz­ny dy­le­mat pro­gra­mis­tów. Kwestia, wy­da­wa­ło­by się, nie­zbyt istot­na. W prak­ty­ce jed­nak czy­tel­ność tek­stu źród­ło­we­go ma pod­sta­wo­we zna­cze­nie dla zro­zu­mie­nia pro­gra­mu przez do­świad­czo­nych pro­gra­mis­tów, a for­ma­to­wa­nie tek­stu już w cza­sie pi­sa­nia wni­ka w pod­świa­do­mość i sta­je się dru­gą na­tu­rą. Trudno też so­bie wy­ob­ra­zić ja­ką­kol­wiek pra­cę w ze­spo­le, któ­re­go każ­dy czło­nek sto­su­je od­mien­ne re­gu­ły for­ma­to­wa­nia.

Często prze­glą­dam stro­ny WWW za­wie­ra­ją­ce ra­dy do­ty­czą­ce sty­lu pro­gra­mo­wa­nia, sto­so­wa­nych roz­wią­zań oraz do­brych prak­tyk. Zaskaku­ją­co częs­to jed­ną z pod­sta­wo­wych rad jest re­zyg­na­cja ze sto­so­wa­nia zna­ków ta­bu­la­cji i for­ma­to­wa­nie wcięć wy­łącz­nie za po­mo­cą spac­ji. Najczęściej cy­to­wa­nym uza­sad­nie­niem jest zmien­ność sko­ku ta­bu­la­cji w róż­nych śro­do­wis­kach pro­gra­mis­tycz­nych, utrud­nia­ją­ca utrzy­ma­nie wy­rów­na­nia blo­ków tek­stu. O ile bo­wiem kie­dyś stan­dar­dem sko­ku ta­bu­la­cji by­ło osiem zna­ków (co swo­ją dro­gą jest war­toś­cią zbyt du­żą w przy­pad­ku bar­dziej roz­bu­do­wa­nych pro­gra­mów o wie­lu po­zio­mach za­gnież­dże­nia tek­stu źród­ło­we­go) i wciąż wie­le na­rzę­dzi ko­rzy­sta z tej war­toś­ci, częs­to spo­ty­ka się skok ta­bu­la­cji rów­ny 3 lub 4 ko­lum­ny. W efek­cie tekst sfor­ma­to­wa­ny orygi­nal­nie w na­stę­pu­ją­cy spo­sób:

void Podprogram(int Parametr1, int Parametr2,
[......][......]int Parametr3, int Parametr4)
{
[......]if (wyrażenie1 || wyrażenie2 || wyrażenie3
[......][......]|| wyrażenie4 || wyrażenie5)
[......]{
[......][......]Podprogram2();
[......]}
}

po wy­świet­le­niu na kom­pu­te­rze, na któ­rym skok ta­bu­la­cji zo­stał usta­wio­ny na trzy ko­lum­ny wy­glą­dał­by na­stę­pu­ją­co:

void Podprogram(int Parametr1, int Parametr2,
[.][.]int Parametr3, int Parametr4)
{
[.]if (wyrażenie1 || wyrażenie2 || wyrażenie3
[.][.]|| wyrażenie4 || wyrażenie5)
[.]{
[.][.]Podprogram2();
[.]}
}

O ile wy­ra­że­nie lo­gicz­ne we­wnątrz in­struk­cji if zy­ska­ło w efek­cie – choć przy­pad­ko­wo – na czy­tel­no­ści, pa­ra­met­ry pod­pro­gra­mu prze­su­nęły się w spo­sób nie­zgod­ny z za­mie­rze­nia­mi auto­ra, lo­gi­ką oraz przej­rzy­sto­ścią. Powodem jest za­sto­so­wa­nie te­go sa­me­go bia­łe­go zna­ku za­rów­no do wska­za­nia po­zio­mu za­gnież­dże­nia ko­du, jak i for­ma­to­wa­nia go.

Zastoso­wa­nie spac­ji lik­wi­du­je ten prob­lem. Ma ona sze­ro­kość do­kład­nie jed­ne­go zna­ku i po­za przy­pad­kiem sto­so­wa­nia czcion­ki pro­por­cjo­nal­nej (co jest rzad­ko­ścią wśród pro­gra­mis­tów), sfor­ma­to­wa­ny za po­mo­cą spac­ji tekst źród­ło­wy pro­gra­mu zaw­sze bę­dzie się cha­rak­te­ry­zo­wał po­praw­ny­mi wcię­cia­mi oraz właś­ci­wym wy­glą­dem.

Taki spo­sób for­ma­to­wa­nia ma jed­nak wa­dy:

Dlatego naj­lep­szym, choć naj­bar­dziej skom­pli­ko­wa­nym roz­wią­za­niem jest po­łą­cze­nie oby­dwu me­tod. Technika ta na­su­wa się w pew­nym mo­men­cie chy­ba każ­de­mu bar­dziej do­świad­czo­ne­mu pro­gra­mi­ście; jest też opi­sa­na w Inter­ne­cie. W skró­cie:

  1. wcię­cia wy­ni­ka­ją­ce z po­zio­mu za­gnież­dże­nia tek­stu źród­ło­we­go pro­gra­mu za­pi­su­je się zna­ka­mi ta­bu­la­cji,
  2. wcię­cia ma­ją­ce zna­cze­nie tyl­ko este­tycz­ne, wy­rów­nu­ją­ce ele­men­ty na tym sa­mym po­zio­mie za­gnież­dże­nia, za­pi­su­je się spac­ja­mi.

Przedsta­wio­ny wcześ­niej przy­kład po­wi­nien zo­stać za­tem za­pi­sa­ny w na­stę­pu­ją­cy spo­sób:

void Podprogram(int Parametr1, int Parametr2,
················int Parametr3, int Parametr4)
{
[..]if (wyrażenie1 || wyrażenie2 || wyrażenie3
[..]···|| wyrażenie4 || wyrażenie5)
[..]{
[..][..]Podprogram2();
[..]}
}

Powyższy za­pis za­cho­wu­je za­rów­no in­for­mac­ję o po­zio­mie wcię­cia, jak i spo­so­bie wy­rów­na­nia — nie­za­leż­nie od sko­ku ta­bu­la­cji. Nawet przy za­ło­że­niu sko­ku co dzie­sięć ko­lumn, wy­ci­nek wciąż po­zos­ta­je w peł­ni czy­tel­ny:

void Podprogram(int Parametr1, int Parametr2,
················int Parametr3, int Parametr4)
{
[........]if (wyrażenie1 || wyrażenie2 || wyrażenie3
[........]···|| wyrażenie4 || wyrażenie5)
[........]{
[........][........]Podprogram2();
[........]}
}

Metoda ta wy­ma­ga o wie­le więk­szej uwa­gi ze stro­ny pro­gra­mis­ty. Z do­świad­cze­nia wiem jed­nak, że to po­cząt­ku­ją­cy ma­ją naj­więk­szy prob­lem z kon­sek­went­nym sto­so­wa­niem wcięć. Programi­ści z więk­szym do­świad­cze­niem, ma­ją­cy za so­bą reali­zac­ję wie­lu dłu­go­ter­mi­no­wych pro­jek­tów, w tym wy­ma­ga­ją­cych pra­cy ze­spo­ło­wej, wie­dzą do­sko­na­le, że brak pra­wid­ło­wych wcięć i nis­ka este­ty­ka ko­du ozna­cza­ją zwięk­sze­nie sto­py błę­dów, stra­tę cza­su, wzrost kosz­tów i zmniej­sze­nie za­rob­ków.

Najważniej­sze jest jed­nak, by raz wy­uczo­ne po­praw­ne, przej­rzy­ste for­ma­to­wa­nie tek­stów źród­ło­wych pro­gra­mów sto­so­wać kon­sek­went­nie i jed­no­li­cie. Jeżeli wszys­cy w ze­spo­le pro­gra­mi­stycz­nym sto­su­ją in­ną tech­ni­kę, moż­na al­bo spró­bo­wać uargu­men­to­wać i prze­for­so­wać po­wyż­sze po­dejś­cie, al­bo... pod­dać się i do­sto­so­wać do ze­spo­łu.


Jeżeli chodzi o formatowanie wcięć w przypadku tworzenia stron internetowych, dawno już zostały one unormowane. Powinniśmy stosować tylko i wyłącznie 4 spacje jako wcięcie. Mówi o tym PSR. Warto przeczytać: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md oraz zainteresować się narzędziem do automatyzacji procesu poprawiania formatowania kodu: https://github.com/fabpot/PHP-CS-Fixer.
Tylko należy pamiętać, że jest to zalecenie pewnej organizacji, która nie ma jakiegokolwiek umocowania prawnego umożliwiającego wymuszenie. Dobrze, że takie standardy powstają, ale nie zmieni to faktu, że niektórzy programiści po prostu muszą pisać w swojej ulubionej notacji, bo inaczej nie "widzą" kodu, a niektóre przedsiębiorstwa mają własne, wewnętrzne style kodowania.
Jak najbardziej się zgadzam. Jednak, gdy mówimy o jednej z największych firm (Sensiolabs) na rynku IT, gdzie CEO jest także developerem samego języka PHP – dla mnie osobiście te zasady stają się święte.
I ja się z tym po części zgadzam, aczkolwiek od razu daję kontrprzykład: Kernighan i Ritchie, niewątpliwie czołowe autorytety w zakresie języka C, stworzyli styl zapisu obowiązujący w tym języku, a nie wszyscy się do niego stosują.