Kapsülleme(Encapsulation) Hk.
-
Merhaba arkadaslar nesne tabanlı programlamaya yeni basladım ve işi bilenlere bir sorum olacak.
Encapsulation bildiginiz gibi oop jargonunda sınıfın gereksiz ayrıntılarını nesne kullanıcısından saklamak ve daha çok sınıf alanlarına değer girerken bu değerleri bir kontrolden geçirmek olarak tanımlanıyor.
Fakat bunu yapmak için neden encapsulationa ihtiyaç duyulur anlamıyorum.
Veririnin girildiği yerde bir if blogu içinde de bu kontroller yapılamaz mı?
Örneğin:
if(int.parse(console.readline()) > 1000000)
{
console.write("bu fiyatta araba olmaz");
}else
{
arac1.fiyat = int.parse(console.readline());
}gibi...
Aydınlatanlara teşekkürler...
-
ben bunu bi tek cisco da hatırlıyorum.
Umarım yardım eden çıkabilir.
-
Hocam bu veriyi program içerisinde 100 farklı yerde alıyorsan ne olacak? :) Hepsinde ayrı ayrı mı kontrol edeceksin?
Ayrıca encapsulation'ın tanımı bu değil tam olarak. Sınıf değişkenlerine adamın kafasına göre erişmesini engelliyorsun. En basitinden sınıfında araba modeli diye string bi değişken var. Sen bunu private yaparsın ve bi setter fonksiyon yazarsın diyelim ki BMW veya Mercedes girilirse atama yaparsın. Diğer tüm durumlarda boş yaparsın. Ama sen fonksiyon yazmak yerine bu değişkeni public yaparsan adam içine istediğini yazar. Ve kontrol ederim diyorsan da kontrol işlemini her yerde tekrar yazman gerekir.
-
NmC bunu yazdı
Hocam bu veriyi program içerisinde 100 farklı yerde alıyorsan ne olacak? :) Hepsinde ayrı ayrı mı kontrol edeceksin?
Ayrıca encapsulation'ın tanımı bu değil tam olarak. Sınıf değişkenlerine adamın kafasına göre erişmesini engelliyorsun. En basitinden sınıfında araba modeli diye string bi değişken var. Sen bunu private yaparsın ve bi setter fonksiyon yazarsın diyelim ki BMW veya Mercedes girilirse atama yaparsın. Diğer tüm durumlarda boş yaparsın. Ama sen fonksiyon yazmak yerine bu değişkeni public yaparsan adam içine istediğini yazar. Ve kontrol ederim diyorsan da kontrol işlemini her yerde tekrar yazman gerekir.
aynen mantık bu.
http://www.serefakyuz.com/2011/06/csharpta-get-ve-set-metodlari.html
şuda güzel bir örnek olabilir.
-
NmC bunu yazdı
Hocam bu veriyi program içerisinde 100 farklı yerde alıyorsan ne olacak? :) Hepsinde ayrı ayrı mı kontrol edeceksin?
Ayrıca encapsulation'ın tanımı bu değil tam olarak. Sınıf değişkenlerine adamın kafasına göre erişmesini engelliyorsun. En basitinden sınıfında araba modeli diye string bi değişken var. Sen bunu private yaparsın ve bi setter fonksiyon yazarsın diyelim ki BMW veya Mercedes girilirse atama yaparsın. Diğer tüm durumlarda boş yaparsın. Ama sen fonksiyon yazmak yerine bu değişkeni public yaparsan adam içine istediğini yazar. Ve kontrol ederim diyorsan da kontrol işlemini her yerde tekrar yazman gerekir.
Hocam teşekkür ederim anlaşılır olmuş, oop tecrübesi olmadığı için takılıyorum böyle şeylere :)
-
Nmc reyiz çok güzel açıklamış ibret aldım.
-
Sadece atana değer denetlemek haricinde değişkene erişimide denetlemiş oluyorsun.
Ayrıca değişken her çağrıldığında get içindeki code bloğu ilele farklı işlemler yapıyorusun.Hem bu program güvenliği içinde önemli bildiğim kadarıyla...
Birde işini çok kolaylaştırıyor. Her atama yapıldığında vaya çağrıldığında karar yapısı kullanmak eziyet ve programcılar tembel adamlar :D -
hocam bildigim kadariyla encapsulation konusunu anlatmaya calisayim.
encapsulation basit bi bakis acisiyla sinifa ozgu verileri gizlemek ve o verilere erisimde belli fonksiyonlari kullanarak ( bu fonksiyonlar parametre dogrulama, sinif icinde o veri degistiginde baska verilerinde degistirilme gereksinimini karsilama, vs.. gibi islere yarayabilir )
oncelikle evet encapsulation kavrami veri gizlemekle alakalidir. fakat veri gizlemenin faydalari yada nerede ise yaradigi hakkinda cogu kaynak net bi bilgi vermez.
bir ornekle anlatmaya calisayim.
ornegin bi is icin yazdigin bir sinif var. bu sinif bir kisiye ait bilgileri tutan bir sinif. bu sinif, is bu ya, kisiye ait hem dogum yilini hem de yasini tutuyo ( tamamen sacmalik, fakat aklima baska bi ornek gelmedi ) [ kod daginik kusura bakmayin lutfen :) ]
encapsulation kavramini daha iyi anlatmak acisinda ilk olarak kotu kodu ( gorece :) ) ortaya koyucam.
#include <stdio.h> class Person { public: int Age; int BornYear; }; int main(void) { Person p; p.Age = 23; p.BornYear = 1991; return printf("%d", p.Age); }oncelikle kod'a baktigimiz zaman encapsulation a dair hic bir belirti yok. sinifin butun verisi ortada ve kolayca manipule edilebilir. ornegin bir insan 1800 yilinda dogmus ve 13 yasinda ayarlanabilir. ikisi de sacmalik :)
ve biz, hem veri elemanlarini ayarlarken/okurken kontrolu saglamaliyiz hem de bu islemleri kolaylastirabilicek bir arayuz yazmaliyiz. bu noktada devreye encapsulation giriyo iste. yani veri elemanlari dis mudahalelere kapali olmali ve yalnizca bizim sundugumuz arayuz ile erisilebilir olmali.
asagida da bu probleme cozum getirmeye calistik.
#include <stdio.h> class Person { public: Person(int BornYear) { if (!SetBornYear(BornYear)) { throw "there can't be a person like that"; } } int GetBornYear() { return m_bornyear; } bool SetBornYear(int BornYear) { if (BornYear < 1800) { // there cant be any person who was born in 1800 return false; } m_bornyear = BornYear; m_age = 2014 - BornYear; return true; } int GetAge() { return m_age; } private: int m_age; int m_bornyear; }; int main(void) { Person p(1999); p.SetBornYear(1991); return printf("%d", p.GetAge()); }gordugumuz gibi SetBornYear fonksiyonu ayni anda hem m_age hemde m_bornyear private degiskenleri set ediyor. yani bizim istegimiz disinda bir duzenleme sozkonusu degil.
ve yukarda soyledigimiz problem, 1800 yilindan kucuk dogumlulara hata firlatiyoruz.
ve belkide en buyuk fayda olarak, encapsulation sayesinde, bir gun gelir m_age degiskenini ortadan kaldirmak istersek eger.(yani sinifin gizli degiskenlerinde ki herhangi bi degisiklik) arayuzumuzu kullanan kod bloklarinda degisiklik yapmadan[yada en az sekilde yaparak], yalnizca Person sinifinin internal larinda bi kac degisiklik yaparak butun sistemin calismasina oldugu gibi devam etmesini saglayabiliriz.
ornegin 3 sene sonra kendi kendinize [yada takimca], 'yahu bu m_age burda fazla, ben bunu m_bornyear'i kullanarak hesaplayabilirim.' dediginizde eger kodunuzu buna gore yazmadiysaniz, 'ama bu saatten sonra olmaz, kim bilir kac modul o m_age'i kullaniyordur' gibi bir hayal kirikligiyla son bulacaksiniz. ancak eger encapsulation kavramindan bihaber degilseniz, ve kodunu bu kriterleri dusunerek yazdiysaniz, 'hemen degistirelim yahu, elimize mi yapisicak' gibi bir cumleyle baslayan ve mutlu edici bir sona dogru ilerleyen yola giriceksiniz. :) asagida da m_age'in cikarilmis olmasina ragmen main fonksiyonunda hicbir degisiklik olmamasina bir ornek var.
#include <stdio.h> class Person { public: Person() { m_bornyear = 0; } Person(int BornYear) { if (!SetBornYear(BornYear)) { throw "there can't be a person like that"; } } int GetBornYear() { return m_bornyear; } bool SetBornYear(int BornYear) { if (BornYear < 1800) { // there cant be any person who was born in 1800 return false; } m_bornyear = BornYear; return true; } int GetAge() { return 2014 - m_bornyear; } private: int m_bornyear; }; int main(void) { Person p(1999); p.SetBornYear(1991); return printf("%d", p.GetAge()); }umarim anlatabilmisimdir.
renegadealien tarafından 22/Oca/14 17:27 tarihinde düzenlenmiştir -
rene hocam yazını okudum, uğraşmışsın teşekkür ederim. anlamadığım tek bir şey var o da buradaki dış müdahale ne oluyor, nasıl bir dış müdahale nesnenin özelliklerine erişebilir ki?
Fdumanli tarafından 23/Oca/14 14:23 tarihinde düzenlenmiştir -
oop programlamada dis mudahale gorece biseydir hocam. ornegin ben bir sinif yaziyorsam ve o sinifin adi Person ise, baska herhangi bir sinifin bu sinifin veri elemanlarina erismesi (public veri elemanlarina elbette, private lar zaten bu tip mudahalalere kapalidir), bunlari manipule etmesi dis mudahale olarak nitelendirilir. ( yani ben oyle niteledim :) )
Soz gelimi, People diye bir sinifimiz oldugunu dusunelim ve bu sinifin bir cok Person sinifindan uretilmis nesne barindirdigini dusunelim [array]. People sinifi Person sinifina ait veri elemanlarina herhangi bir arayuzden gecmeden erisirse burada encapsulation dan soz edilemez. direct manipulation soz konusudur ve eger ki durum bu ise, yukarida bahsettigim yararli durumlar soz konusu degildir. ( tekrarlamak gerekirse; parametre kontrolu, sinifin internallarinda ki degisikligin diger siniflara etki etmemesi veya bu etkinin en aza dusurulmesi, herhangi bir veri elemani duzenlendiginde onunla iliskide olan diger elemanlarin strict bir sekilde duzenlenmesi [ bu duzenleme ihtiyacinin diger siniflar tarafindan bilinir olmasi gerekliliginin ortadan kaldirilmasi da buna dahil ] vs vs. )
yani kisaca hocam, oop da dis mihratlar demek, o sinif acisindan bakildiginda, diger siniflar demek..
Person acisindan People, People acisindan ise Person dis mihrattir :) ve birbirlerinin veri elemanlarina mudahalesi, dis mudahaledir.
renegadealien tarafından 23/Oca/14 15:29 tarihinde düzenlenmiştir -
inceleyeyim
