Õpetus C# ja .NET programmeerimise ja disaini kohta
See õpetus tugineb antud materjalidele, käsitledes selliseid teemasid nagu disainimustrid, objektorienteeritud programmeerimine (OOP), liideste ja abstraktsete klasside kasutamine ning C# keele ja .NET platvormi eripärad.
——————————————————————————–
Teadmiste test
Vasta järgmistele küsimustele, kasutades antud allikatest pärit teavet. Iga vastus peaks olema 2-3 lauset pikk.
- Mis on disainimustrid C# arenduse kontekstis?
- Mis on liidese ja abstraktse klassi põhiline erinevus vastavalt vanemate inseneride “mentaalsele mudelile”?
- Millised on osalise modifikaatori kasutamise põhireeglid C# klasside puhul?
- Milline on konstruktori roll klassis ja kuidas see erineb destruktorist?
- Kirjeldage kaitstud sisemise juurdepääsu modifikaatori omadusi.
- Millised on klasside ja struktuuride peamised erinevused andmetüüpide ja mälu osas?
- Mis on transitiivne pärimine .NET-is?
- Milliseid mustreid identifitseeritakse Gang of Four (GoF) klassifikatsioonis?
- Mis on märksõna “this” eesmärk klassi meetodites või konstruktorites?
- Millised on klassi pärimise piirangud C#-s?
——————————————————————————–
Vastused testile
- Kujundusmustrid on korduvkasutatavad lahendused tarkvaraprogrammeerimisel tekkivatele levinud probleemidele. .NET-i kursus uurib neid klassikaliste nelja grupi (GoF) mustrite ning C# keele ja .NET-platvormi spetsiifiliste võimaluste abil.
- Liides on “võimete leping”, mis määratleb, mida objekt saab teha, sidumata seda kindla hierarhiaga (“saan-teha” seos). Abstraktne klass on baastüüp, millel on ühine identiteet ja implementatsioon, mis määratleb, mis on objekt (“on-a” seos).
- Kõiki osalise tüübi osi tuleb muuta märksõnaga “osaline” ja neile peab olema kompileerimise ajal juurdepääs, et moodustada lõplik tüüp. Igal osal peab olema sama juurdepääsutase (nt avalik või privaatne) ja see peab asuma samas assembleris ja moodulis.
- Konstruktor on spetsiaalne klassiliige, mille nimi vastab klassi nimele; see käivitatakse automaatselt objekti loomisel, et initsialiseerida selle algväärtused. Destruktorit kutsutakse vahetult enne seda, kui prügikoguja kustutab objekti mälust puhastustoimingute tegemiseks, kuigi .NET-is on destruktorite käsitsi kasutamine harva vajalik.
- Kaitstud sisemise modifikaatoriga klassi liikmed on ligipääsetavad igale koodile samas assembleris, kus nad deklareeritakse. Need on nähtavad ka tuletatud klassidele, isegi kui need klassid asuvad erinevates assemblerites.
- Klassid on viitetüübid ja need eraldatakse heapile, samas kui struktuurid on väärtustüübid ja neid tavaliselt salvestatakse pinule. Mälu eraldamine suurte viitetüüpide jaoks on odavam kui suurte väärtustüüpide jaoks, kuid struktuuride loomine ja kustutamine on kiirem.
- Transitiivsus tähendab, et kui tüüp D pärib tüübilt C ja tüüp C pärib tüübilt B, mis omakorda pärib baasklassilt A, siis tüübi A liikmed on ligipääsetavad tüübile D. Seega võib pärimishierarhia sisaldada paljusid tasemeid, edastades funktsionaalsust allapoole.
- GoF-i klassifikatsioon jagab mustrid kolme põhirühma: loomiselised, struktuurilised ja käitumuslikud. Iga rühm käsitleb kindlat probleemide kogumit, alates objektide loomise mehhanismidest kuni nendevahelise interaktsiooni protokollide määratlemiseni.
- Märksõna „this“ viitab klassi praegusele eksemplarile ja seda kasutatakse selleks, et eristada, millal meetodi parameetritel on samad nimed kui klassi väljadel. Seda kasutatakse ka ühe konstruktori kutsumiseks teisest samas klassis (konstruktori aheldamine) või “sujuva” liidese loomiseks (meetodi aheldamine).
- C# toetab ainult ühe klassi pärimist, mis tähendab, et klass saab pärida ainult ühelt baasklassilt. Klassid saavad aga rakendada piiramatul arvul liideseid, mis võimaldab ületada ühe klassi pärimise piiranguid.
——————————————————————————–
Essee küsimused
Soovituslikud teemad põhjalikuks analüüsiks (vastuseid pole vaja).
- Süsteemi evolutsioon ja versioonimine: analüüsige liideste ja abstraktsete klasside kasutamise eeliseid ja riske avalike API-de ja olemasolevate süsteemide muutmisel.
- Kapseldamine ja turvalisus: selgitage, kuidas juurdepääsumodifikaatorite õige kasutamine aitab luua robustseid tarkvarakomponente ja kaitsta objekti oleku invariantseid variante.
- Paindlikkus vs jäikus: arutage “kompositsiooni pärimise asemel” kontseptsiooni, kasutades näiteid GoF-i disainimustritest.
- Murede eraldamine: osaliste klasside roll tänapäevastes arendustööriistades, nagu lähtekoodi generaatorid ja vormidisainerid.
- Mäluhalduse automatiseerimine: võrrelge ressursihalduse lähenemisviise .NET-is (konstruktorid, finaliseerijad ja deterministlik finaliseerimine) ja nende mõju rakenduste arhitektuurile.
——————————————————————————–
Põhiterminite sõnastik
| Termin | Määratlus |
|---|---|
| Abstraktne klass | Baastüüp, mida ei saa instantsida ja mis teenib tuletatud klasside mustrina, pakkudes üldist identiteeti ja rakendust. |
| Interface | Võimaluste leping, mis määrab meetodite ja omaduste komplekti, mida tüüp kohustub rakendama, piiramata seda konkreetse pärilussuhtega. |
| Konstruktor | Klassispetsiaalne meetod, mis on mõeldud objekti uue eksemplari initsialiseerimiseks. |
| Ligipääsu modifikaator | Võtmesõna (public, private jne), mis kontrollib tüüpide ja nende liikmete nähtavust ning kättesaadavust teiste koodiosade jaoks. |
| Pärimine | OOP atribuut, mis võimaldab määrata alamklasse, mis korduvkasutavad, laiendavad või muudavad vanemklassi käitumist. |
| Objekt (eksemplar) | Konkreetne üksus, mis on loodud klassi põhjal, omades olekut (andmed) ja käitumist (meetodid). |
| Disainimuster | Taaskasutatav lahendus tüüpilisele probleemi, mis tekib tarkvaraarenduse planeerimisel. |
| Prügikoguja (GC) | .NET mehhanism, mis haldab automaatselt mälu eraldamist ja vabastamist, eemaldades objekte, mida enam ei kasutata. |
| Viidetüüp (Reference type) | Andmetüüp (näiteks klass), mille muutujad hoiavad viidet objekti aadressile virnas (heap). |
| UML (Unified Modeling Language) | Ühtlustatud modelleerimiskeel, mida kasutatakse tarkvarasüsteemi komponentide struktuuri ja interaktsiooni visualiseerimiseks (näiteks klassidiagrammide kaudu). |
| sealed (lõpetatud) | Klassimodifikaator, mis takistab sellelt pärimist. |
| virtual (virtuaalne) | Võtmesõna, mis võimaldab tuletatud klassides baas-klassi meetodi ülekirjutamist. |
| static (staatiline) | Modifikaator, mis näitab, et liige kuulub tüübile, mitte konkreetsele objekti eksemplarile. |
| internal | Ligipääsu tase, mis piirab klassi liikme nähtavust praeguse koostamise (.dll või .exe) piires. |
| this | Viide praegusele klassi eksemplarile, milles kood täidetakse. |
| Andmetüüp | Tüübikategooria (Value vs Reference) | Mälu tüüp (Stack vs Heap) | Pärimise tugi | Konstruktorite eripärad | Kasutuse näited ja liikmed | Võtmesõnad ja modifikaatorid | Allikas |
|---|---|---|---|---|---|---|---|
| Klass (Class) | Viidetüüp (Reference type) | Virn (Heap) | Jah (toetab üksikpärimist ühest baas-klassist) | Alati on vaikimisi konstruktor (kui pole määratud teist); konstruktorikõne on kohustuslik; toetab destruktoreid | Väljad, omadused, meetodid, sündmused, konstruktorid, finalisaatorid. Näited: BankAccount, Person | class, public, private, protected, internal, abstract, sealed, partial, static, virtual, override | [1-5] |
| Struktuur (Struct) | Väärtustüüp (Value type) | Pinu (Stack) | Ei (ei saa pärida teistelt klassidelt või struktuuridelt ega olla baas-tüüp) | Ei saa sisaldada konstruktorit ilma parameetriteta (kuni C# 10) ega destruktoreid; toetab parameetritega ja staatilisi konstruktoreid | Koordinaadid (Coords), väikesed andmestruktuurid. Liikmed: väljad, meetodid, omadused. Ei saa olla protected liikmeid | struct, public, private, internal, partial, readonly | [1, 3, 4, 6] |
| Interface | Viidetüüp (Reference type) / Leping | Virn (Heap) (rakendamiseks) | Jah (toetab mitmepärimist) | Ei saa sisaldada konstruktorit ega eksemplariandmeid (välju) | IPaymentGateway, IEmailSender. Liikmed: meetodid, omadused, sündmused, staatilised liikmed, vaikimisi meetodid (C# 8+) | interface, public, internal, partial | [1, 6, 7] |