OOP tervezési módszerek

Dobra Gábor · 2020.02.09.

Jegyzet 11. fejezet: OOP tervezési módszerek

A 9. fejezetben bemutattuk, hogyan és mi alapján érdemes a kódot osztályokra bontani, és az egyes osztályok között mikor milyen kapcsolatot érdemes kialakítani. Ezek elsősorban azt szolgálták, hogy az OO alapelvei ne sérüljenek.

A jegyzetben bemutatott alapelvek mellett sok más, sokszor specifikusabb OO elvet, tanácsot, heurisztikát, stb. szoktak megfogalmazni. Ezekkel részletesebben a Szoftvertechnológiák, a Szoftvertechnikák és az Objektumorientált szoftvertervezés tárgyak foglalkoznak.

Azonban egy-egy osztályhiearchia megtervezésekor - a már megismert elveket betartva - magunktól is kialakíthatunk olyan osztályokat, megoldásokat, amik más problématerületen is felbukkannak. Például szembetűnő hasonlóságokat figyelhetünk meg rajztáblák, fájlok és mappák, XML dokumentumok, matematikai kifejezések, és még számos más példa UML diagramján is. Ezek jól felismerhető mintázatokat alkotnak, amelyeket ha egyszer megértünk, másodszor már nem kell újra kitalálnunk, csak alkalmaznunk.

Angolul az ilyen mintázatokat design pattern-nek, a kisebb technikákat idiom-nek hívják. Igen nagy irodalmuk van, többnyire az alkalmazott nyelvtől függetlenek, de akadnak köztük olyanok, amelyek a menedzselt nyelvek (Java, C#, Python, stb.) világába jobban illeszkednek, és olyanok is, amelyek csak C++-ban értelmesek.

Ebben a fejezetben néhány ilyet mutatunk be, amikbe akár egy nagyházi-méretű programban is belefuthatunk. A kimerítő ismertetésük feladatát meghagyjuk a fent felsorolt tárgyaknak.

1. Doboz-macska, avagy a composite pattern

Terv

Fájlok és mappák

InfoPy szorgalmi: du – disk usage

A Unix du nevű programja egy adott mappa összes fájljának méretét adja – vagyis annak a helyfoglalását. Természetesen ebbe beleszámít az abból nyíló további mappák tartalma is rekurzívan.

Egy adott mappában indítva a program kimenete az alábbihoz hasonló. Az egyes sorok az almappák méreteit mutatják, az utolsó sor pedig a végösszeget.

10458   ./path-converter/src
16334   ./path-converter
273896  ./less.php
66718   ./tfpdf
61875   ./parsedown
4602    ./minify/src/exceptions
81707   ./minify/src
5083    ./minify/data/js
9179    ./minify/data
6659    ./minify/bin
105364  ./minify
32534   ./gettext/src/utils
25129   ./gettext/src/generators
33703   ./gettext/src/extractors
145666  ./gettext/src
173477  ./gettext
701760  .

A feladatod egy olyan rekurzív függvényt írni, amely képes arra, hogy a paraméterként adott nevű mappa méretét, vagyis az abban tárolt összes fájl, és az abból nyíló almappák összes fájljainak méretét meghatározza.

  • 1 pontért: írd meg a függvényt, amelyik a teljes összeget tudja meghatározni. A fenti példában ez a legalsó szám.

  • 2 pontért: olyan programot írj, amelyik a részletes listát is előállítja. Ez lényegében a fenti példa kimenet egészének előállítását jelenti.

Segédletként lásd a fájlkezelésről szóló írás alját, ahol a mappákról van szó! Az os.walk() függvényt ne használd – a feladat lényege az, hogy te magad megoldd a számlálást.

2. Non-Virtual Interface

Mappaszerkezet print indentalassal, ahol kezdetben indent = 0.

3. Proxy objektum

Remote fájl? Érték szerint kezelhető mappa?

4. Visitor pattern

Mappaszerkezet műveleteiből gyakran lesz új, típusokból ritkán.

5. Virtuális "konstruktorok"

Ez inkább alakzatos példa, clone().

6. Heterogén kollekció perzisztenciája

Extra írás van róla.

7. C++11 sarok: override és final