A Symbian C++ programozási nyelv

Nyelvi elemek, elnevezési konvenciók

Bevezetés

Alapvetően támaszkodhatunk a fejlesztők C/C++ ismeretére. Az elsődleges cél tehát a különbségek ismertetése, melyek leginkább a környezet és a hardver különbségéből adódnak. Gondoljunk csak arra, hogy egy PC-hez képest a telefon memóriája, processzora, megjelenítője mérföldekkel kisebb, de ettől függetlenül párhuzamos folyamatok futnak akár hetekig-hónapokig hibátlanul, amihez olyan alapkonvenciókra van szükség, melyek ismerete még a számítógépen való programozás számára is irányadó lehet.

A Symbian estében az elnevezés nem a sok helyen használt „Hungarian notation” vagy valamilyen más elnevezés alapján történik, hanem a változók, osztályok, metódusok legtöbbször a memóriakezeléssel kapcsolatban kapják az első kezdőbetűjüket, illetve a záró egy-két betűjüket. A makrók, konstansok és felsorolástípusok elnevezése csak a megkülönböztetésük megkönnyítésére szolgál.

Ezek a konvenciók nem csak azért jók, mert egységesítik a kódírást és kódolvasást a Symbian jellegű programokban, hanem a jelölések segítéségével figyelmeztethetjük magunkat arra, hogy a létrehozott objektumra milyen memóriakezelési és egyéb konvenciókat akarunk alkalmazni. Így a növelhetjük a tesztelhetőséget, átláthatóságot és a karbantarthatóságot.

Elnevezési szabályok:
• Az osztályok nevei főnevek
• A függvények nevei igék
• A nevek általában nagybetűvel kezdődnek, de elé kerülhet megállapodás alapján még egy betű (kezdőbetű), illetve a szó végére egy-két megállapodás szerinti záróbetű.
Ezen szabályok alól kivételek pl. a lokális változók és makrók.
Természetesen, ezen szabályokat nem ellenőrzi a fordító, de a symbian programozok szemében, ezek általánosan elterjedt, "szabvány" elnevezések.

Osztályok

A Symbian platformon alapvetően négy osztályt különböztetünk meg: a T, a C, az R és az M osztályt. Ezen osztályok elnevezései az alaptípusokból erednek: T = Type, C = Class, R = Resource és M = Mixin.

T osztályok

Ezek az osztályok egyszerű típusokat foglalnak magukba. Az ilyen egyszerű, valamilyen értéket reprezentáló osztályok nem rendelkeznek semmilyen külső objektummal illetve erőforrással, ezért destruktoruk sincs. A legtöbb esetben konstruktoruk sincs, vagy az csak a tagváltozókat inicializálja. A tagváltozók is legtöbbször T osztályok, vagy beépített egyszerű típusok. (A C++ összes alaptípusának van megfelelő T osztálya, például Tint.) Értékadó operátorra és másoló konstruktorra sincs szükség, mert a C++ alapértelmezett műveletei (bitről bitre lemásolás) az ilyen egyszerű típusokhoz megfelelőek.

Memória kezelés szempontjából az ilyen típusú objektumok a Stack-en foglalnak helyet, mint lokális változók vagy, mint függvény paraméterek. Ezért lehetséges az, hogy destruktor nélkül semmisülnek meg. Természetesen más osztályok tagváltozói is lehetnek a T osztályok.

C osztályok

A T osztályok mellett a leggyakrabban használt osztálytípusok. Ezek az osztályok valamilyen osztály-hierarchia részei, amelyek képviselik a bonyolultabb funkcionalitást. Az összes C osztály közvetlenül, vagy más C osztályon keresztül a CBase osztályból származik. Birtokolhatnak más objektumokat, ezért fontos nemcsak a saját, de a birtokolt erőforrások felszabadítása(destruktor). Ezek az objektumok példányosítása két fázisból áll a memóriszivárgások elkerülése miatt. Virtuális destruktorral kell rendelkezniük.

Mivel mindenképp szükség van a destruktor hívására, ezért nem a Stack-en, hanem a Heap-en tárolódnak az ilyen osztályok, és a new kulcsszó segítségével inicializálhatók. Itt minden esetben meg lehet oldani a felszabadításukat. Mivel függvényeknek mutatóként vagy referenciaként adjuk át őket, többnyire nincs szükség másoló konstruktorra vagy értékadó operátorra.

R osztályok

Ezek az osztályok erőforrásokat reprezentálnak, vagyis valamilyen szerver szerepű program által birtokolt erőforrásokra tartalmaznak azonosítót. Ha egy erőforrásra szükségünk van, akkor egy R osztállyal tudjuk ezt jelezni a tulajdonos felé. Itt sincs szükség másoló konstruktorra és értékadó operátorra a fentebb említett okok miatt. Valamint konstruktor és destruktor helyett valamilyen lefoglalás (Open, Create, Allocate) illetve felszabadítás (Close, Destroy, Free) jellegű művelettel rendelkeznek.

A Stack-en tárolódnak, mivel csak az erőforrás azonosítására alkalmasak, magukat az erőforrásokat nem tartalmazzák. A felszabadításról gondoskodni kell, hiszen egy külső erőforrással állnak kapcsolatban, de ez az erőforrást birtokló objektum dolga. Ha elmaradna a felszabadítás, akkor általában a lefoglaló szál futásának befejezésekor megtörténik. Az R osztályoknak nincs közös ősosztálya.

M osztályok

Ezek az osztályok a C++ absztrakt osztályainak felelnek meg (általánosságban objektumorientált szemléletben interfésznek feletethetőek meg). Nem tartalmaznak tagváltozókat, konstruktort, destruktort és felüldefiniált operátorokat. Csak virtuális metódusokkal rendelkeznek, melyeknek legtöbbször az implementációja is hiányozhat. Az ilyen osztályok célja nem a példányosítás, hanem az objektumorientált szemeléletben is megszokott, "interfész-feladat", azaz az egyszeres öröklődés. A C++ nyújtotta többszörös öröklődéssel szemben a symbian konvenciók "tiltják" a többszörös öröklődést. Egy C osztálí egy C sztályból és tetszőleges számú M osztályból ("interfész") örökölhet. Ezek a logikus megkötések, például a JAVA programnyelvben már nyelvi szinten is jelen vannak.

Kivételek, egyéb osztályok

Találhatók természetesen egyéb osztályok is. Az S betűvel kezdődő osztálynevek általában tagfüggvény nélküli struktúrák(, de az újabb kódok ezeket is T osztályként kezelik). A statikus osztályok nem használnak kezdőbetűt, ilyenek például a User, Math, Mem. H betűvel csak a HBufC osztály kezdődik (gyakran használt osztály), illetve D betűvel kezdődnek az egyes kerneloldali C osztályok, de ezek használata ritka.

Egyéb típusnevek lehetnek a struktúrák, felsorolásitípusok, konstansok és makrók, bár ez utóbbi nem teljesen ide tartozik.

A struktúrák valójában egyszerű típusok, nem tartalmaznak másik objektumot, nincs szükségük destruktorra, így igazából T osztálynak felelnek meg.

A felsorolások is ezek alapján tekinthetők T osztálynak, de tagjaik E betűvel kezdődnek, ezzel is utalva az enum kulcsszóra. a felsorolási típusokat általában célszerű abban az osztályban dekralálni, ahol felhasználjuk, ezzel elkerülhető a globalitás, a felesleges globális változók használata.

A konstansokat egységesen célszerű K betűvel kezdeni, míg a makrókat csupa nagy betűvel írjuk (C++ hagyományokhoz híven).

Változók

Álalában a szerepük alapján kapnak kezdőbetűt. A tagváltozók kis i betűvel kezdődnek. A függvények argumentumai a betűt kapnak. A lokális változók nem kapnak kezdőbetűt, míg a globális változók (célszerű kerülni a használatukat) nagy kezdőbetűvel írandók.

Metódusok

A metódusok az általuk végzett műveletek alapján kapnak nevet. A tagváltozót beállító műveletek pedig a Set előtagból és a tagváltozó "i" betű nélküli nevéből, amíg a lekérdező metódusok vagy előtag nélküli tagváltozónevekből, vagy a Get előtaggal kiegészített tagváltozónevekből (ez utóbbi utal arra, hogy valamilyen bonyolultabb lekérdezésről van szó) kapnak nevet. Például az iPicture tagváltozóhoz a Picture lekérdező és a SetPicture beállító metódus tartozhat.

A metódusok nevének végződése jelzi, hogy milyen hibát okozhat, azaz milyen kivételt válthat ki, illetve az is kiolvasható, hogy dinamikusan lefoglalt objektumot milyen módon kell felszabadítani. Tehát a kivételt okozható függvények (akár közvetlenül, akár közvetve egy másik függvény hívásán keresztül), L betűvel jelzik ezt. (Az L betű a C++ kivételeknek megfelelő Symbian-beli "leave" szóra utal.) Ha kétfázisú konstruktorról van szó, akkor LC-re végződik, ha pedig a metódus az erőforrás tulajdonjogát és megsemmisítését is átveszi, akkor LD-re végződik.