Örvitinn

Ungverskur ritháttur

Það er merkileg upplifun fyrir forritara að koma inn í nýtt umhverfi. Þurfa að aðlaga vinnubrögð sín að því þar er gert, því það skiptir miklu máli í hugbúnaðargerð að hópurinn temji sér sömu vinnubrögð. Oft finnst manni maður vita betur, og það getur jafnvel verið satt, en það skiptir ekki máli. Maður á að temja sér þau vinnubrögð sem fyrir eru. A.m.k. fyrst um sinn :-)

Ungverskur ritháttur í forritun felst í því að tegund breytu sé hluti af nafni hennar.
Í gamla daga var forritunarmálið C ekki strangt tagað og því lentu menn oft í vandræðum þegar þeir notuðu ranga tegund breytu. Forritin þýddu og allir voru glaðir en í keyrslu fór allt til andskotans og enginn vissi hvað var að.

Ungverjinn Charles Simonyi fann upp á því að skrifa týpuupplýsingar með lágstöfum fremst í breytunafni til að koma í veg fyrir svona villur. Simonyi var síðar forritari hjá Microsoft og innleiddi ungverskan rithátt þar. Þessi ritháttur er því notaður meðal annars í win32 apanum.
Dæmi um ritháttinn er að setja i fremst í breytu ef hún er integer, f ef hún er float, d fyrir double, s fyrir strengi og p fyrir benda.

int iFjoldi = 3;
string sNafn = "Jói";
float fHaed = 1.80;
double dSull = 0.0;
string* psNafn = &sNafn; // bendir á streng

Kosturinn við þetta er að ef maður kann að lesa hann þarf maður ekki að velkjast í vafa um tegund hverrar breytu. Maður sér það strax á nafninu hvort um er að ræða streng, heiltölu eða bendi. Þar með er það upp talið.

Gallinn er að kóði verður að mínu mati ljótur. Ég get bekenað notkun á þessu í C fyrir nokkrum árum, en meira að segja C er orðið þokkalega tagað og allir almennilegir þýðendur benda á það þegar rangar týpur eru notaðar. Vissulega er hægt að cast-a sig framhjá slíkum villuboðum þýðenda, en menn verða líka að cast-a á eigin ábyrgð.

Ég kýs að nota frekar lýsandi breytuheiti, þar sem tilgangur breytunnar en ekki tegund kemur fram. Auk þess veit maður aldrei hvenær týpan breytist, int í dag er kannski double á morgun og klasi daginn eftir.
Það er góð regla að nota lengri og meira lýsandi breytunöfn því stærra sem scopa breytunnar er. Ef maður er að nota teljara í for lykkju er ekkert að því að nota eins stafs nafn. Ef maður er aftur á móti að skilgreina breytur sem eru víða sýnilegar (t.d. global breytur) skal nota langt og lýsandi nafn.

Í alvöru forritunarumhverfi sér maður týpuupplýsingar breytu með því að setja bendilinn yfir hana. Ef það virkar ekki getur maður hægri smellt og farið að skilgreiningunni. Yfirleitt dugar að slá inn nafn breytu og setja punkt eða pílu (->) fyrir aftan til að fá upptalning á öllum aðgerðum í klasanum. Og þá komum við að einum versta gallanum á ungverska rithættinum. Ef það er búið að klessa týpuupplýsingum fyrir framan nafnið á öllum breytum raðast member breytur ekki lengur eftir nafni. Ef ég veit að klasi hefur aðgerð eða breytu sem skilar/inniheldur upplýsingar um nafn er líklegt að ég skrifi einfaldlega breyta.n og fái þá upp lista af öllum aðgerðum/breytum sem byrja á n. Ef aftur á móti er búið að setja str eða s fyrir framan nafn allra strengja þarf ég fyrst að giska á týpuna áður en ég leitað að breytunni.

Þó ég sé á móti því að nota ungverskan rithátt eru undantekningar á reglunni. Ég tel t.d. skynsamlegt að auðkenna member breytur með því að setja m fyrir framan nafnið og s fyrir framan nöfn static breyta.

Þetta segir Stroustrup um ungverskan rithátt

Hungarian notation - a coding convention that encodes type information in variable names. Its main use is to compensate for lack of type checking in weakly-typed or untyped languages. It is totally unsutable for C++ where it complicates maintenance and gets in the way of abstraction.

Reyndar er Stroustrup enginn Gvuð, en ég tek mark á honum þegar hann tjáir sig um C++ forritun. Ef ég réði einhverju væri búið að banna ungverskan rithátt með öllu. En ég ræð engu :-)

Annað sem ég vildi sjá oftar er að menn noti namespace í C++. Ef þú ert með fyrirtæki sem heitir Bifreiðaverkstæði Badda, ekki setja BB fremst í nafn allra klasanna þinna. Namespace eru til staðar í málinu, þau á að nota. Það er svo agalega ljótt þegar búið er að troða einhverri stafasúpu fyrir framan öll tegundarnöfn í kóða og það hljóta allir að vera sammála um að fegurðu kóða skiptir miklu máli :-)

class BBBill{}; // ekki svona
namespace BB { class Bill{}; } // heldur svona

forritun