JavaRush /Java Blogu /Random-AZ /Java-da inkapsulyasiya prinsipləri

Java-da inkapsulyasiya prinsipləri

Qrupda dərc edilmişdir
Salam! Bugünkü mühazirəmiz inkapsulyasiyaya həsr olunacaq və biz bunu dərhal nümunələrlə başlayacağıq :) Qarşınızda tanış soda maşını var. Sizə bir sualım var: bu necə işləyir? Ətraflı cavab verməyə çalışın: şüşənin haradan gəldiyini, içəridəki temperaturun necə saxlanıldığını, buzun harada saxlandığını, maşın hansı şərbətin əlavə olunacağını necə başa düşür və s. Çox güman ki, bu suallara cavabınız yoxdur. Yaxşı, bəlkə də hamı belə maşınlardan istifadə etmir, onlar indiki vaxtda o qədər də populyar deyillər. Başqa bir misal göstərməyə çalışaq. Hər gün dəfələrlə istifadə etdiyinizi bildiyiniz bir şey. Oh, mənim bir fikrim var! Google axtarış sistemininİnkapsulyasiya prinsipləri - 2 necə işlədiyini bizə deyin . Daxil etdiyiniz sözlərə əsasən məlumatı necə dəqiq axtarır? Niyə bu nəticələr yuxarıdadır, digərlərində yox? Hər gün Google-dan istifadə etsəniz də, yəqin ki, bunu bilmirsiniz. Amma vacib deyil. Axı bunu bilmək lazım deyil. Axtarış motoruna onun dəqiq necə işlədiyini düşünmədən sorğular daxil edə bilərsiniz. Sodanın necə işlədiyini bilmədən avtomatdan ala bilərsiniz. Avtomobili daxili yanma mühərrikinin işinə baxmadan və ümumiyyətlə fizikanı bilmədən, hətta məktəb səviyyəsində də idarə edə bilərsiniz. Bütün bunlar obyekt yönümlü proqramlaşdırmanın əsas prinsiplərindən biri - inkapsulyasiya sayəsində mümkündür . Bu mövzuda müxtəlif məqalələri oxuyarkən, yəqin ki, proqramlaşdırmada iki ümumi anlayışın olması faktına rast gəldiniz - inkapsulyasiyagizlətmə . Və “kapsulyasiya” sözü ilə müəlliflər bu və ya digər şeyi nəzərdə tuturlar (olduğu kimi). Tam başa düşə bilməniz üçün hər iki termini parçalayacağıq. Proqramlaşdırmada “ inkapsulyasiya ” sözünün orijinal mənası verilənlərin və bu verilənlərlə işləmə üsullarının bir paketdə (“kapsula”) birləşməsidir. Java-da sinif kapsul paketi kimi çıxış edir . Sinif həm verilənləri (sinif sahələri), həm də bu verilənlərlə işləmə üsullarını ehtiva edir. Bu sizə aydın görünür, lakin digər proqramlaşdırma konsepsiyalarında hər şey fərqli şəkildə işləyir. Məsələn, funksional proqramlaşdırmada verilənlər üzərindəki əməliyyatlardan ciddi şəkildə ayrılır. OOP-da (obyekt yönümlü proqramlaşdırma) proqramlar həm verilənlər, həm də onunla işləmək üçün funksiyalar olan kapsul siniflərindən ibarətdir. İndi gizlənmək haqqında danışaq . Necə olur ki, biz hər cür mürəkkəb mexanizmlərin necə işlədiyini və işlərinin nəyə əsaslandığını anlamadan istifadə edirik? Çox sadədir: onların yaradıcıları sadə və istifadəçi dostu interfeys təqdim ediblərПринципы инкапсуляции - 3. Soda maşınında interfeys paneldəki düymələrdir. Bir düyməyə basaraq, şüşənin həcmini seçirsiniz. İkinciyə basaraq şərbəti seçirsiniz. Üçüncüsü buz əlavə etməkdən məsuldur. Və etməli olduğunuz hər şey budur. Maşının içəridə necə dizayn edildiyinin əhəmiyyəti yoxdur. Əsas odur ki , soda almaq üçün istifadəçi üç düyməni basmalı olacaq şəkildə tərtib edilmişdir . Avtomobillə də eynidir. Onun daxilində nə baş verdiyinin əhəmiyyəti yoxdur. Əsas odur ki , sağ pedala basanda avtomobil irəli gedir, sol pedala basanda isə sürəti azalır . Gizlətmənin mahiyyəti də məhz budur. Proqramın bütün “daxili”ləri istifadəçidən gizlədilir. Onun üçün bu məlumat artıq və lazımsızdır. İstifadəçiyə daxili proses deyil, son nəticə lazımdır. Nümunə olaraq sinfə baxaq Auto:
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.brake();
   }
}
Tətbiqin gizlədilməsi Java proqramında belə görünür. Hər şey real həyatdakı kimidir: istifadəçi interfeys (metodlar) ilə təmin olunur. Bir hərəkəti yerinə yetirmək üçün proqramdakı avtomobilə ehtiyacı varsa, sadəcə istədiyi metodu çağırması lazımdır. Və bu üsulların içərisində baş verənlər lazımsız məlumatlardır, əsas odur ki, hər şey lazım olduğu kimi işləyir. Burada tətbiqi gizlətməkdən danışdıq . Bundan əlavə, Java da məlumat gizlətməyə malikdir . Bu barədə alıcılar və təyinatçılar haqqında mühazirədə yazdıq , amma xatırlatmaqdan zərər görməzdik. Məsələn, bir sinifimiz var Cat:
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
Yəqin ki, son mühazirədən bu sinfin probleminin nə olduğunu xatırlayırsınız? Yoxdursa, xatırlayaq. Məsələ burasındadır ki, onun məlumatları (sahələri) hər kəs üçün açıqdır və başqa bir proqramçı asanlıqla proqramda çəkisi 0 və yaşı -1000 il olan adsız pişik yarada bilər:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Belə bir vəziyyətdə, həmkarlarınızdan birinin yanlış vəziyyətdə olan obyektlər yaratdığını yaxından izləyə bilərsiniz, lakin bu cür "yanlış obyektlər" yaratmaq ehtimalını istisna etmək daha yaxşı olardı. Принципы инкапсуляции - 4 Onlar bizə məlumat gizlətməkdə kömək edir:
  1. giriş modifikatorları ( özəl , qorunan , standart paket );
  2. alıcılar və təyinatlar.
Orada, məsələn, kiminsə pişiyə yaşı kimi mənfi bir nömrə təyin etməyə çalışıb-çalışmadığını yoxlaya bilərik. Daha əvvəl dediyimiz kimi, inkapsulyasiya ilə bağlı müxtəlif məqalələrin müəllifləri ya inkapsulyasiyanı (məlumatları və metodları birləşdirən), ya gizlətməyi, ya da hər ikisini nəzərdə tutur. Java hər iki mexanizmə malikdir (digər OOP dillərində bu mütləq deyil), ona görə də sonuncu seçim ən düzgündür. İnkapsulyasiyadan istifadə bizə bir sıra mühüm üstünlüklər verir:
  1. Obyektin düzgün vəziyyətinə nəzarət. Yuxarıda bunun nümunələri var idi: təyinedici və şəxsi dəyişdirici sayəsində proqramımızı 0 çəkisi olan pişiklərdən qoruduq.

  2. İnterfeys sayəsində istifadəçi dostu. Biz istifadəçi girişi üçün yalnız metodları “kənarda” buraxırıq. Onun etməli olduğu yeganə şey nəticə əldə etmək üçün onlara zəng etməkdir və ümumiyyətlə işlərinin təfərrüatlarını araşdırmağa ehtiyac yoxdur.

  3. Koda edilən dəyişikliklər istifadəçilərə təsir göstərmir. Bütün dəyişiklikləri metodlar daxilində edirik. Bu istifadəçiyə təsir etməyəcək: maşının qazı üçün auto.gas() yazıb, ona görə də yazacaq. Və gas() metodunun işlədilməsində nəyisə dəyişdirməyimiz onun üçün görünməz qalacaq: o, əvvəlki kimi sadəcə istədiyiniz nəticəni alacaq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION