A kódblokk szemantikus formázottságáról: behúzásról, sorigazításról

A minap fellapoztam a tabulátor versus szóközök használatának praktikus kérdéskörét, és örömmel konstatáltam, hogy temérdek szabadideje van a programozóknak észérvek mentén állásfoglalható problémát a végtelenségig csűrni–csavarni. A bevett gyakorlaton és történeti múltra hivatkozástól eltekintve a következő megállapításra jutottam a mintegy harminc esszé pro és kontra érveinek megemésztését követően.

Alapvetően az érintett keretrendszer, közösség, vállalat satöbbi irányelveihez, ajánlásaihoz igazítsuk indentelési konvenciónkat. Saját hatáskörön belül pedig döntsünk tetszésünk szerint – használjunk csupa szóközöket (0x20) a kódblokkok behúzására, vagy következetesen csak tabulátorokat (0x09); a kettőt viszont ne keverjük. Noha önmagában a tabulátor karakter szemantikus jelentéssel bír, tetszőlegesen testreszabható a vizsgált kód felett a behúzás mértéke, továbbá míg tabulátorral tagolt kódból bármikor tudunk csak szóközöket tartalmazó forrást előállítani (untabify), fordítva már nem volna triviális, mégis a tabra beállított editorok többsége helytelenül használja azt. Álljon itt egy példa 4 szóköz terjedelmű tabulátorral formázott C kódról:

4 szóköz terjedelemű tabulátorral behúzott és igazított kódblokk

A látszólag helyes tagolás akkor fordul visszájára, amikor a fennebbit megnyitom a saját editoromban, ahol a tabulátort 8 szóközre vettem. Az eredmény a következő, és egyúttal továbbgondolandó 2 space esetére:

8 szóköz terjedelemű tabulátorral behúzott és igazított kódblokk

The author of that source code is using TABs not only for indenting, but also for aligning! That way his alignment get’s messed up when somebody uses a different TAB size. The solution of this problem is to simply just use what ever you want for indenting, but use spaces for aligning. (TABS vs Spaces. The end of debate.)

A tab használata nem azt jelenti, hogy ugyanolyan szélességűre kell annak nagyságát vennem, mint amivel a kódot előállító programozó dolgozott, hanem hogy tetszőleges preferenciák mellett is helyesen formázott blokkokat kapok. A beszúrt példán a probléma jól felismerhető. A tabulátor az indentelés mértékét jelenti. A félbetört kódsor második felénél tehát a probléma abból fakad, hogy illegálisan sok tabot tartalmaz, holott ugyanazon a blokk szinten található, mint a kódsor eleje. Sorigazításhoz (aligning) soha ne használjunk tabot. Mindez íme szemantikailag helyesen:

4 szóköz terjedelemű tabulátorral behúzott és szóközökkel igazított kódblokk

Ez pedig már nem borítja meg eltérő konfiguráció esetén sem a kód formázottságát.

Végkifejlettként tehát megállapítható, hogy csak abban az esetben – de akkor teljes nyugalommal – alkalmazzunk tabulátort behúzáshoz, amennyiben az editorunk kellő körültekintéssel támogatja azt. Mivel sajnos elég kevés szerkesztő alapértelmezett viselkedése ilyen, és csupán a szofisztikáltabb editorokban van mód ezt a kívánalmat elérni, célszerű a szóköz alapú indentelés mellett letenni a voksot, ha másképp nincs elrendelve. Bár így vesztünk a kód formázottságának rugalmasságából, az eltérő beállítások okozta ütközéseket viszont messze elkerüljük.