fel
le

Partial Class

Gyakori az az eset, amikor valamely objektum-osztályunk kódját érdemes két (vagy akár több) részre is bontani. Az egyik rész az, amit a programozó effektíve kódol, a másik (további) részeket azonban valamely segédprogram, tervező eszköz generál.

Ilyen eset például, amikor Windows Forms jellegű projectet készítünk. Ekkor egy vizuális felületen megtervezzük a form kinézetét, nyomógombokat, listákat, címkéket adunk a form-hoz. Mivel a form maga is egy objektum-osztály, az ilyen elemek hozzáadása gyakorlatilag új példányszintű mezők készítését jelenti. Ezen mezőket nem oly módon adjuk az osztályhoz, hogy begépeljük, hanem a tervezőfelületen behúzzuk a form elemet (gomb, checkBox, stb), és a tervező felület maga írja bele a forráskódba az új mezőt. Ha letörlünk egy korábban hozzáadott elemet, akkor kitörli a mezőt az osztály kódjából.

Másik eset, amikor az osztály interface részét valamely külső, pl. UML tervezőeszközzel készítjük el, amely az osztály forráskódjának egy részét a terv alapján generálja, aktualizálja.

Hasonló az eset, amikor valamely szabványos interaface leíró nyelven (IDL = Interface Description Language) elkészített leírás alapján például egy parancssori program legyártja az objektum-osztály vázát.

A fenti esetek mindegyikében az a közös, hogy a programozótól független módon az osztály forráskódjának egy része generálódik. A programozó ezután az osztályt tovább bővíti, property-ket, metódusokat ír, saját kiegészítő mezőket vesz fel, kitölti a generált metódusok belsejét kóddal, stb.

A gond az, hogy ezen két tevékenység a gyakorlatban sűrűn váltja egymást. Vagyis kód generálása, programozó kódolás, újragenerálás (módosítás), további kódolás, újra a kód módosítása az külső eszköz által, stb.

Hasonló a szituáció, ha az osztály forráskódját több programozó egymással párhuzamosan írja. Nyilván nehezen megoldható, hogy fizikailag ugyanazon file-ba írják a kódrészeket, hiszen egy mentés során az editorok általában az egész file-t mentik el, így egymás munkáját zavarnák, semmisítenék meg a programozók minden egyes mentéskor.

Gyakori probléma az, hogy ennek során a külső eszköz már nem igazodik el teljes mértékben a programozó által módosított kódon, nem tudja a saját korábbi tevékenységét minden esetben megismerni, és az újrageneráláskor azt eltávolítani, hogy újra belerakhassa a módosított sorokat. Vagyis a külső eszköz kódolás közbeni többszöri használata a kód összezavarodásához, esetleg a programozó által beleírt kód elvesztéséhez, kitörlődéséhez vezethet.

A fenti zűrös szituációt könnyebb kezelni akkor, ha az adott programozási nyelv támogatja az "egyetlen objektum-osztály forráskódjának tárolását fizikailag több különböző file-ban" technológiát, vagyis a partial class fogalmát.

Partial Class a gyakorlatban

A partial class készítése során az objektumosztály forráskódját több különböző file-ban tartjuk.

// teglalap1.cs
partial class Teglalap
{
    protected int A,B;
    public int terulet
    {
      get
      {
        return A*B;
      }
    }
}
 

Valamint például:

// teglalap2.cs
partial class Teglalap
{
    public Teglalap(int aOldal, int bOldal)
    {
      this.A = aOldal;
      this.B = bOldal;
    }
}
 

A két forráskód külön-külön nem feltétlenül lefordítható, nem feltétlenül helyes szintaktikailag. A partial szó ebben az esetben arra figyelmezteti a fordítóprogramot, hogy ezzel ne is próbálkozzon, hanem helyette a project összes forráskódjába nézzen szét, hátha valamelyikben még találkozik ugyanezen osztály egy másik darabkájával. Amennyiben igen - úgy a darabokat olvassa egybe, és csak utánna kezdjen el fordítani. Együtt a teljes osztály kódja már értelmes lesz (ha mégsem, akkor a megfelelő helyeken szintaktikai hibákat fog jelezni a fordító természetesen).

Partial Class jelentősége

A fenti technológia lehetővé teszi, hogy az ilyen jellegű problémákat úgy kezelje a programozó, hogy például a külső "kódgeneráló" eszközök által készített, generált kódot fizikailag másik file-ban tárolja, és az eszköz újbóli használata során csak ezen file fog módosulni. Így nem keverednek össze a generált, és a kézzel írt kódrészletek, nem fordul elő, hogy az eszköz újbóli használata összezavarja, vagy esetleg ki is törli valamely kézzel írt kód sorait.

Természetesen, arra ügyelni kell, hogy a teljes project fordításakor a partial class minden egyes része rendelkezésre álljon már! Valamint ügyeljünk arra, hogy a partial class minden része ugyanabban a névtérben helyezkedjen el!

Hernyák Zoltán
2013-03-17 18:47:34