Mündəricat:

Singleton Dizayn Nümunəsini C ++ - da necə etmək olar: 9 addım
Singleton Dizayn Nümunəsini C ++ - da necə etmək olar: 9 addım

Video: Singleton Dizayn Nümunəsini C ++ - da necə etmək olar: 9 addım

Video: Singleton Dizayn Nümunəsini C ++ - da necə etmək olar: 9 addım
Video: Refaktorinq: Zavod nümunəsi [Dizayn Nümunələri] 2024, Noyabr
Anonim
Singleton Dizayn Nümunəsini C ++ - da necə etmək olar
Singleton Dizayn Nümunəsini C ++ - da necə etmək olar

Giriş:

Bu təlimatın məqsədi istifadəçiyə C ++ proqramında tək dizayn nümunəsini necə tətbiq etməyi öyrətməkdir. Bunu etməklə, bu təlimat dəsti oxucuya tək bir elementin niyə olduqlarını və kodun necə işləndiyini izah edəcək. Bunu bilmək, gələcək singletonlarınızı düzəltməklə gələcəkdə kömək edəcək. Singleton dizayn nümunəsi nədir? Singleton dizayn nümunəsi, kodlaşdırıcının yalnız bir dəfə yaradıla bilən bir sinif yaratdığı bir dizayn nümunəsidir, başlıq faylını #digər layihə fayllarına daxil etməyiniz şərtilə siniflərin ictimai funksiyalarına hər yerdə daxil olmaq mümkündür.

Singleton dizayn nümunəsi, hər hansı bir obyekt yönümlü proqramçı, proqram təminatçıları və oyun proqramçıları üçün bilməli bir dizayn nümunəsidir. Singleton dizayn nümunəsi də orada ən asan kodlaşdırma dizayn nümunələrindən biridir. Bunu öyrənmək gələcəkdə digər, daha çətin dizayn nümunələrini öyrənməyə kömək edə bilər. Proqramınızın kodunu mümkün olmadığını düşündüyünüz şəkildə asanlaşdırmağa da kömək edə bilər.

Digər dizayn nümunələri ilə müqayisədə tək dizayn modelinin çətinliyi asan olsa da, bu təlimat dəsti orta çətinliyə malikdir. Bu o deməkdir ki, bu təlimatları yerinə yetirmək üçün C ++ dilinin əsas və qabaqcıl sintaksis tələblərini bilməyinizi tövsiyə edirik. Düzgün C ++ kodlaşdırma etiketini də bilməlisiniz (yəni sinif dəyişənlərini gizli saxlayın, başlıq faylına bir sinif və s.). Yaddaşı necə boşaltmağı və konstruktorların və dağıdıcıların C ++ - da necə işlədiyini də bilməlisiniz.

Bu təlimat orta hesabla 10-15 dəqiqə çəkəcək.

Material tələbləri:

-Visual Studios (istənilən versiya) ilə işləyə bilən kompüter (PC və ya Mac ola bilər)

-Vizual Studios -da yaradılmış sadə bir proqram, təkilinizi sınaya bilərsiniz

Qeyd: Singleton dizayn nümunəsi IDE və ya kodlaşdırma interfeysini dəstəkləyən hər hansı digər C ++ üzərində edilə bilər, ancaq bu təlimat dəsti üçün Visual Studios Enterprise Edition istifadə edəcəyik.

Addım 1: Başlıq Dosyası və CPP Dosyası ilə Sinifinizi Yaratın

Başlıq faylı və CPP faylı ilə sinifinizi yaradın
Başlıq faylı və CPP faylı ilə sinifinizi yaradın
Başlıq faylı və CPP faylı ilə sinifinizi yaradın
Başlıq faylı və CPP faylı ilə sinifinizi yaradın

Bu iki faylı və sinfi bir anda yaratmaq üçün Visual Studios -da layihənizi / proqramınızı açın, həll araşdırıcısına keçin, sağ klikləyin və siçan imlecinizin yanında bir qutu görünməli, "Əlavə et" seçimini tapın üzərində və başqa bir qutu sağda görünməlidir. Bu qutuda "Yeni Məhsul.." seçimini tapmaq istəyirsiniz, üzərinə vurun və aşağıdakı şəkil 1.1 şəklinə bənzər bir pəncərə görünsün. Bu pəncərədə "C ++ Sınıfı" nı seçin və sonra "Əlavə et" düyməsini basın. Bu, fotoşəkil 1.2 şəklinə bənzəyən başqa bir pəncərə açılacaqdır. Bu pəncərədə "Sinif Adı" sahəsinə sinifinizin adını yazın və Visual Studios avtomatik olaraq əsl faylı sinif adından sonra adlandıracaq. Bu təlimatın məqsədi üçün sinifimizi "EngineDebugSingleton" adlandıracağıq, ancaq hərflərə əsaslanan hər hansı bir ad ola bilər. İndi "OK" düyməsini basaraq 2 -ci addıma keçə bilərsiniz.

Qeyd: Həll araşdırıcısı və faylların kompüterinizdə saxlanıldığı yer ayrıdır. Həll araşdırıcısında hər hansı bir şeyi köçürmək və ya yaratmaq OS fayl araşdırıcınızdakı faylları hərəkət etdirməyəcək və ya təşkil etməyəcək. Dosyalarınızı fayl kəşfiyyatçısı tərəfində təşkil etməyin etibarlı bir yolu silinəcək, ancaq müəyyən faylları həll tədqiqatçısından silməyəcək, eyni faylları fayl araşdırıcısında istədiyiniz yerə köçürün və sonra həll araşdırıcısına qayıdın, sağ klikləyin, "Əlavə et" seçimini tapın, sonra "Mövcud Maddə" ni tapın və köçürdüyünüz faylları tapın. Həm başlıq, həm də cpp faylını hərəkət etdirdiyinizə əmin olun.

Addım 2: Konstruktoru Şəxsi olaraq təyin edin

Konstruktoru Şəxsi olaraq təyin edin
Konstruktoru Şəxsi olaraq təyin edin

Yeni yaradılmış CPP faylınız və başlıq sənədinizlə, onu yaratdığınız zaman avtomatik olaraq açılmırsa, həll araşdırıcısına gedin və "EngineDebugSingleton.h" düyməsini basın və açın. Daha sonra "EngineDebugSingleton ()", sinif standart qurucusu və "~ EngineDebugSingleton ()" sinif dağıdıcısı ilə qarşılanacaqsınız. Bu addım üçün konstruktoru özəl olaraq təyin etmək istəyəcəyik, bu o deməkdir ki, bu funksiya yalnız sinifdə mövcuddur və başqa heç nə yoxdur. Bununla, yalnız siniflərin başlıq faylında və siniflərin digər funksiyalarında bir dəyişən edə və ya sinifdən başqa yaddaşa sinif ayıra bilməyəcəksiniz. Şəxsi konstruktorun olması dizayn modelinin və təklərin necə işlədiyinin açarıdır. Bir singltonun necə yaradıldığını və əldə edildiyini gələcək addımlarda kəşf edəcəyik.

Konstruktoru özəl vəziyyətə gətirdikdən sonra sinif belə görünməlidir (əlaqəli fotoya baxın)

Addım 3: Yıxıcıyı Şəxsi olaraq təyin edin

Yıxıcıyı Şəxsi olaraq təyin edin
Yıxıcıyı Şəxsi olaraq təyin edin

İçindəki konstruktorla etdiyimiz kimi

addım 2, bu addım üçün indi dağıdıcını özəl olaraq təyin edəcəyik. Konstruktorda olduğu kimi, sinifin özündən başqa heç bir şey sinifdəki dəyişənləri yaddaşdan silə bilməz.

Bu addımı tamamladıqdan sonra sinif belə görünməlidir. (Əlaqədar fotoya baxın)

Addım 4: Singletonda Statik İşarə Dəyişəninin Yaradılması

Singletonda statik göstərici dəyişəninin yaradılması
Singletonda statik göstərici dəyişəninin yaradılması

Bu addımda bir

"EngineDebugSingleton*" tipli statik göstərici dəyişəni. Singletonumuzu yaddaşa ayırmaq üçün istifadə edəcəyimiz dəyişən olacaq və singletonumuzun yaddaşa ayrıldığı müddət ərzində onu göstərəcək.

Bu dəyişəni yaratdıqdan sonra başlıq faylımız belə görünməlidir

Addım 5: Bir nümunə funksiyası yaratmaq

Bir nümunə funksiyası yaratmaq
Bir nümunə funksiyası yaratmaq

İndi bir misal çəkmək istəyirik

funksiyası. Funksiyanın statik bir funksiya olması lazım və sinifimizə bir istinad qaytarmaq istəyəcək (“EngineDebugSingleton &”). Funksiyamızı Instance () adlandırdıq. Funksiyanın özündə, əvvəlcə ptrInstance == nullptr (! PtrInstance -a qısaldıla bilər) yoxlamaq istəyəcəyik, əgər nullptr olarsa, bu, singletonun ayrılmadığı və if ifadəsi daxilində, ptrInstance = new EngineDebugSingleton () edərək ayırmaq istəyirik. Singltonu əslində yaddaşa ayırdığınız yer budur. İf ifadəsinin əhatəsindən çıxdıqdan sonra, "ptrInstance" sintaksisi ilə işarə edilən ptrInstance -in işarə etdiyini geri qaytaracağıq. Statik ictimai funksiyalarımızı edərkən bu funksiyadan çox istifadə edəcəyik, buna görə də singletonun yaradılıb yaddaşa ayrılıb -ayrılmadığını yoxlaya bilərik. Əslində, bu funksiya, sinifin yalnız bir ayrılmasına sahib ola biləcəyinizi təmin edir.

Instance () funksiyasını yaratdıqdan sonra sinifimiz indi belə olmalıdır. Gördüyünüz kimi, etdiklərimizin hamısı sinifin özəl bölməsində qalıb, bu bir neçə addımda bir az dəyişəcək.

Addım 6: Statik ictimai funksiyaların yaradılması

Statik ictimai funksiyaların yaradılması
Statik ictimai funksiyaların yaradılması
Statik ictimai funksiyaların yaradılması
Statik ictimai funksiyaların yaradılması
Statik ictimai funksiyaların yaradılması
Statik ictimai funksiyaların yaradılması

Funksiyanı hazırladıqdan sonra

addım 5, statik ictimai funksiyalar etməyə başlaya bilərsiniz. Hər bir ictimai funksiyanın onunla birlikdə getmək üçün özəl bir funksiyası olmalıdır, bu funksiyanın adı eyni ola bilməz. Niyə funksiyanı Statik edirsiniz? İctimai funksiyaları statik hala gətiririk ki, onlara həqiqi obyekt olmadan daxil olun. Beləliklə, "EngineDebugSingleObj-> SomeFunction ()" kimi bir şey etmək əvəzinə "EngineDebugSingleton:: Some Function ()" edirik. Bu, başlıq faylını #çalışdığınız konkret layihə faylına daxil etməyiniz şərti ilə, kodun hər hansı bir hissəsinə daxil olmaq imkanı verir. Bununla, hər hansı bir ictimai funksiyasından istifadə edərək təklik yarada bilərsiniz.

Bu addımda məqsədlərimiz üçün iki əlavə statik boşluq funksiyası yaratdıq: "əlavə et ()" və "çıxar ()". Şəxsi bölmədə "PrivAdd ()" və "PrivSubtract ()" daha iki funksiyamız var. "NumberOfThings" adlı int dəyişənini də əlavə etdik. Bu funksiyaların tərifi siniflərimizin CPP sənədinə daxil olacaq. Funksiyanı CPP faylına asanlıqla daxil etmək üçün, kursorunuzun altında yaşıl bir xətt olmalıdır və "Sol ALT + ENTER" düymələrini vuraraq funksiyanı vurğulayaraq, siniflərin əlaqəli CPP faylı. Başlıq faylının necə görünməsini görmək üçün Şəkil 6.1 -ə baxın və bütün funksiya təriflərini yaratdıqdan sonra, CPP -nin Şəkil 6.2 -yə bənzəməsi lazımdır, ancaq funksiya təriflərinizdə kod yoxdur.

İndi funksiya təriflərinizə Foto 6.2 -də olduğu kimi eyni kodu əlavə etmək istəyəcəksiniz. Daha əvvəl qeyd edildiyi kimi, ictimai funksiyalarımız, ptrInstance -in göstərdiyini geri qaytaracaq Instance () funksiyasından istifadə edəcək. Bu, sinifimizin özəl funksiyalarına daxil olmağımıza imkan verir. Hər hansı bir singletonun ictimai funksiyası ilə, yalnız bu Instance funksiyasına zəng etməlisiniz. Bunun yeganə istisnası Terminat funksiyamızdır.

Qeyd: Bu addımda göstərilən tam ictimai və xüsusi funksiyalar lazım deyil, xüsusi funksiyada fərqli funksiya adları və əməliyyatlar ola bilər, ancaq hər hansı bir ictimai funksiya üçün onunla birlikdə getmək üçün xüsusi bir funksiya olmalıdır. ictimai funksiya həmişə bizim vəziyyətimizdə Instance () funksiyasından istifadə etməlidir.

Addım 7: Sonlandır funksiyasını yaratmaq

Xitam vermə funksiyasının yaradılması
Xitam vermə funksiyasının yaradılması
Xitam vermə funksiyasının yaradılması
Xitam vermə funksiyasının yaradılması

Sinifimizdə yalnız single -lərimizi yaddaşdan ayıra bildiyimiz üçün statik bir ictimai funksiya yaratmalıyıq. Bu funksiya, sinif dağıdıcısını çağıran ptrInstance -da silmə çağıracaq və sonra proqramınız bitməsə yenidən ayrılmaq üçün ptrInstance -ı yenidən nullptr olaraq təyin etmək istəyəcəyik. Ayrıca, Singleton -un şəxsi dəyişənlərində ayırdığınız hər hansı bir yaddaşı təmizləmək üçün Singletonlarınızı ləğv etmək istəyəcəksiniz.

Addım 8: PtrInstance -ı Nullptr -ə təyin edin

PtrInstance -ı Nullptr olaraq təyin edin
PtrInstance -ı Nullptr olaraq təyin edin

Singletonunuzu tamamlamaq üçün, EngineDebugSingleton. CPP faylına keçmək və CPP faylının yuxarısında, misal olaraq, "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr" yazın.

Bunu etmək ptrInstance -ı nullptr olaraq təyin edəcək, buna görə də ilk dəfə instansiya funksiyasından keçdiyiniz zaman sinifimizin yaddaşa ayrılmasına icazə veriləcək. Onsuz, çox güman ki, bir səhv alacaqsınız, çünki ona ayrılmış heç bir şey olmayan yaddaşa daxil olmağa çalışacaqsınız.

Addım 9: Test və Nəticə

Test və Nəticə
Test və Nəticə

İndi singletonumuzun işlədiyinə əmin olmaq üçün bunu sınamaq istəyəcəyik, bu, 6 -cı addımda göstərildiyi kimi ictimai funksiyaları çağırmağımızı əhatə edəcək və kodunuzu keçmək və singletonun necə işlədiyini görmək üçün dayanma nöqtələri qurmanızı tövsiyə edirik. bu olmalıdır. Başlanğıc nöqtəmiz layihəmizin main.cpp -də olacaq və main.cpp indi aşağıdakı şəklə bənzəyir.

Təbrik edirik! Singleton Dizayn Nümunəsinin ilk tətbiqini tamamlamısınız. Bu dizayn nümunəsi ilə kodunuzu müxtəlif yollarla asanlaşdıra bilərsiniz. Məsələn, indi proqramı daxil etdiyiniz hər hansı bir yerə statik funksiyalar vasitəsilə daxil ola biləcəyiniz proqramınızın işləmə müddətində işləyən idarəetmə sistemləri edə bilərsiniz.

Son başlıq sənədiniz şəkil 7.1 -ə bənzəməlidir. Singleton -un əlaqəli CPP faylı, 8 -ci addımda göstərilən kodun faylın üst hissəsinə əlavə edilməklə Şəkil 6.2 kimi görünməlidir. Bu təlimat sizə Singleton Dizayn Nümunəsinin sadə bir quruluşunu təqdim etdi.

Problem Giderme Məsləhətləri:

Yaddaşla əlaqəli səhvlər əldə edirsiniz?

PtrInstance -ı nullptr olaraq təyin etdiyinizdən əmin olmaq üçün 7 -ci və 8 -ci addıma müraciət etdiyinizə əmin olun.

Sonsuz döngə meydana gəlirmi?

İctimai funksiyaların təriflərində eyni ictimai funksiyanı deyil, özəl funksiyanı çağırdığınızdan əmin olun.

Yaddaş sızıntısına səbəb olan təklikdə ayrılan obyektlər?

Proqram kodunuzda uyğun olduqda singleton-un sonlandırma funksiyasını çağırdığınızdan və singleton-un dağıdıcısında, single-kod kodu daxilində yaddaşa ayrılmış hər hansı bir obyekti ayırmadığınızdan əmin olun.