1. Giriş
Bugünkü mühazirəni inkapsulyasiyaya həsr etmək istəyirik. Artıq bunun nə olduğunu ümumi şəkildə bilirsiniz.

Bəs inkapsulyasiyanın üstünlükləri nələrdir? Onlar olduqca çoxdur, lakin mən öz fikrimcə əsas olan dördünü seçə bilərəm:
2. Düzgün daxili vəziyyət
Proqramlarda tez-tez bir neçə class-ın eyni obyektlə qarşılıqlı əlaqədə olduğu vəziyyətlər yaranır. Onların birgə işi nəticəsində obyektin daxilindəki məlumatların bütövlüyü pozulur – artıq o, normal işləməyə davam edə bilmir.
Buna görə də obyekt öz daxili məlumatlarının dəyişdirilməsinə nəzarət etməlidir, hətta daha yaxşısı – onları özü dəyişdirməlidir.
Əgər istəmirik ki, hansısa class-ın dəyişəni digər class-lar tərəfindən dəyişdirilsin, onda onu private
elan edirik və beləliklə yalnız həmin class-ın metodları ona giriş əldə edə bilər. Əgər dəyişənlərin dəyərlərini yalnız oxumaq, ancaq dəyişdirməmək istəyiriksə, o zaman həmin dəyişənlər üçün public getter
əlavə etməliyik.
Məsələn, istəyirik ki, hər kəs kolleksiyamızdakı elementlərin sayını bilsin, amma heç kim bizim icazəmiz olmadan onu dəyişdirə bilməsin. Onda dəyişəni private int count
və metodu public getCount()
elan edirik.
İnkapsulyasiya-nın düzgün istifadəsi təmin edir ki, heç bir class bizim class-ın daxili məlumatlarına birbaşa giriş əldə edə bilməz və beləliklə, onları bizim nəzarətimiz olmadan dəyişdirə bilməz. Yalnız həmin dəyişənlərə aid olan metodları çağıraraq dəyişikliklər etmək mümkündür.
Yaxşısı budur ki, digər proqramçıların hər zaman sizin class-larınızı özləri üçün ən rahat üsulla, amma sizin üçün (class-ınız üçün) ən təhlükəsiz olmayan üsulla istifadə edəcəyini düşünün. Buradan da səhvlər və əvvəlcədən onların qarşısını alma cəhdləri yaranır.
3. Keçirilən argumentlərin nəzarəti
Bəzən sinifimizin metodlarına göndərilən argumentlərə nəzarət etmək lazımdır. Məsələn, bizim sinif "insan" obyektini təsvir edir və onun doğum tarixini təyin etməyə imkan verir. Biz bütün verilmiş məlumatları proqramın məntiqinə və sinifimizin məntiqinə uyğunluğunu yoxlamalıyıq. Məsələn, 13-cü ayın, 30 fevralın və s. daxil edilməsinə icazə verməmək.
Bəs kim doğum tarixində 30 fevralı qeyd etmək istəyər? Birincisi, bu istifadəçidən gələn məlumat daxil edilməsi səhvi ola bilər. İkincisi, proqram saat kimi işləməzdən əvvəl çoxlu səhvlər olacaq. Məsələn, belə bir vəziyyət mümkündür.
Proqramçı sabah yox, birigün ad günü olan insanları müəyyən edən proqram yazır. Məsələn, bu gün 3 martdır. Proqram cari ayın gününün üstünə 2 əlavə edir və 5 martda doğulan hər kəsi axtarır. Hər şey düzgündür kimi görünür.
Ancaq 30 mart gəldikdə, proqram heç kəsi tapmayacaq, çünki təqvimdə 32 mart yoxdur. Metodlara verilən məlumatların yoxlanışı əlavə etdikdə proqramda səhvlər xeyli azalır.
Yadınıza salın, biz ArrayList
-i öyrənəndə və onun kodunu analiz edəndə orada get
və set
metodlarında index
-in yoxlanışı vardı: index
sıfırdan böyük və ya bərabər və massiv uzunluğundan kiçik. Orada həmçinin həmin indekslə element massivin içində yoxdursa, istisna atan kod da vardı. Bu, daxil olan məlumatların yoxlanışının klassik nümunəsidir.
4. Klassların kodu dəyişdirərkən səhvləri minimuma endirmək
Təsəvvür edək ki, böyük bir layihədə iştirak edərkən çox faydalı bir class yazmışıq. O, hamıya o qədər xoş gəldi ki, digər proqramçılar onu kodlarında yüzlərlə yerdə istifadə etməyə başladılar.
Class o qədər faydalı oldu ki, onu daha da təkmilləşdirmək qərarına gəldiniz. Amma əgər bu class-dan bəzi metodları silsəniz, onlarla insanın kodu kompilyasiya olunmayacaq. Onlar təcili olaraq hər şeyi yenidən düzəltməli olacaqlar. Və nə qədər çox yenidən düzəliş olsa, səhvlər də o qədər çox olacaq. Siz bir çox build-i pozacaqsınız və hamı sizdən nifrət edəcək.
Amma biz private olaraq təyin olunan metodları dəyişdirəndə bilirik ki, heç bir class bu metodları çağırmır. Biz onları yenidən düzəldə, parametrlərin sayını və ya tiplərini dəyişə bilərik və asılı olan kod işləməyə davam edəcək. Və ya ən azı kompilyasiya olunacaq.
5. Obyektimizin digər obyektlərlə qarşılıqlı əlaqə üsulunu təyin edirik
Obyektimizlə icazə verilən bəzi addımları məhdudlaşdıra bilərik. Məsələn, obyektin yalnız bir nüsxədə yaradılması üçün xüsusi qayda təyin etmək istəyirik. Hətta layihəmizin müxtəlif yerlərində eyni anda yaradılma prosesi olsa belə. Və bunu inkapsulyasiya sayəsində edə bilərik.

İnkapsulyasiya əlavə məhdudiyyətlər əlavə etməyə imkan verir ki, bunları əlavə üstünlüklərə çevirmək olar. Məsələn, String
klası immutable (dəyişməz) obyekt kimi həyata keçirilmişdir. Yaradıldığı andan ölmə anına qədər String
klası dəyişməz qalır. String
klasının bütün metodları (remove
, substring
, ...), çağırıldığı obyektin heç birini dəyişmədən yeni bir sətir qaytarır.
İnkapsulyasiya, həqiqətən də maraqlı bir şeydir.
GO TO FULL VERSION