Salam! Bu günki sapagymyzy inkapsulýasiýa bagyşlaýarys we ony derrew mysallar bilen başlaýarys :)
Seniň öňüňde —
adaty gazly suw awtomaty. Saňa bir soragym bar: ol nähili işleýär? Galyň ýagdaýda düşündirjek bol: stakan nireden çykýar, içindäki temperatura nädip saklanýar, buz nirede saklanýar, awtomat haýsy şerbeti goşmalydygyny nädip düşünýär we ş.m. Belki, şu soraglaryň jogaplary sende ýokdur. Bolýar, belki hemmeler beýle awtomatlary ulanyp baranok, häzirki döwürde olar beýle meşhur däl. Başga bir mysala geçip göreliň. Günde ençeme gezek ulanyp bilýän bir zady. O, gowy pikir!
Google gözleg motory nähili işleýär? Ol sende girizen sözler boýunça maglumatlary nähili gözleýär? Nämüçin ýokarda şol netijeler dur we beýlekileri däl? Her gün Google ulansaň hem, belki muny bilmeýärsiň. Emma munuň ähmiýeti ýok.
Çünki bu zady bilmäge zerurlyk ýok. Sen motora sorag girizip bilýärsiň, onuň nädip işleýänini oýlanman. Gazly suw satyn alyp bilýärsiň, awtomatyň nähili işleýändigini bilmän. Maşyn sürüp bilýärsiň, içki ýanma hereketlendirijisiniň nähili işleýändigini bilmezden, hatda mekdep derejesinde fizika bilmezden. Bular OOP (obýekt ugrukdyrylan programmirleme) prinsipleriniň biri bolan
inkapsulýasiýanyň netijesinde mümkin bolýar. Bu tema barada dürli makalalary okap, programmalaşdyrmada köp ulanylýan iki düşünje —
inkapsulýasiýa we
gizlemek bar. Biz ikisini hem düşündäris, şonuň üçin seniň doly düşünmegiň bolar. Programmalaşdyrmada «
inkapsulýasiýanyň» ilkibaşdaky manysy —
maglumatlaryň we şol maglumatlar bilen işleýän usullaryň bir gapda («kapsulada») birleşmegi. Java-da gap-kapsula hökmünde
klas çykyş edýär. Klas öz içine
maglumatlary (klas meýdanlary) we şol maglumatlar bilen işleýän
usullary alýar.
Bu saňa aňsat görünip biler, emma beýleki programmalaşdyrma konsepsiýalarynda ähli zat başgaça gurnalan. Mysal üçin, funksiýonial programmalaşdyrmada maglumatlar olara degişli operasiýalardan berk aýrylan. OOP-da (obýekt ugrukdyrylan programmalaşdyrmada) programmylar klas-kapsullardan durýar, olar öz-özünden hem maglumatlar, hem işlemek üçin funksiýalar. Indi
gizlemek barada gepleşeliň. Näme üçin biz dürli çylşyrymly mehanizmleri olaryň nähili gurnalandygyny we işiniň nämede esaslanandygyny bilmän ulanyp bilýäris? Hemmesi aňsat: olaryň döredijileri aňsat we amatly
interfeýs hödürlediler. Gazly suw awtomatynda interfeýs — paneldäki düwmeler. Bir düwmäni basyp, stakanyň göwrümini saýlaýaň. Ikinji düwme bilen şerbeti saýlaýaň. Üçünji düwme buzu goşmak üçin jogap berýär. Indi ähli gerek zat — üç düwmäni basmak. Awtomatyň nähili gurnalandygynyň ähmiýeti ýok. Esasy zat —
ol şeýle gurnalan, hatda ulanyjy gazly suw almak üçin üç düwmäni basmaly. Maşyn bilen hem şeýle. Onuň içindäki zatlaryň ähmiýeti ýok. Esasy zat —
sağ pedal bilen maşyn öňe gidýär, çep pedal bilen bolsa durýar. Bu ýerde gizlemegiň manysy bar. Programmyň ähli «içindäkiler» ulanyjydan gizlenýär. Ol üçin bu maglumat gereksiz we artykmaç. Ulanyja diňe ahyrky netijä gerek, içki proses zerur däl. Mysal üçin



Auto
klasy barada göreliň:
public class Auto {
public void gas() {
/*maşynyň içinde käbir çylşyrymly zatlar bolup geçýär,
şonuň netijesinde ol öňe gidýär*/
}
public void brake() {
/*maşynyň içinde käbir çylşyrymly zatlar bolup geçýär,
şonuň netijesinde ol durýar*/
}
public static void main(String[] args) {
Auto auto = new Auto();
//Ulanyjy üçin hemme zat şeýle görünýär
//bir pedaly basdy - gitdi
auto.gas();
//başga pedaly basdy - durdy
auto.brake();
}
}
Java programmasynda gizlemek şeýle görünýär. Hemmesi hakyky durmuşdaky ýaly: ulanyja interfeýs (usullar) hödürlenýär. Ulanyja programmandaky maşyn hereketini amala aşyrmak üçin diňe gerekli usuly çagyrmak ýeterlikdir. Ol usullaryň içindäki näme bolýar — bu artykmaç maglumat, esasy zat hemme zadyň dogry işlemegi. Bu ýerde biz
gizlenme realizasiýasy barada gürleşdik. Java-da başga hem
maglumat gizlemek bar. Bu barada biz
getter-lar we setter-ler barada sapagymyzda ýazdyk, emma gaýtalap bileris. Mysal üçin, bizde
Cat
klassy bar:
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("Mäw!");
}
}
Belki sen öňki sapakdan bu klassa nähili problema bar diýip ýatdan çykarmadyň? Eger ýok bolsa — ýatla. Problema şundaky, onuň maglumatlary (meýdanlary) hemmeler üçin açyk, we başga programmist programma-da ady ýok, agramy 0 bolan we ýaşy -1000 ýyllap ketirilen pişik döredip biler:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
Bu ýagdaýda mümkin boldugyça, kollektorlaryň ýagdaýyny bozýan obýektleri döretmeýänine gözegçilik etmäge synanyşyň, emma iň gowusy beýle «ýalňyş obýektleri» döretmek mümkinçiligini ýok etmek. Maglumat gizlemek bilen biz kömek berýär:
- dolyýüz geçmiş modifikatorlary (private, protected, package default);
- getter-lar we setter-ler.
- Obýektiň dogry ýagdaýyna gözegçilik etmek. Munuň mysallary ýokarda boldy: settere we private modifikatoryna minnetdar bolanymyz üçin, programma-da agramy 0 bolan pişikleri howpsuzlyga aldyk.
- Ulanyjy üçin interfeýs arkaly amatlyk. Biz ulanyjynyň elýeterliligi üçin diňe usullary «daşarda» goýýarys. Olary çagyrmak ýeterlik, dogruçyl netije almak üçin, we olaryň işiniň maglumatlaryna düýpli düşünmäge gerek ýok.
- Kod üýtgetmeleriniň ulanyjylar üçin täsiri ýok. Biz ähli üýtgetmeleri usullaryň içinde geçirýäris. Bu ulanyjylara täsir etmeli däl: ol, öňki ýaly, maşyn gaz üçin auto.gas() ýazýar, öňki ýaly ýazmaga dowam edýär. A usul gas() işinde üýtgetmeleriň içindäki zady onuň üçin görünmez, esasy zat hemme zadyň dogry işlemegi.
GO TO FULL VERSION