C# ja osalised klassid
05.06.2008 | Gunnar
.Net 2.0 tõi endaga uuenduse, millel nimeks partial classes ehk siis osalised klassid. See tähendab seda, et arendajad saavad sama klassi koodi jagada mitmesse faili laiali. Osalised klassid võivad olla väga kasulikud, kuid neid annab väga hästi kasutada ka selleks, et eneselegi teadmata rikkuda süsteemi tehniline disain.
Visual Studio kasutab osalisi klasse kohana, kus hoida erinevate disainerite koodi. Näiteks Windows'i vorme defineeriv kood kirjutatakse automaatselt eraldi faili, mitte sellesse, kuhu programmeerija oma vastava klassi koodi kribab. See on hea näide sellest, kuidas osalisi klasse saab kasutada ka selleks, et erineva funktsionaalsusega osi klassi piires eraldada.
Mis juhtub peale kompileerimist?
Vaatame korra lihtsat osalist klassi, mis koosneb kahest järgmisest osast, mis ei tee antud juhul mitte midagi vajalikku ega olulist.
{
public void MethodA()
{
Console.WriteLine("I am A!");
}
}
public partial class PartialClass
{
public void MethodB()
{
Console.WriteLine("I am B!");
}
}
Muide, need osad võivad asuda ka samas failis. Eeltoodud näide Visual Studio pealt ei tähenda seda, et osad peaksid rangelt erinevates failides asuma.
Kui me püüame koodis osalise klassi põhjal objekti luua ja uurime selle objekti meetode, siis näeme ekraanil midagi sellist.

Nagu näeme, on olemas meetodid mõlemast osast ning neid ei erista meie jaoks IntelliSense mitte kuidagi. Kas ta peaks? Ei pea, kuid näiteks laiendusmeetodite korral ta eristab. Tuleb märkus ette, et on (extension).
Kompileerime selle koodi kokku ja vaatame, mis me osalisest klassist järgi jäi. Ehk siis - kas osad säiluvad või on neid kompileeritud koodis võimatu eristada. Klassi vaatame Reflectoriga. Tulemuseks saame midagi sellist.

Näeme, et mingeid osi meil enam alles pole ja kompilaator on meile loonud osadest kokku ühe klassi.
Kihiline arhitektuur ja osalised klassid
Üks võimalus osaliste klasside väärkasutamiseks on kihilise arhitektuuri valdkonnast. Ikka ja jälle tehakse üllaid katseid luua äriklassid sellised, et klassi iga osa kuulub erinevasse kihti. Seejuures jagatakse klass kihtidele vastavateks osadeks.
Kui nüüd mõelda sellele, et kompileerimise järel on tegemist ühe ja sama klassiga, siis on tulemuseks see, et arhitektuuri mõttes on süsteem kihiline ainult paberitel ja lähtekoodis. Seega kihilise arhitektuuri eeliseid see kood ei kasuta, sest see pole lihtsalt kihiline arhitektuur.
Lõpetuseks
Lõpetuseks jällegi nii palju, et enne kui igasuguseid vahvaid võimalusi peale kahe lause lugemist kasutama hakata suurte eesmärkide saavutamiseks, tuleb endale selgeks teha, millega on täpselt tegemist ja mida arvab asjast kompilaator.

06.06.2008 kell 10:14
Heh - plaanisin just järgmisel või ülejärgmisel nädalal teha kirjatüki partial klassidest. Nüüd sa kirjutasid kõik ära
Lisaksin veel, et ise kasutan keerukamatel juhtudel partial klasse suuremate vormide juures koodi paremaks liigendamiseks (so WinForms). Näiteks vormi avanemisel info sisselugemine eraldi faili, kuid jättes need samasse klassi jne. Visual Studio abil ringi liikudes erilist vahet ei ole, samas ei teki mõttetuid hiidfaile.
06.06.2008 kell 10:26
Jep, koodi parem organiseerimine osaliste klasside peamine point ongi
06.06.2008 kell 11:43
Just. Ja mitte peamine, vaid ainus, imho. Aga paljud pole sellest aru saanud (/me vaatab 1300-realist .cs’i ülevõetud projektis).
06.06.2008 kell 11:58
Teine kontekst, mis muidugi samasse potti suures plaanis läheb, on automaatselt genereeritud kood.
25.04.2012 kell 13:24
Seda teemat saaks ju veel rohkem harutada, kuidas saaks mitu programmi panna mitmetes classides tööle nii, et tekst ja numbrid jääksid ekraanile.