Përmbajtje:

Si të bëni modelin e dizajnit Singleton në C ++: 9 hapa
Si të bëni modelin e dizajnit Singleton në C ++: 9 hapa

Video: Si të bëni modelin e dizajnit Singleton në C ++: 9 hapa

Video: Si të bëni modelin e dizajnit Singleton në C ++: 9 hapa
Video: Rifaktorimi: Singleton [Modelet e Dizajnit] 2024, Nëntor
Anonim
Si të bëni modelin e dizajnit Singleton në C ++
Si të bëni modelin e dizajnit Singleton në C ++

Prezantimi:

Qëllimi i këtij udhëzuesi udhëzues është të mësojë përdoruesin se si të zbatojë modelin e dizajnit të vetëm në programin e tij C ++. Duke vepruar kështu, ky grup udhëzimesh gjithashtu do t'i shpjegojë lexuesit pse elementët e një beqari janë ashtu siç janë dhe si përpunohet kodi. Duke e ditur këtë, do të ndihmoni në të ardhmen me korrigjimin e beqarëve tuaj të ardhshëm. Cili është modeli i dizajnit singleton? Modeli i dizajnit të vetëm është një model dizajni ku koduesi krijon një klasë që mund të instinktohet vetëm një herë, funksionet publike të klasave në thelb mund të arrihen kudo, me kusht që të keni #përfshirë skedarin e kokës në skedarë të tjerë të lidhur me projektin.

Modeli i dizajnit të vetëm është një model dizajni i domosdoshëm për çdo programues të orientuar nga objekti, programues softuerësh dhe programues lojërash. Modeli i dizajnit singleton është gjithashtu një nga modelet më të lehta të projektimit të kodimit atje. Mësimi i tij mund t'ju ndihmojë të mësoni modele të tjera, më të vështira, të projektimit në të ardhmen. Gjithashtu mund t'ju ndihmojë të thjeshtoni kodin e programit tuaj në mënyra që nuk mendonit se ishte e mundur.

Ndërsa vështirësia e modelit të dizajnit të vetëm është e lehtë kur krahasohet me modelet e tjera të projektimit, ky grup udhëzimesh ka një vështirësi mesatare. Kjo do të thotë që për të bërë këto udhëzime, ju rekomandojmë që të njihni kërkesat themelore dhe të avancuara sintaksore të C ++. Ju gjithashtu duhet të dini etiketën e duhur të kodimit C ++ (dmth. Mbani variablat e klasës private, një klasë për skedarin e kokës, etj.). Ju gjithashtu duhet të dini se si të lironi kujtesën dhe si punojnë konstruktorët dhe shkatërruesit në C ++.

Ky udhëzues udhëzues do të zgjasë mesatarisht rreth 10-15 minuta.

Kërkesat materiale:

-Një kompjuter (mund të jetë PC ose Mac) i aftë për të drejtuar Visual Studios (çdo version)

-Një program i thjeshtë, i krijuar në Visual Studios, me të cilin mund të testoni beqarin tuaj

Shënim: Modeli i dizajnit të vetëm mund të bëhet në çdo IDE mbështetëse C ++ ose ndërfaqe kodimi, por për këtë grup udhëzimesh, ne do të përdorim Visual Studios Enterprise Edition.

Hapi 1: Krijoni klasën tuaj, me skedarin e kokës dhe skedarin CPP

Krijoni klasën tuaj, me skedarin e kokës dhe skedarin CPP
Krijoni klasën tuaj, me skedarin e kokës dhe skedarin CPP
Krijoni klasën tuaj, me skedarin e kokës dhe skedarin CPP
Krijoni klasën tuaj, me skedarin e kokës dhe skedarin CPP

Për të krijuar këto dy skedarë dhe klasën menjëherë, hapni projektin / programin tuaj në Visual Studios, kaloni te eksploruesi i zgjidhjes, klikoni me të djathtën dhe një kuti duhet të shfaqet pranë kursorit të miut, gjeni opsionin "Shto", rri pezull mbi të, dhe një kuti tjetër duhet të shfaqet në të djathtë. Në këtë kuti, dëshironi të gjeni opsionin "Artikulli i ri..", klikoni mbi të dhe duhet të shfaqet një dritare, e ngjashme me imazhin e fotografisë 1.1 më poshtë. Në këtë dritare ju doni të zgjidhni "C ++ Class" dhe më pas goditni "Add". Kjo do të hapë një dritare tjetër që i ngjan imazhit të fotografisë 1.2. Në këtë dritare, ju shkruani emrin e klasës tuaj në fushën "Emri i Klasës" dhe Visual Studios do të emërojë automatikisht skedarin aktual pas emrit të klasës. Për qëllimin e këtij udhëzimi, ne do ta quajmë klasën tonë "EngineDebugSingleton", por mund të jetë çdo emër i bazuar në shkronja. Tani mund të shtypni "OK" dhe të vazhdoni në hapin 2.

Shënim: Eksploruesi i zgjidhjes dhe vendi ku ruhen skedarët në kompjuterin tuaj janë të ndara. Lëvizja ose krijimi i ndonjë gjëje në zgjidhjen explorer nuk do të lëvizë ose organizojë skedarët brenda skedarit tuaj të skedarit OS. Një mënyrë e sigurt për të organizuar skedarët tuaj në anën e eksploruesit të skedarëve do të ishte heqja, por jo fshirja e skedarëve specifikë nga zgjidhja eksploruese, zhvendosja e të njëjtëve skedarë në eksploruesin e skedarëve në vendndodhjen e dëshiruar dhe pastaj kthimi te zgjidhja eksplorues, kliko me të djathtën, gjeni opsionin "Shto", pastaj gjeni "Artikullin Ekzistues" dhe gjeni skedarët që keni lëvizur. Sigurohuni që të lëvizni si skedarin e kokës ashtu edhe të cpp.

Hapi 2: Vendosni Konstruktorin në Private

Vendosni konstruktorin në privat
Vendosni konstruktorin në privat

Me skedarin CPP dhe skedarin tuaj të sapokrijuar, nëse nuk u hap automatikisht kur e krijuat, shkoni te eksploruesi i zgjidhjes dhe klikoni dhe hapni "EngineDebugSingleton.h". Atëherë do të përshëndeteni me një "EngineDebugSingleton ()", konstruktori i paracaktuar i klasës dhe "~ EngineDebugSingleton ()" shkatërruesi i klasës. Për këtë hap, ne do të duam ta vendosim konstruktorin në privat, kjo do të thotë që ky funksion është i disponueshëm vetëm për klasën dhe asgjë tjetër. Me këtë, ju nuk do të jeni në gjendje të bëni një ndryshore ose të ndani klasën në kujtesë jashtë klasës, vetëm në skedarin e titullit të klasave dhe funksionet e tjera të klasave. Të kesh konstruktorin privat është çelësi për modelin e projektimit dhe mënyrën e funksionimit të beqarëve. Ne do të zbulojmë në hapat e ardhshëm sesi një beqar instantiohet dhe arrihet.

Klasa tani duhet të duket kështu pasi ta kaloni konstruktorin në privat (Shikoni foton e lidhur)

Hapi 3: Vendosni Shkatërruesin në Private

Vendosni Shkatërruesin në Private
Vendosni Shkatërruesin në Private

Ashtu siç bëmë me konstruktorin brenda

hapi 2, për këtë hap, ne tani do ta vendosim shkatërruesin në privat. Ashtu si me konstruktorin, asgjë, përveç vetë klasës, nuk do të jetë në gjendje të fshijë çdo ndryshore të klasës nga memoria.

Klasa tani duhet të duket kështu pasi të keni përfunduar këtë hap. (Shihni foton e lidhur)

Hapi 4: Krijimi i një ndryshoreje të treguesit statik në Singleton

Krijimi i një ndryshoreje të treguesit statik në Singleton
Krijimi i një ndryshoreje të treguesit statik në Singleton

Në këtë hap, ne do të krijojmë një

ndryshore statike e treguesit të tipit "EngineDebugSingleton*". Kjo do të jetë variabla që do të përdoret për të alokuar singletonin tonë në kujtesë dhe do ta tregojë atë për të gjithë kohën që singletoni ynë i është caktuar kujtesës.

Kjo është se si duhet të duket skedari ynë i kokës pas krijimit të kësaj ndryshoreje

Hapi 5: Krijimi i një funksioni shembullor

Krijimi i një funksioni shembullor
Krijimi i një funksioni shembullor

Tani duam të bëjmë një shembull

funksionin. Funksioni do të duhet të jetë një funksion statik dhe do të dëshirojë të kthejë një referencë në klasën tonë ("EngineDebugSingleton &"). Ne e quajtëm funksionin tonë Instance (). Në vetë funksionin, ne do të duam të provojmë së pari nëse ptrInstance == nullptr (mund të shkurtohet në! PtrInstance), nëse është nullptr, kjo do të thotë që singletoni nuk është ndarë dhe në fushëveprimin e deklaratës if, ne duan të ndajnë duke bërë ptrInstance = new EngineDebugSingleton (). Kjo është ajo ku ju në fakt ndani singleton në kujtesë. Pasi të dalim nga fusha e deklaratës if, atëherë do të kthejmë atë që po tregon ptrInstance, e cila shënohet me sintaksën "*ptrInstance". Ne do ta përdorim shumë këtë funksion kur bëjmë funksionet tona statike publike, kështu që ne mund të kontrollojmë për të parë nëse singletoni është krijuar dhe alokuar në kujtesë. Në thelb, ky funksion e bën atë kështu që ju mund të keni vetëm një shpërndarje të klasës dhe jo më shumë.

Kjo është se si duhet të duket klasa jonë tani pas krijimit të funksionit Instance (). Siç mund ta shihni, gjithçka që kemi bërë ka mbetur në pjesën private të klasës, kjo do të ndryshojë pak në hapat e ardhshëm.

Hapi 6: Krijimi i funksioneve publike statike

Krijimi i funksioneve publike statike
Krijimi i funksioneve publike statike
Krijimi i funksioneve publike statike
Krijimi i funksioneve publike statike
Krijimi i funksioneve publike statike
Krijimi i funksioneve publike statike

Pasi të keni bërë funksionin nga

Hapi 5, mund të filloni të bëni funksione statike publike. Çdo funksion publik duhet të ketë një funksion privat për të shkuar së bashku me të, emri i këtij funksioni nuk mund të jetë i njëjtë. Pse ta bëjmë funksionin statik? Ne po i bëjmë funksionet publike statike në mënyrë që ato të mund të aksesohen pa një objekt aktual. Pra, në vend që të bëjmë diçka si "EngineDebugSingleObj-> SomeFunction ()", ne bëjmë "EngineDebugSingleton:: Disa funksione ()". Kjo bën të mundur që një singlet të arrihet në thelb kudo në kod, me kusht që të keni #përfshirë skedarin e titullit në skedarin e projektit specifik me të cilin po punoni. Me këtë, ju gjithashtu mund të krijoni singletin përmes ndonjë prej funksioneve të tij publike.

Për qëllimet tona në këtë hap, ne krijuam dy funksione publike të zbrazëta statike, "shto ()" dhe "zbrit ()". Në seksionin privat, ne kemi dy funksione të tjera, "PrivAdd ()" dhe "PrivSubtract ()". Ne gjithashtu shtuam një ndryshore int të quajtur "NumberOfThings". Përkufizimi për këto funksione do të hyjë në skedarin CPP të klasave tona. Për ta bërë më të lehtë që funksioni të futet në skedarin CPP, ju nënvizoni, me kursorin tuaj, funksionin, i cili duhet të ketë një vijë të gjelbër nën të, dhe shtypni "Left ALT + ENTER", do t'ju japë mundësinë të krijoni përkufizimin në skedari CPP i lidhur me klasat. Shihni Fotografinë 6.1 për të parë se si duhet të duket skedari i kokës dhe pasi të keni krijuar të gjithë përkufizimet e funksionit, CPP -ja juaj duhet të duket si Foto 6.2 përveç që përkufizimet e funksionit tuaj nuk do të kenë asnjë kod në to.

Tani do të dëshironi të shtoni të njëjtin kod si në Foton 6.2 në përkufizimet e funksionit tuaj. Siç u tha më herët, funksionet tona publike do të përdorin funksionin Instance (), i cili do të kthejë atë që po tregon ptrInstance. Kjo na lejon të kemi qasje në funksionet private të klasës sonë. Me çdo funksion publik të vetëm, ju duhet ta thërrisni vetëm atë funksion. Përjashtimi i vetëm nga kjo është funksioni ynë i përfundimit.

Shënim: Funksionet e sakta publike dhe private të treguara në këtë hap nuk janë të nevojshme, mund të keni emra dhe funksione të ndryshme funksioni në funksionin privat, por për çdo lloj funksioni publik, duhet të keni një funksion privat për të shkuar së bashku me të dhe funksioni publik duhet të përdorë gjithmonë, në rastin tonë, funksionin Instance ().

Hapi 7: Krijimi i funksionit të përfundimit

Krijimi i funksionit të përfundimit
Krijimi i funksionit të përfundimit
Krijimi i funksionit të përfundimit
Krijimi i funksionit të përfundimit

Meqenëse ne mund ta dealokojmë vetëm këngëtarin tonë nga kujtesa në klasën tonë, ne duhet të krijojmë një funksion publik statik. Ky funksion do të thërrasë fshirjen në ptrInstance, e cila e quan shkatërruesin e klasës dhe më pas ne do të dëshirojmë që ptrInstance të kthehet në nullptr në mënyrë që të mund të ndahet përsëri nëse programi juaj nuk përfundon. Ju gjithashtu do të dëshironi të përfundoni Singletons tuaj për të pastruar çdo kujtesë të alokuar që keni ndarë në çdo variabël privat të Singleton.

Hapi 8: Vendosja e PtrInstance në Nullptr

Vendosja e PtrInstance në Nullptr
Vendosja e PtrInstance në Nullptr

Për të përfunduar singleton tuaj, dëshironi të shkoni te skedari EngineDebugSingleton. CPP dhe në krye të skedarit CPP, në shembullin tonë, shkruani "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr."

Duke bërë këtë, fillimisht do të vendosni ptrInstance në nullptr, kështu që kur të kaloni për herë të parë përmes funksionit të shembullit, klasa jonë do të lejohet të ndahet në kujtesë. Pa të, ka shumë të ngjarë që të merrni një gabim sepse do të përpiqeni të hyni në kujtesën që nuk i ka ndarë asgjë.

Hapi 9: Test dhe Përfundim

Test dhe Përfundim
Test dhe Përfundim

Ne tani do të duam të testojmë që singletoni ynë për t'u siguruar që funksionon, kjo do të na përfshijë të thërrasim funksionet publike siç përshkruhet në hapin 6 dhe ne ju rekomandojmë që të vendosni pika ndërprerjeje për të përshkuar kodin tuaj dhe për të parë që singletoni po punon si ajo duhet të jetë. Pika jonë fillestare do të jetë në main.cpp të projektit tonë dhe main.cpp tani duket si imazhi më poshtë.

Urime! Ju sapo keni përfunduar zbatimin tuaj të parë të Modelit të Dizajnit Singleton. Me këtë model dizajni, tani mund të thjeshtoni kodin tuaj në mënyra të ndryshme. Për shembull, tani mund të bëni sisteme menaxheriale që funksionojnë gjatë gjithë kohës së funksionimit të programit tuaj, të cilat mund të arrihen përmes funksioneve statike kudo ku keni përfshirë klasën.

Skedari juaj i fundit i kokës duhet të duket si fotografia 7.1. Skedari CPP i lidhur me singleton tuaj duhet të duket si Foto 6.2 me shtimin e, në krye të skedarit, të kodit të treguar në hapin 8. Ky udhëzim ju siguroi një strukturë të thjeshtë të Modelit të Dizajnit Singleton.

Këshilla për zgjidhjen e problemeve:

Po merrni gabime në lidhje me kujtesën?

Sigurohuni që t'i referoheni hapit 7 dhe hapit 8 për t'u siguruar që po vendosni ptrInstance në nullptr.

Po ndodh lak i pafund?

Sigurohuni që për funksionet publike, në përkufizimet e tyre, ju po e quani funksionin privat, jo të njëjtin funksion publik.

Objektet e alokuara brenda singletonit që shkaktojnë rrjedhje të kujtesës?

Sigurohuni që të thërrisni funksionin e përfundimit të singletonit tuaj kur është e përshtatshme brenda kodit të programit tuaj, dhe në destruktorin e singletonit tuaj, sigurohuni që të de-alokoni çdo objekt që i është caktuar kujtesës brenda fushës së kodit të vetëm.