SzoftTechVizsga100525
1. Definiálja és jellemezze a .NET szerelvény (assembly) fogalmát (szerepe, típusai, azonosítása) (12p)
Funkciók fizikai egysége. Általában egy .dll vagy egy .exe fájl (de lehet több is). Minden alkalmazás szerelvényekből épül fel. Az egymás-melletti futás alapegysége (ugyanabból a szerelvényből több verzió is futhat).
Magában foglal:
- metaadatokat a szerelvényről (manifest)
- metaadatokat a .NET osztályokról
- erőforrásokat
Típusai:
- privát - egyetlen alkalmazás használja, neve azonosítja, az alkalmazás mappáiban keresi
- azonosított (strong named)
- erős név teszi egyedivé
- csak azonosított szerelvényekre hivatkozhat
- több alkalmazás használhatja
- DLL Hell problémára megoldás
- integritás védelmet nyújt (digitálisan aláírható szerelvények)
Erős név: név + fejlesztői cég nyilvános kulcsa + verziószám [+ nyelv és kultúra]
2. Ismertesse a C# nyelv attribútum (Attribute) fogalmát! Mutasson kódrészletet az alkalmazására (csak az alkalmazásra, lekérdezésre nem)! (12p)
Az attribútumok segítségével deklaratív jelleggel metaadatokat közölhetünk a kód bizonyos részeire vonatkozóan. Az attribútum is tulajdonképpen egy osztály, amit hozzákötünk a program egy megadott eleméhez (típushoz, osztályhoz, metódushoz...). Az attribútumok a program futása közben is kiolvashatók, általában a CLR számára szeretnénk információkat közölni a segítségükkel.
Alkalmazási példa:
[Serializable] // jelezzük hogy az osztály sorosítható (ez egy attribútum) class User { string name; [NonSerialized] // jelezzük, hogy ezt a mezőt nem szükséges sorosítani string password; ... }
(szerintem ennyi elég példának)
3. Eseményvezérelt programozás és grafikus megjelenítés
- a) Ismertesse röviden az érvénytelen terület fogalmát! Hogyan kapcsolódik ez a Paint eseményhez? (7p)
- b) Írjon olyan C# nyelvű alkalmazásrészletet, ami a (20, 20) koordinátában megjeleníti, hogy a legutóbbi egérkattintás óta hány másodperc telt el! (Lehetett használni egy TimeDiff nevű függvényt, aminek 2 db DateTime a bemenete és visszaadja szöveges formában, hogy hány mp telt el. DateTime.Now-val kellett lekérni a jelenlegi időt). A megjelenítés GDI-re épüljön (nem használhatja a Label, Textbox, stb. vezérlőket). Csak a megoldáshoz sorosan kapcsolódó kódrészeket adja meg! (8p)
a) Érvénytelen terület: korábban takarásban lévő, láthatóvá vált ablakrészek. Mivel a memória korlátok miatt, az OS nem jegyzi meg az ablakok rajzolatát, így az érvénytelen területeket újra kell rajzolni. Amikor egy érvénytelen terület keletkezik, akkor WM_PAINT üzenetet kap az ablak (natív Win32), ami a Paint eseménynek felel meg.
b) Ha nincsenek megadva a fent említett függvények, akkor a kódrészlet így néz ki:
DateTime lastClick; String strDeltaTime; private void Form1_Load(object sender, EventArgs e) { lastClick = DateTime.Now; strDeltaTime = "0"; } private void Form1_MouseClick(object sender, MouseEventArgs e) { TimeSpan deltaTime = DateTime.Now.Subtract(lastClick); lastClick = DateTime.Now; strDeltaTime = deltaTime.Seconds.ToString(); Invalidate(); // érvényteleníteni kell az ablak területet, hogy az új érték látszódjon (lényegében ezzel "hívjuk" meg az OnPaint metódust) } protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawString(strDeltaTime, this.Font, new SolidBrush(Color.Black), 20, 20); base.OnPaint(e); }
4. Szálkezelés
- a) Hasonlítsa össze a Mutex és a C# Lock zárolási konstrukciókat! (2p)
- b) Meg kell-e valósítani a kölcsönös kizárást az alábbi esetekben? (Indokolja!)
- i) lokális változóhoz való hozzáférés, (2p) (nem)
- ii) a globális heap-en (?) allokált memóriaterülethez való hozzáférés (2p) (igen)
- i) lokális változóhoz való hozzáférés, (2p) (nem)
- c) Jellemezze egy mondatban a ReaderWriterLock osztályt. (2p)
a) Lock: biztosítja, hogy egy adott erőforráshoz/kódrészlethez egy időben csak egy szál férhet hozzá. Mutex: hasonló mint, a lock, viszont folyamatok között is működik. (pl. alkalmazásból csak egy példány futhat)
b) Szerintem: i) a lokális változók nem a szálak közötti kölcsönösen használt memória területen jönnek (hanem a stack-en /?/), tehát nem kell. ii) a globális változók a heap-en jönnek létre, így azok a szálak között közösen elérhető erőforrás, így meg kell valósítani a kizárást.
c) Olyan kölcsönös kizárási megoldás, mely az adott erőforráshoz olvasási hozzáférést egyszerre több olvasónak is engedélyez, de íróból csak egyet. (az író kizárja az olvasókat is)
5. Rajzoljon fel példát egy-több (1:n), több-több (m:n) relációkra (osztálydiagram), és írja fel, milyen táblákba képezné le őket! (12p)
6. Tervezési minták
- a) Adja meg röviden, hogy miben és hogyan segítenek a tervezési minták a tervezés során! (3p)
- b) Jellemezze a "Adapter" tervezési mintát! Mire ad megoldást a "Adapter" tervezési minta? Mutassa be konkrétan vagy egy példán keresztül a minta működését (vagy a class adaptert vagy az object adaptert, mindkettőt ne)! Ezen felül rajzolja fel a minta osztálydiagramját, valamint adja meg a mintában szereplő osztályok szerepét! (10p)
a) A tervezési minta leír egy gyakran előforduló problémát, annak környezetét és a megoldás magját, amit alkalmazva számos gyakorlati eset megoldható. A tervezési minták a fejlesztés tervezés fázisában segítenek a következő esetekben:
- megfelelő objektumokat megtalálni, definiálni (tervezés során nem minden objektumot kapunk triviálisan a szöveges leírásból /szoftvertechnológián tanult módszerek/)
- újrafelhasználás
- változtathatóság, kiterjeszthetőség
b) Adapter
Cél: egy osztály interfészét olyan interfésszé konvertálja, amit a kliens vár. Lehetővé teszi olyan osztályok együttműködését, melyek egyébként az inkompatibilis interfészek miatt nem tudnánk együttműködni.
Példa: egy Grafikus editor működése közben a képernyőre lehet rajzolni a következő grafikus alakzatokat, melyek a Shape osztályból származnak: LineShape, PoligonShape. Szeretnénk továbbá egy TextShape alakzatot is. Ennek a megírása bonyolult, viszont a használt keretrendszerünk rendelkezik egy TextView osztállyal, mely hasonló funkciókat valósít meg, mint ami nekünk a TextShape -hez kellene, viszont nem tudjuk egy-az-egyben hasznát venni, mert nem implementálja a Shape osztályt (nem kompatibilis). Megoldás: adapter minta használata. Felveszünk egy Shape -ből származó TextShape osztályt, melynek metódusai megfelelnek az elvártnak (nyilván, hiszen a Shape -t implementáljuk). A TextShape osztály tartalmaz egy referenciát egy TextView objektumra, és a megfelelő metódushívásokat ezen keresztül delegálja a TextView osztálynak.
Az ábrán szereplő osztályok és szerepük:
- az Adapter tartalmaz egy pointert vagy egy referenciát az Adaptee-re
- az adapter delegálja a művelet végrehajtását az Adaptee-re
- a Target osztály, aminek meg kell felelnünk
7. Ismertesse az MVC (Model-View-Control) vagy a Dokumentum/Nézet (Document-View) architektúrát. Ennek keretében rajzolja fel a minta osztály és szekvenciadiagrammját. Adja meg az egyes osztályok szerepét! (14p)
Document-view architektúra
Az architektúra 2 szereplője: Document és View. A Document feladata az adatok tárolása és menedzselése. Olyan osztályok mely, az adatokat a tagváltozóikban tárolják, és olyan tagfüggvényekkel rendelkeznek, melyek kezelik ezeket az adatokat és elérhetővé teszik más osztályok számára. A View feladat az adatok megjelenítése, a Document adatai alapján. A felhasználói interakciók során általában a nézet a dokumentum tartalmát módosítja; általában egy tab-fülként vagy egy ablakként jelenik meg. Elve: az adat megjelenítésért és annak kezeléséért felelős kód szétválasztása 2 részre.
A szekvencia diagram úgy néz ki, hogy a Document példány kap egy UpdateAllViews() metódus hívást, mire az sorra meghívja View példányok Update() metódusát. Ha felhasználói interakció történik, akkor a View is tud jelezni a Document felé (setData()) /?/.
MVC architektúra
Alapigazság: de drótozzuk be a GUI-ba az alkalmazás logikát. Szereplők: Model (alkalmazás logika), View(megjelenítés) és Controller(interakció - kommunikáció a felhasználóval).
Modell: tartalmazza az adatokat, valamint olyan műveleteket, melyek ezeken az adatokon dolgoznak.
View: megjeleníti az adatokat. Az adatokat a modellből olvassa ki, nem ő tárolja azokat. Tartalmazhat olyan adatokat, ami csak a nézetre vonatkozik (pl. Zoom értéke)
Controller: A felhasználói interakciót kezeli. Felhasználó által keltett események, melyek ezen keresztül a modellt vagy a viewt hívják.
Observer: ha egy controller megváltoztatja a modellt, akkor a modell valamennyi view-t és controller-t értesít, hogy frissítsék magukat a modellből. Ez garantálja a konzisztenciát.
Ehhez nem találtam szekvencia diagramot, csak szöveges leírást:
- A controller kezeli az eseményeket
- A controller értesíti az eseményről a modellt
- A modell értesíti a változásról a view-(ka)t
- A view/view-ek lekérdezi(k) a modell állapotát és az alapján frissül(nek)
8. ASP.NET kiszolgáló oldali vezérlők (jellemzők, szerepük, működésük, példakód) (14p)
A felületelemek megjelenítéséért és viselkedéséért felelnek. Feldolgozzák a kliens oldalról érkező adatokat (pl. gomb nyomás esemény, elérhetővé teszik a böngésző által küldött felhasználói adatokat). Generálják a kliensnek küldendő HTML kódot (minden HTML kódra képződik le).
pl. TextBox létrehozása:
<asp:TextBox ID="tID" runat="server"></asp:TextBox>
- tID névvel lehet elérni a mögöttes kódból (.NET objektum)
- aspx fájlból HTML kódok segítségével testre-szabható a megjelenésük
Működés:
- első lekéréskor lefordul az aspx és a code-behind fájl egy temp könyvtárba DLL formájában
- a lefordított kód feldolgozza a bejövő kérést és előállítja a választ
- későbbi kéréseket a már lefordított kód szolgálja ki
-- KoczkaTamas - 2010.05.25.
-- pepe - 2011.05.30.