Mundarija:

Singleton dizayn naqshini C ++ da qanday qilish kerak: 9 qadam
Singleton dizayn naqshini C ++ da qanday qilish kerak: 9 qadam

Video: Singleton dizayn naqshini C ++ da qanday qilish kerak: 9 qadam

Video: Singleton dizayn naqshini C ++ da qanday qilish kerak: 9 qadam
Video: Refaktoring: Singleton [Dizayn naqshlari] 2024, Noyabr
Anonim
C ++ da Singleton dizayn naqshini qanday bajarish kerak
C ++ da Singleton dizayn naqshini qanday bajarish kerak

Kirish:

Ushbu qo'llanmaning maqsadi - foydalanuvchiga C ++ dasturida singleton dizayn naqshini qanday amalga oshirishni o'rgatish. Bunda ushbu ko'rsatma to'plami o'quvchiga nima uchun singleton elementlari shunday ekanligini va kod qanday ishlashini tushuntiradi. Buni bilish, kelajakda singl qo'shiqlarini tuzatishga yordam beradi. Singleton dizayni qanday? Singleton dizayni - bu dizayn kodi, u erda koder faqat bir marta bajarilishi mumkin bo'lgan sinfni yaratadi, agar siz sarlavha faylini loyihaga tegishli boshqa fayllarga kiritgan bo'lsangiz, sinflarning umumiy funktsiyalariga har qanday joyda kirish mumkin.

Singleton dizayni har qanday ob'ektga yo'naltirilgan dasturchi, dasturiy ta'minot dasturchilari va o'yin dasturchilari uchun dizayn naqshini bilishi shart. Singleton dizayn naqshlari, shuningdek, kodlashning eng oson dizayn naqshlaridan biridir. Uni o'rganish sizga kelajakda boshqa, murakkab dizayn dizaynlarini o'rganishga yordam beradi. Bu, shuningdek, sizning dasturingiz kodini siz tasavvur qilmagan tarzda soddalashtirishga yordam beradi.

Boshqa dizayn naqshlari bilan taqqoslaganda, singleton dizaynining murakkabligi oson bo'lsa -da, bu ko'rsatma to'plami o'rtacha qiyinchiliklarga ega. Bu shuni anglatadiki, ushbu ko'rsatmalarni bajarish uchun sizga C ++ sintaksisining asosiy va ilg'or talablarini bilish tavsiya etiladi. Shuningdek, siz C ++ kodlash odob -axloq qoidalarini bilishingiz kerak (ya'ni, sinf o'zgaruvchilarini shaxsiy saqlang, har bir sarlavha fayli uchun bitta sinf va boshqalar). Shuningdek, xotirani bo'shatish va C ++ da konstruktorlar va buzuvchilar qanday ishlashini bilish kerak.

O'quv qo'llanma o'rtacha 10-15 daqiqa davom etadi.

Materiallarga talablar:

-Visual Studios (har qanday versiya) bilan ishlaydigan kompyuter (kompyuter yoki Mac bo'lishi mumkin)

-Visual Studios -da yaratilgan oddiy dastur, siz o'z singltoningizni sinab ko'rishingiz mumkin

Eslatma: Singleton dizaynining namunasi IDE yoki kodlash interfeysini qo'llab -quvvatlaydigan boshqa har qanday C ++ da bajarilishi mumkin, lekin biz bu ko'rsatma uchun Visual Studios Enterprise Edition -dan foydalanamiz.

1 -qadam: Sarlavha fayli va CPP fayli bilan o'z sinfingizni yarating

Sarlavha fayli va CPP fayli bilan o'z sinfingizni yarating
Sarlavha fayli va CPP fayli bilan o'z sinfingizni yarating
Sarlavha fayli va CPP fayli bilan o'z sinfingizni yarating
Sarlavha fayli va CPP fayli bilan o'z sinfingizni yarating

Ushbu ikkita faylni va sinfni birdaniga yaratish uchun, Visual Studios -da loyihangizni / dasturingizni oching, echimlarni o'rganuvchiga o'ting, sichqonchaning o'ng tugmachasini bosing va sichqoncha kursori yonida quti paydo bo'lishi kerak, "Qo'shish" variantini toping uning ustiga, va o'ngda boshqa quti paydo bo'lishi kerak. Bu qutida siz "Yangi element.." variantini topmoqchisiz, uni bosing va quyidagi 1.1 rasmga o'xshash oyna paydo bo'lishi kerak. Bu oynada siz "C ++ klassi" ni tanlamoqchisiz va "Qo'shish" tugmasini bosing. Bu rasm 1.2 rasmiga o'xshash boshqa oyna ochiladi. Bu oynada siz "Sinf nomi" maydoniga sinfingiz nomini yozasiz va Visual Studios avtomatik ravishda haqiqiy faylni sinf nomidan keyin nomlaydi. Bu yo'riqnomada biz o'z sinfimizni "EngineDebugSingleton" deb nomlamoqchimiz, lekin bu harfga asoslangan har qanday nom bo'lishi mumkin. Endi siz "OK" ni bosishingiz va 2 -bosqichga o'tishingiz mumkin.

Eslatma: Yechim qidiruvchisi va fayllar kompyuteringizda saqlanadigan joy alohida. Yechimlar qidiruvchisida biror narsani ko'chirish yoki yaratish OS fayllar qidiruvi ichidagi fayllarni tashimaydi va tartibga solmaydi. Fayllarni qidiruvchi tomondan fayllarni tartibga solishning xavfsiz usuli - bu aniq fayllarni echim qidiruvchisidan o'chirib tashlamaslik, bir xil fayllarni kerakli joyga ko'chirish, so'ngra echim qidiruvchisiga qaytish, sichqonchaning o'ng tugmasi bilan, "Qo'shish" variantini toping, so'ng "Mavjud element" ni toping va ko'chirilgan fayllarni toping. Sarlavha va cpp faylini siljitganingizga ishonch hosil qiling.

2 -qadam: Konstruktorni Shaxsiy qilib o'rnating

Konstruktorni Shaxsiy qilib sozlang
Konstruktorni Shaxsiy qilib sozlang

Yangi yaratilgan CPP fayli va sarlavha fayli bilan, agar u siz yaratganingizda avtomatik ravishda ochilmasa, echim qidiruvchisiga o'ting va "EngineDebugSingleton.h" ni oching. Sizni "EngineDebugSingleton ()", sinfning standart konstruktori va "~ EngineDebugSingleton ()" sinfining buzuvchisi kutib oladi. Bu qadam uchun biz konstruktorni xususiy qilib o'rnatmoqchimiz, bu shuni anglatadiki, bu funksiya faqat sinfda mavjud va boshqa hech narsa yo'q. Bu bilan siz o'zgarmaydigan qila olmaysiz yoki sinfdan tashqari xotiraga ajratolmaysiz, faqat sinflar sarlavhasi faylida va boshqa funktsiyalarda. Shaxsiy konstruktorga ega bo'lish - bu dizayn naqshining va singltonlarning qanday ishlashining kalitidir. Biz kelgusi bosqichlarda singlton qanday yaratilishini va unga qanday kirishni bilib olamiz.

Konstruktorni shaxsiyga o'tkazgandan so'ng, sinf shunday bo'lishi kerak (bog'langan rasmga qarang)

3 -qadam: Vayronkorni Shaxsiy qilib o'rnating

Vayronkorni Shaxsiy qilib o'rnating
Vayronkorni Shaxsiy qilib o'rnating

Biz konstruktor bilan qilganimiz kabi

2 -qadam, bu qadam uchun biz hozir buzuvchini shaxsiy qilib belgilaymiz. Konstruktor singari, sinfning o'zidan boshqa hech narsa sinfning o'zgaruvchilarini xotiradan o'chira olmaydi.

Bu bosqichni tugatgandan so'ng sinf endi shunday ko'rinishi kerak. (Birlashtirilgan rasmga qarang)

4 -qadam: Singletonda statik ko'rsatgich o'zgaruvchisini yaratish

Singletonda statik ko'rsatgich o'zgaruvchisini yaratish
Singletonda statik ko'rsatgich o'zgaruvchisini yaratish

Ushbu bosqichda biz a ni yaratamiz

"EngineDebugSingleton*" turidagi statik ko'rsatgich o'zgaruvchisi. Bu bizning singletonimizni xotiraga ajratish uchun ishlatiladi va bizning singletonimiz xotiraga ajratilgan vaqt davomida ko'rsatiladi.

Bu o'zgaruvchini yaratgandan so'ng, bizning sarlavha faylimiz shunday bo'lishi kerak

5 -qadam: Instance funktsiyasini yaratish

Instance funktsiyasini yaratish
Instance funktsiyasini yaratish

Endi biz misol keltirmoqchimiz

funktsiya. Funktsiya statik bo'lishi kerak va bizning sinfga havolani qaytarishni xohlaydi ("EngineDebugSingleton &"). Biz o'z vazifamizni Instance () deb atadik. Funktsiyaning o'zida biz birinchi bo'lib tekshirishni xohlaymiz, agar ptrInstance == nullptr (! PtrInstance ga qisqartirilishi mumkin), agar u nullptr bo'lsa, demak singlton ajratilmagan va if iborasi doirasida biz ptrInstance = new EngineDebugSingleton () yordamida ajratishni xohlaysiz. Bu erda siz singletonni xotiraga ajratasiz. If iborasi doirasidan chiqqandan so'ng, biz "ptrInstance" sintaksisi bilan ko'rsatilgan ptrInstance ko'rsatgan narsani qaytaramiz. Biz statik ommaviy funktsiyalarni bajarishda bu funktsiyadan juda ko'p foydalanamiz, shuning uchun singleton yaratilganligini va xotiraga ajratilganligini tekshirishimiz mumkin. Aslida, bu funktsiyani bajaradi, shuning uchun siz faqat bitta sinfni ajratishingiz mumkin va bundan ortiq bo'lmaydi.

Instance () funktsiyasini yaratgandan so'ng, bizning sinfimiz hozir shunday bo'lishi kerak. Ko'rib turganingizdek, biz qilgan barcha ishlar sinfning shaxsiy bo'limida qoldi, bu keyingi bosqichlarda biroz o'zgaradi.

6 -qadam: Statik ommaviy funktsiyalarni yaratish

Statik ommaviy funktsiyalarni yaratish
Statik ommaviy funktsiyalarni yaratish
Statik ommaviy funktsiyalarni yaratish
Statik ommaviy funktsiyalarni yaratish
Statik ommaviy funktsiyalarni yaratish
Statik ommaviy funktsiyalarni yaratish

Siz funktsiyani yaratganingizdan so'ng

5 -qadam, siz statik umumiy funktsiyalarni bajarishni boshlashingiz mumkin. Har bir umumiy funktsiyani bajarish uchun shaxsiy funktsiya bo'lishi kerak, bu funktsiyaning nomi bir xil bo'lishi mumkin emas. Nima uchun funktsiyani Statik qilish kerak? Biz umumiy funktsiyalarni statik qilyapmiz, shuning uchun ularga haqiqiy ob'ektsiz kirish mumkin. Shunday qilib, "EngineDebugSingleObj-> SomeFunction ()" kabi biror narsa qilishning o'rniga biz "EngineDebugSingleton:: Some Function ()" ni bajaramiz. Bu sizga singltonga kodning istalgan joyidan kirishga imkon beradi, agar siz nom faylini siz ishlayotgan loyiha fayliga kiritgan bo'lsangiz. Shu bilan siz singletonni har qanday jamoat funktsiyalari orqali yaratishingiz mumkin.

Bizning maqsadimiz uchun biz bu qadamda ikkita ochiq statik bo'sh funktsiyani yaratdik: "qo'shish ()" va "ayirish ()". Maxsus bo'limda biz yana ikkita funktsiyani bajaramiz: "PrivAdd ()" va "PrivSubtract ()". Shuningdek, biz "NumberOfThings" deb nomlangan int o'zgaruvchisini qo'shdik. Bu funktsiyalar ta'rifi bizning sinflarimiz CPP fayliga kiradi. Funktsiyani CPP fayliga osongina kiritish uchun siz kursoringiz ostida yashil chiziq bo'lishi kerak bo'lgan funktsiyani ajratib ko'rsatasiz va "Chap ALT + ENTER" tugmachasini bosganingizda, bu sizga ta'rifni yaratish imkoniyatini beradi. sinflar bilan bog'liq CPP fayli. Sarlavha fayli qanday bo'lishi kerakligini bilish uchun 6.1 -rasmga qarang va barcha funktsiyalar ta'rifini yaratganingizdan so'ng, sizning CPP 6.2 -rasmga o'xshash bo'lishi kerak, faqat sizning funktsiya ta'riflarida kod yo'q.

Endi siz funktsiya ta'riflariga 6.2 -rasmdagi kodni qo'shishni xohlaysiz. Yuqorida aytib o'tilganidek, bizning ommaviy funktsiyalarimiz Instance () funktsiyasidan foydalanadi, bu esa ptrInstance ko'rsatgan narsani qaytaradi. Bu bizga sinfimizning shaxsiy funktsiyalariga kirishga imkon beradi. Har qanday singletonning ommaviy funktsiyasi bilan siz faqat Instance funktsiyasini chaqirishingiz kerak. Buning yagona istisnosi - bu "Tugatish" funksiyasi.

Eslatma: Ushbu bosqichda ko'rsatilgan umumiy va xususiy funktsiyalar shart emas, sizda har xil funktsiya nomlari va operatsiyalari bo'lishi mumkin, lekin har qanday umumiy funktsiya uchun siz u bilan birga borish uchun shaxsiy funktsiyaga ega bo'lishingiz kerak. ommaviy funktsiya har doim, bizning holatda, Instance () funktsiyasidan foydalanishi kerak.

7 -qadam: Tugatish funktsiyasini yaratish

Tugatish funktsiyasini yaratish
Tugatish funktsiyasini yaratish
Tugatish funktsiyasini yaratish
Tugatish funktsiyasini yaratish

Biz o'z singltonimizni faqat o'z sinfimizda xotiradan ajratishimiz mumkin bo'lgani uchun, biz statik ommaviy funktsiyani yaratishimiz kerak. Bu funktsiya ptrInstance -da o'chirishni chaqiradi, u sinfni buzuvchini chaqiradi va keyin ptrInstance -ni nullptr -ga qaytarishni xohlaymiz, shunda sizning dasturingiz tugamasa, uni yana ajratish mumkin bo'ladi. Bundan tashqari, Singleton -ning shaxsiy o'zgaruvchilarida ajratilgan xotirani tozalash uchun Singleton -laringizni to'xtatishni xohlaysiz.

8 -qadam: PtrInstance -ni Nullptr -ga o'rnatish

PtrInstance -ni Nullptr -ga o'rnatish
PtrInstance -ni Nullptr -ga o'rnatish

Bitta qo'shiqni to'ldirish uchun siz EngineDebugSingleton. CPP faylini va CPP faylining yuqori qismiga o'tishni xohlaysiz, bizning misolimizda "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr."

Buni amalga oshirish dastlab ptrInstance -ni nullptr -ga o'rnatadi, shuning uchun siz birinchi marta misol funktsiyasidan o'tganingizda, bizning sinf xotiraga ajratishga ruxsat beriladi. Bu holda, ehtimol siz xatoga yo'l qo'yasiz, chunki siz hech narsa ajratilmagan xotiraga kirishga harakat qilasiz.

9 -qadam: Test va xulosa

Test va xulosa
Test va xulosa

Endi biz singltonimiz ishlayotganiga ishonch hosil qilish uchun uni sinovdan o'tkazmoqchimiz, bu bizni 6 -bosqichda tasvirlanganidek jamoat funktsiyalariga qo'ng'iroq qilishni o'z ichiga oladi va biz sizning kodingizni ko'rib chiqish va singleton ishlayotganini ko'rish uchun to'xtash nuqtalarini o'rnatishingizni tavsiya qilamiz. bo'lishi kerak. Bizning boshlang'ich nuqtamiz loyihamizning main.cpp -da bo'ladi va bizning main.cpp endi quyidagi rasmga o'xshaydi.

Tabriklaymiz! Siz Singleton Design Pattern dasturini birinchi marta amalga oshirdingiz. Ushbu dizayn namunasi yordamida siz endi kodingizni turli yo'llar bilan tartibga solishingiz mumkin. Masalan, endi siz dasturning ishlash muddati davomida ishlaydigan menejer tizimlarini yaratishingiz mumkin, unga siz sinf qo'shgan har qanday joyda statik funktsiyalar orqali kirishingiz mumkin.

Sizning oxirgi sarlavha faylingiz 7.1 -rasmga o'xshash bo'lishi kerak. Sizning singleton bilan bog'langan CPP fayli 6.2 -rasmga o'xshash bo'lishi kerak, faylning yuqori qismiga 8 -qadamda ko'rsatilgan kod qo'shilgan bo'lishi kerak. Bu ko'rsatma sizga Singleton Design Pattern oddiy tuzilishini taqdim etdi.

Muammolarni bartaraf etish bo'yicha maslahatlar:

Xotira bilan bog'liq xatolar bormi?

PtrInstance -ni nullptr -ga o'rnatganingizga ishonch hosil qilish uchun 7 -va 8 -qadamlarga murojaat qilganingizga ishonch hosil qiling.

Cheksiz tsikl paydo bo'ladimi?

Umumiy funktsiyalarga ishonch hosil qiling, ularning ta'riflarida siz bir xil umumiy funktsiyani emas, balki shaxsiy funktsiyani chaqirasiz.

Singleton ichida ajratilgan ob'ektlar xotira oqishiga olib keladimi?

Agar kerak bo'lsa, singltonning tugatish funktsiyasini qo'ng'iroq qiling, agar dastur kodiga mos kelsa va singltonning buzilishida, singleton kodi doirasida xotiraga ajratilgan ob'ektlarni ajratmaganingizga ishonch hosil qiling.