C#-da kapsullamaq(Encapsulation)

Məhəmməd Sadıqzadə
Pragmatech
Published in
3 min readJul 19, 2021

Obyekt yönlü proramlaşdırma dillərində kapsullamaq(ing : Encapsulation) onurğada yerləşən bir parçadır deyə bilərik.

Kapsullamağa nə ehtiyacımız var ki?

Proqramlaşdırmada kapsullamağa datanı bir qoruma qalxanına almaq üçün ehtiyac duyuruq.Yəni kənardan birbaşa dataya çatmaq yerinə onu bir kapsulun içinə alıb müəyyən şərtlər qoyuruq və o dataya çatmaq istəyənə də, sanki “Burda bu kapsulun qaydaları keçir!” deyərək məhdudiyyət qoymuş oluruq.

Sinfin dəyişənləri və dataları bütün digər siniflərdən gizlədilir və yalnızca təyin olunduğu sinfin funksiyaları ilə çağırmaq mümkün olur.

Kapsullamaq dataları başqa siniflərdən gizlətmək olduğu üçün o həmçinin “data gizləmə ” deyə də bilinir.

Kapsullamaq üçün bütün dəyişənləri “private” olaraq təyin etməli və “set&get” metodları ilə çağırmalıyıq.

C# üzərində kapsullamaq

Əvvəla kapsullamağın faydasını misal ilə göstərək.

Məsələn belə bir situasiya ürəkaçandırmı?Sırf string tipində verilib deyə rəqəm təyin etmək heç də developerlərin sevəcəyi bir şey deyil.Bunun üçün yardımımıza kapsullamaq yetişir :

Yuxarıdakı misalda set prosesinə bir məhdudiyyət qoyduq,get üçün də məhdudiyyət qoymaq mümkündür ki, “hər yoldan keçən” dəyəri əldə edə bilməsin :)

Property-lər ilə kapsullamaq prosesi

Kapsullamaq OOP-nin onurğa hissəsində yer alır demişdik yuxarıda,Obyekt Yönümlü Proqramlaşdırma dillərindən biri olan C# bu işi daha da asanlaşdırmaq üçün birbaşa kapsullamaq məntiqinə xidmət edən struktur yaradıb ki,bunlar da property adlanır.Kapsullamağı təməlləndirmək üçün field property anlayışını başa düşməyimiz lazımdır.

Field nədir?

Field,sadə dillə desək,sinfin içində təyin olunan və sinfin özünə məxsus dəyişənlərdir,yəni ki,sinifdəki metodun içində təyin olunan dəyişən field sayılmır :

Məsələn yuxarıdakı kodda metoddan əvvəl təyin olunan dəyişənlər field sayılır,metodun içində təyin olunan greetingText dəyişəni isə lokal dəyişən sayılır,field yox.Bu dəyişənlərə yazıldığı anda dəyər ötürülə bilər(hard coding) və struct ilə class fərqlərdən biri də budur.Biz fieldların əlçatanlığını bir neçə cür edə bilərik : private(ki default halı budur),protected,public və s. Amma daha çox önərilən yol onları private etməkdir,ki bunu da irəlidə müzakirə edəcəyik.

Property nədir?

Kapsullamaq üçün biz property-lərə ehtiyac duyuruq.Property-lər sinfin dəyişənlərinə (field) dəyər ötürmək və onların dəyərini qaytarmaq üçün istifadə edilir (set&get).Field-lar kimi onlar da sinfin üzvləri sayılır,lakin bunu ağlınızda saxlamağınızda fayda var ki,property-lər özündə hər hansı bir dəyər saxlamır,onlar sadəcə,loru dildə desək,elçi rolunu oynayırlar,C# proqramçılar ona “ağıllı field” da deyir.

Nümunə üzərindən baxaq :

Yuxarıda metodlarla ifadə etdiyimiz kapsullamaq məntiqini bu dəfə sırf kapsullamaq məqsədi güdən strukturla-property ilə ifadə etdik.Burda “_namefield sayılarkən, “name” isə property sayılır.Yuxarıda “get” hissəsi daxilində “_name” field-inin dəyərin qaytararkən, “set” hissəsi daxilində həmin field-a dəyər ötürmüş oluruq. “Praktikada göstər!” dediyinizi eşidirəm sanki,baxaq onda :

Məhəmməd

10-cu sətirdə yazılan kodla set mexanizmini işə saldıq, “_name” field-nə dəyərini “Məhəmməd” dəyərini mənimsətdik(value=“Məhəmməd”).

11-ci sətirdə yazılan kodla isə,get mexanizmini işə saldıq və “_name” field-nin dəyərini qaytardıq.

Bunlardan ikisi də olmalı deyil,ikisindən birini də işlədə bilərik və bu zaman təkcə oxunula bilən(“read-only”) və ya yazıla bilən(“write-only”) field-lar olacaq :

Auto-Property

Əgər biz field-ın əl çatanlığı barədə heç bir şərt qoymayacağıqsa,auto-property özəlliyindən istifadə edə bilərik :

Digər siniflərdən bu property-lərə çağırdıqda,kompayler tərəfindən avtomatik olaraq arxa planda anonim və private bir field yaradılır.

Auto-property-nin public field-dan üstün tərəflərindən biri də get&set özəlliklərinin əlçatanlığını dəyişdirə bilməkdir.Məsələn get olduğu kimi qaldığı halda,set özəlliyini protected edərək dəyər ötürmək əlçatanlığını məhdudlaşdıra bilərik :

İnterfeyslərdə field-ların işlənə bilməməsi,auto-property-lərin işlənə bilməsi də ayrı bir üstünlükdür.

Başqa bir üstünlüyü də sinfini miras alan siniflər tərəfindən dəyişdirilə bilməsi,yəni override oluna bilməsidir :

İşçi Məhəmməd Sadıqzadə

Obyekt yönlü proqramlaşdırmanın onurğa hissələrindən birini izah etməyə çalışdım bu məqalədə.Gördüyümüz işdəki bütün zəhməti adi bir məhdudiyyət qoyulmamış data yox edə bilər,ona görə də bacardığımız qədər bu prinsipi praktikada tətbiq etməyimiz lazımdır.

Xoş kodlamalar,xudahafiz!

--

--