Oop - Nesne Yönelimli Programlama
Artık ister istemez her programcının bulaştığı bu teknik hakkında sayısız makale yazılmıştır bu güne kadar. Bu makale de onlardan biri
Kavramlar ve Örnekler
Evet. Matrix. İşin özü bu. OOP tekniğinde kavramları bilgisayara tanıtırsınız, tanımlarsınız. Sonra bu kavramların bir örneğini oluşturup tepe tepe kullanırsınız.
Kavram nedir, örnek nedir?
Örneğin cep telefonu diye bir kavram var. Aslında cep telefonu yok.* Cep telefonu numuneleri (örnekleri) bizim gördüklerimiz. Cep telefonu kavramı sadece bizim zihnimizdeki bir tanımdır. Cep telefonu denildiğinde aklımıza üzerinde tuşları, küçük bir ekranıyla bik bik öten bir cihaz gelir. Ama cebimizdeki telefon gerçektir, vardır. Ve cep telefonu kavramının yaşayan bir örneğidir. Bu örneğin mesela rengi ne biliim kırmızıdır, altında yeşil ışık yanan şeffaf tuşları vardır. Ama kavramda böyle şeyler olmaz. Sadece tuşlar ve ekrandan ibaret bir cihaz gelir aklımıza.
İşin felsefesini bir kenara bırakıp artık şu cep telefonu kavramını bilgisayara anlatalım. Daha sonra da bir örneğini oluşturur telefon ederiz eşe dosta. Dilimiz C#.
Bilgisayar ne anlar cep telefonundan!
Evet yukarıda CepTelefonu kavramını (sınıfını, türünü, tipini) tanımladık. Buna göre her cep telefonunun marka, model ve renk adında özellikleri, Ac(), Kapat(), NumaraAra() adında davranışları vardır. Ayrıca telefon kullanıcılarının çok da bilmesi gerekmeyen seriNo, frekans adında iki içsel özelliği ve agaBaglan() -ağa bağlan- adında içsel bir davranışı vardır. Not: Bundan sonra kavrama sınıf (class), özelliklere özellik (property, field), davranışlara metod (method) diyeceğiz.
Evet bugünkü dersimiz bu kadar. Şimdi soruları alalım.
Sordular cevap verdik
Soru : Bütün bu süslü parantezler, noktalı virgüller de nedir?
Cevap: Abi sen istersen şu siteyi bi dolaş da öyle gel: http://www.csharpnedir.com.
Soru : Ama ben hepsini anlatıcan zannediyodum!?
Cevap: Hadi canım, hadi güzelim.
Soru : public ne?
Cevap: Umumi demek. Örneğin CepTelefonu sınıfının kendisi umumidir, CepTelefonu'nun rengi de öyledir. Herkes tarafından görülebilir, öğrenilebilir. Ancak seriNo özelliği private'dır. Yani özeldir. Bu sınıfın içindeyken görülebilir ancak. Dışardan görülemez. ayrıca bkz: access modifiers, encapsulation.
Soru : Yukarıda tanımlanan telefonun rengi nedir?
Cevap: Kavramın rengi olur mu hiç? Bana mutluluğun resmini çizebilir misin Abidin?
Yukarıdaki tanımdan sadece cep telefonlarının renk diye bir özelliğinin olduğu anlaşılır. Kendine has rengi olan cep telefonları bu kavramın (sınıfın) bir örneği olabilir ancak.
Soru : Anlaşıldı bu telefonun bir örneğini oluşturmazsak kavram olarak kalacak. Peki bu telefonun bir örneğini nasıl oluşturabiliriz?
Cevap: new operatorunü kullanarak. mesela myCep = new CepTelefonu(); yazdığınız zaman bu telefonun bir örneğini (instance) oluşturmuş olursunuz. Artık bu yaşayan bir örnektir ve henüz üretim aşamasındadır. Şimdi bu telefonun markasını Nokia, modelini 3310, rengini kırmızı yapalım. Sonra da bu telefonla 0532 325 34XX'i arayalım:
Nedir bu encapsulation?
Information hiding de denilen bu kavram bir sınıf içindeki bilgiyi, bilmesi gerekmeyen zevattan gizleme anlamına gelir. Evet bilgiyi gizlemek önemlidir. Her bilgi görülebilir, değiştirilebilir olursa olmaz. Neymiş? efenim? Bilgi gizlenecekmiş. Şimdi bazı arkadaşlar bilgiyi paylaşmanın öneminden falan bahsetmek isteyebilir. Ama kazın ayağı öyle değil işte. Paylaşmak her zaman güzel olmuyor. Bunu ben bizzat test ettim, güzel olmadığını gördüm. Kredi kartı bilgilerimi paylaşmıştım, ay sonunda yemediğim yemeklerin, dokunamadığım kitapların parasını ödedim. Demek ki encapsulation iyi bir şey.
Encapsulation iyi bir şey!
Encapsulation frenkçesiyle "hiding implementation details from presentation", Türkçesiyle "çalışma detaylarını sunumdan gizlemek" şeklinde özetlenir. Bu şu demek: Önceki dersimizde CepTelefonu sınıfı için tanımladığımız Marka, Model gibi public özellikler CepTelefonu sınıfının görünen yüzüdür. Yani presentation. Dışardan bakan sadece bu public alanları ve metodları görebilir. Ama sınıfın içine girdiğimizde seriNo, frekans gibi başka private (gizli, özel) özellikler görüyoruz. Bunlar tamamen implementation (CepTelefonu'nun çalışması) ile ilgili şeyler. Dışarıdan bilinmesi gerekmiyor. Hele hele dışarıdan değiştirilmemeliler yoksa telefon bozulabilir.
Özet
Özetlersek;
- Sınıflarımızda dışarıdan bilinmesi gerekmeyen özellikleri ve metodları gizlemek için private deyimini kullanıyoruz.
- Private özellikler sadece sınıfın içinden görülebilen, değiştirilebilen özelliklerdir.
- Bilinmesinde ve/veya/yahut/ya da değiştirilmesinde sakınca olmayan özellik ve metodları ise public yapıyoruz.
Örnek
Örneklersek;
Inheritance nedir?
Inheritance (Türkçesiyle miras ya da kalıtım) bir sınıfın başka sınıfın özellikleri üzerine kurulması, geliştirilmesidir. Hemen örnek verelim, çünkü bu tür soyut tanımlar anlaşılabilirliği katletmekten başka bir işe yaramıyor.
Örneğin elimizde Telefon adında bir sınıf var. Bu sınıf bütün telefonlarda ortak olan tüm temel özellliklere, metodlara sahip olsun. Biz bundan bir CepTelefonu sınıfı oluşturmak istiyoruz. Bu durumda CepTelefonu daha özel bir sınıf, Telefon sınıfı ise daha genel bir sınıf olmuş olur.
Şimdi yukarıdaki örneği inceleyelim. Telefon sınıfının 4 özelliği ve bir metodu var. Bu özellikler bütün telefonlarda olan en temel özellikler. Bir marka ve modele sahip olmak, numara çevirip birilerini aramak (NumaraAra metodu) her telefondan beklenen en temel özelliklerdir. Öyle mi? Evet. Cep telefonlarında da vardır bu özellikler, dedelerimizin kullandığı ilk telefonlarda da. Ama dikkat ederseniz CepTelefonu sınıfımızda bu özellikler tanımlamamış. Cep telefonu sınıfında marka özelliği yok mesela. Onda sadece cep telefonlarında olabilen özellikler tanımlı. Nasıl yani cep telefonunun markası olmaz mı? Bir şey daha dikkatinizi çektiyse neden böyle olduğunu anlamak üzeresiniz demektir: "class CepTelefonu : Telefon" Bu şu demek : CepTelefonu sınıfı Telefon sınıfının özelliklerini miras alıyor ya da CepTelefonu Telefon sınıfından türetilmiştir. Bu durumda CepTelefonu sınıfı Telefon sınıfının tüm özelliklerine otomatikman sahip olmuş olur.
OOP terminolojisinde ":" operatörü is-a şeklinde okunur. Yani "CepTelefonu : Telefon; CepTelefonu is a Telefon" şeklinde okunur. Türkçesiyle "CepTelefonu bir Telefon'dur". Öyle değil midir? Öyledir. CepTelefonu bir Telefon ise, ve biz daha önce Telefon sınıfını tanımlamışsak, CepTelefonu sınıfının bir Telefon olduğunu belirtmek yeterli olmaktadır. Tekrar aynı özellikleri CepTelefonu sınıfına yazmaya gerek yok.
Sınıflar arasındaki bu tür ilişkiye "is-a relationship" denir. Örneğin;
YunusBaligi : MemeliHayvan => YunusBaligi bir MemeliHayvan'dır.
MemeliHayvan : Hayvan => MemeliHayvan bir Hayvan'dır.
Hayvan : CanliVarlik => Hayvan bir CanliVarlik'dir.
Bu durumda YunusBaligi sınıfı MemeliHayvan sınıfının tüm özelliklerine, o da Hayvan sınıfının tüm özelliklerine, o da CanliVarlik sınıfının tüm özelliklerine sahiptir.
CepTelefonu sınıfını kullanarak aşağıdaki gibi bir kod yazabiliriz:
Evet bugünkü dersimiz de bu kadar. Bir dahaki dersimizde polimorphism (çok şekillilik) konusuna değineceğiz.
Kaynak www.bilisim-kulubu.com/makale/makale.php
Evet. Matrix. İşin özü bu. OOP tekniğinde kavramları bilgisayara tanıtırsınız, tanımlarsınız. Sonra bu kavramların bir örneğini oluşturup tepe tepe kullanırsınız.
Kavram nedir, örnek nedir?
Örneğin cep telefonu diye bir kavram var. Aslında cep telefonu yok.* Cep telefonu numuneleri (örnekleri) bizim gördüklerimiz. Cep telefonu kavramı sadece bizim zihnimizdeki bir tanımdır. Cep telefonu denildiğinde aklımıza üzerinde tuşları, küçük bir ekranıyla bik bik öten bir cihaz gelir. Ama cebimizdeki telefon gerçektir, vardır. Ve cep telefonu kavramının yaşayan bir örneğidir. Bu örneğin mesela rengi ne biliim kırmızıdır, altında yeşil ışık yanan şeffaf tuşları vardır. Ama kavramda böyle şeyler olmaz. Sadece tuşlar ve ekrandan ibaret bir cihaz gelir aklımıza.
İşin felsefesini bir kenara bırakıp artık şu cep telefonu kavramını bilgisayara anlatalım. Daha sonra da bir örneğini oluşturur telefon ederiz eşe dosta. Dilimiz C#.
Bilgisayar ne anlar cep telefonundan!
public class CepTelefonu
{
public string Marka;
public string Model;
public string Renk;
public void Ac(){
//...
}
public void Kapat(){
//...
}
public void NumaraAra(string numara){
//...
}
private int seriNo;
private int frekans;
protected virtual AgaBaglan(string adres){}
}
{
public string Marka;
public string Model;
public string Renk;
public void Ac(){
//...
}
public void Kapat(){
//...
}
public void NumaraAra(string numara){
//...
}
private int seriNo;
private int frekans;
protected virtual AgaBaglan(string adres){}
}
Evet yukarıda CepTelefonu kavramını (sınıfını, türünü, tipini) tanımladık. Buna göre her cep telefonunun marka, model ve renk adında özellikleri, Ac(), Kapat(), NumaraAra() adında davranışları vardır. Ayrıca telefon kullanıcılarının çok da bilmesi gerekmeyen seriNo, frekans adında iki içsel özelliği ve agaBaglan() -ağa bağlan- adında içsel bir davranışı vardır. Not: Bundan sonra kavrama sınıf (class), özelliklere özellik (property, field), davranışlara metod (method) diyeceğiz.
Evet bugünkü dersimiz bu kadar. Şimdi soruları alalım.
Sordular cevap verdik
Soru : Bütün bu süslü parantezler, noktalı virgüller de nedir?
Cevap: Abi sen istersen şu siteyi bi dolaş da öyle gel: http://www.csharpnedir.com.
Soru : Ama ben hepsini anlatıcan zannediyodum!?
Cevap: Hadi canım, hadi güzelim.
Soru : public ne?
Cevap: Umumi demek. Örneğin CepTelefonu sınıfının kendisi umumidir, CepTelefonu'nun rengi de öyledir. Herkes tarafından görülebilir, öğrenilebilir. Ancak seriNo özelliği private'dır. Yani özeldir. Bu sınıfın içindeyken görülebilir ancak. Dışardan görülemez. ayrıca bkz: access modifiers, encapsulation.
Soru : Yukarıda tanımlanan telefonun rengi nedir?
Cevap: Kavramın rengi olur mu hiç? Bana mutluluğun resmini çizebilir misin Abidin?
Yukarıdaki tanımdan sadece cep telefonlarının renk diye bir özelliğinin olduğu anlaşılır. Kendine has rengi olan cep telefonları bu kavramın (sınıfın) bir örneği olabilir ancak.
Soru : Anlaşıldı bu telefonun bir örneğini oluşturmazsak kavram olarak kalacak. Peki bu telefonun bir örneğini nasıl oluşturabiliriz?
Cevap: new operatorunü kullanarak. mesela myCep = new CepTelefonu(); yazdığınız zaman bu telefonun bir örneğini (instance) oluşturmuş olursunuz. Artık bu yaşayan bir örnektir ve henüz üretim aşamasındadır. Şimdi bu telefonun markasını Nokia, modelini 3310, rengini kırmızı yapalım. Sonra da bu telefonla 0532 325 34XX'i arayalım:
CepTelefonu myCep = new CepTelefonu();
myCep.Marka = "Nokia";
myCep.Model = "3310";
myCep.Renk = "Kırmızı";
myCep.NumaraAra("0532 325 34XX");
myCep.Marka = "Nokia";
myCep.Model = "3310";
myCep.Renk = "Kırmızı";
myCep.NumaraAra("0532 325 34XX");
Nedir bu encapsulation?
Information hiding de denilen bu kavram bir sınıf içindeki bilgiyi, bilmesi gerekmeyen zevattan gizleme anlamına gelir. Evet bilgiyi gizlemek önemlidir. Her bilgi görülebilir, değiştirilebilir olursa olmaz. Neymiş? efenim? Bilgi gizlenecekmiş. Şimdi bazı arkadaşlar bilgiyi paylaşmanın öneminden falan bahsetmek isteyebilir. Ama kazın ayağı öyle değil işte. Paylaşmak her zaman güzel olmuyor. Bunu ben bizzat test ettim, güzel olmadığını gördüm. Kredi kartı bilgilerimi paylaşmıştım, ay sonunda yemediğim yemeklerin, dokunamadığım kitapların parasını ödedim. Demek ki encapsulation iyi bir şey.
Encapsulation iyi bir şey!
Encapsulation frenkçesiyle "hiding implementation details from presentation", Türkçesiyle "çalışma detaylarını sunumdan gizlemek" şeklinde özetlenir. Bu şu demek: Önceki dersimizde CepTelefonu sınıfı için tanımladığımız Marka, Model gibi public özellikler CepTelefonu sınıfının görünen yüzüdür. Yani presentation. Dışardan bakan sadece bu public alanları ve metodları görebilir. Ama sınıfın içine girdiğimizde seriNo, frekans gibi başka private (gizli, özel) özellikler görüyoruz. Bunlar tamamen implementation (CepTelefonu'nun çalışması) ile ilgili şeyler. Dışarıdan bilinmesi gerekmiyor. Hele hele dışarıdan değiştirilmemeliler yoksa telefon bozulabilir.
Özet
Özetlersek;
- Sınıflarımızda dışarıdan bilinmesi gerekmeyen özellikleri ve metodları gizlemek için private deyimini kullanıyoruz.
- Private özellikler sadece sınıfın içinden görülebilen, değiştirilebilen özelliklerdir.
- Bilinmesinde ve/veya/yahut/ya da değiştirilmesinde sakınca olmayan özellik ve metodları ise public yapıyoruz.
Örnek
Örneklersek;
public class CepTelefonu
{
public string Marka;
public string Model;
public string Renk;
public void Ac(){
//...
}
public void Kapat(){
//...
}
public void NumaraAra(string numara){
//...
}
private int seriNo;
private int frekans;
protected virtual AgaBaglan(string adres){}
}
public class App
{
public static void Main()
{
CepTelefonu cep = new CepTelefonu();
cep.Marka = "Nokia"; // Marka public olduğu için okunabilir ve değiştirilebilir.
cep.seriNo = "7732"; // seriNo private olduğu için bu satır hataya neden olur.
}
}
{
public string Marka;
public string Model;
public string Renk;
public void Ac(){
//...
}
public void Kapat(){
//...
}
public void NumaraAra(string numara){
//...
}
private int seriNo;
private int frekans;
protected virtual AgaBaglan(string adres){}
}
public class App
{
public static void Main()
{
CepTelefonu cep = new CepTelefonu();
cep.Marka = "Nokia"; // Marka public olduğu için okunabilir ve değiştirilebilir.
cep.seriNo = "7732"; // seriNo private olduğu için bu satır hataya neden olur.
}
}
Inheritance nedir?
Inheritance (Türkçesiyle miras ya da kalıtım) bir sınıfın başka sınıfın özellikleri üzerine kurulması, geliştirilmesidir. Hemen örnek verelim, çünkü bu tür soyut tanımlar anlaşılabilirliği katletmekten başka bir işe yaramıyor.
Örneğin elimizde Telefon adında bir sınıf var. Bu sınıf bütün telefonlarda ortak olan tüm temel özellliklere, metodlara sahip olsun. Biz bundan bir CepTelefonu sınıfı oluşturmak istiyoruz. Bu durumda CepTelefonu daha özel bir sınıf, Telefon sınıfı ise daha genel bir sınıf olmuş olur.
public class Telefon
{
public string Marka;
public string Model;
public int TusSayisi;
private bool digitalMi;
public void NumaraAra(string numara)
{
// numara arama işi...
}
}
public class CepTelefonu : Telefon
{
public TimeSpan PilOmru;
public bool GPRSVar;
public ArrayList RehberdekiNumaralar;
public void RehbereNumaraEkle(string numara)
{
RehberdekiNumaralar.Add(numara);
}
}
{
public string Marka;
public string Model;
public int TusSayisi;
private bool digitalMi;
public void NumaraAra(string numara)
{
// numara arama işi...
}
}
public class CepTelefonu : Telefon
{
public TimeSpan PilOmru;
public bool GPRSVar;
public ArrayList RehberdekiNumaralar;
public void RehbereNumaraEkle(string numara)
{
RehberdekiNumaralar.Add(numara);
}
}
Şimdi yukarıdaki örneği inceleyelim. Telefon sınıfının 4 özelliği ve bir metodu var. Bu özellikler bütün telefonlarda olan en temel özellikler. Bir marka ve modele sahip olmak, numara çevirip birilerini aramak (NumaraAra metodu) her telefondan beklenen en temel özelliklerdir. Öyle mi? Evet. Cep telefonlarında da vardır bu özellikler, dedelerimizin kullandığı ilk telefonlarda da. Ama dikkat ederseniz CepTelefonu sınıfımızda bu özellikler tanımlamamış. Cep telefonu sınıfında marka özelliği yok mesela. Onda sadece cep telefonlarında olabilen özellikler tanımlı. Nasıl yani cep telefonunun markası olmaz mı? Bir şey daha dikkatinizi çektiyse neden böyle olduğunu anlamak üzeresiniz demektir: "class CepTelefonu : Telefon" Bu şu demek : CepTelefonu sınıfı Telefon sınıfının özelliklerini miras alıyor ya da CepTelefonu Telefon sınıfından türetilmiştir. Bu durumda CepTelefonu sınıfı Telefon sınıfının tüm özelliklerine otomatikman sahip olmuş olur.
OOP terminolojisinde ":" operatörü is-a şeklinde okunur. Yani "CepTelefonu : Telefon; CepTelefonu is a Telefon" şeklinde okunur. Türkçesiyle "CepTelefonu bir Telefon'dur". Öyle değil midir? Öyledir. CepTelefonu bir Telefon ise, ve biz daha önce Telefon sınıfını tanımlamışsak, CepTelefonu sınıfının bir Telefon olduğunu belirtmek yeterli olmaktadır. Tekrar aynı özellikleri CepTelefonu sınıfına yazmaya gerek yok.
Sınıflar arasındaki bu tür ilişkiye "is-a relationship" denir. Örneğin;
YunusBaligi : MemeliHayvan => YunusBaligi bir MemeliHayvan'dır.
MemeliHayvan : Hayvan => MemeliHayvan bir Hayvan'dır.
Hayvan : CanliVarlik => Hayvan bir CanliVarlik'dir.
Bu durumda YunusBaligi sınıfı MemeliHayvan sınıfının tüm özelliklerine, o da Hayvan sınıfının tüm özelliklerine, o da CanliVarlik sınıfının tüm özelliklerine sahiptir.
CepTelefonu sınıfını kullanarak aşağıdaki gibi bir kod yazabiliriz:
CepTelefonu myNokia = new CepTelefonu();
myNokia.Marka = "Nokia"; // Telefon sınıfından gelen özellik
myNokia.Model = "3310"; // Telefon sınıfından gelen özellik
myNokia.PilOmru = new TimeSpan(7828367); // CepTelefonu sınıfının kendi özelliği
myNokia.RehbereNumaraEkle("8736876"); // CepTelefonu sınıfının kendi metodu
myNokia.NumaraAra("9836523"); // Telefon sınıfından gelen metod
myNokia.Marka = "Nokia"; // Telefon sınıfından gelen özellik
myNokia.Model = "3310"; // Telefon sınıfından gelen özellik
myNokia.PilOmru = new TimeSpan(7828367); // CepTelefonu sınıfının kendi özelliği
myNokia.RehbereNumaraEkle("8736876"); // CepTelefonu sınıfının kendi metodu
myNokia.NumaraAra("9836523"); // Telefon sınıfından gelen metod
Evet bugünkü dersimiz de bu kadar. Bir dahaki dersimizde polimorphism (çok şekillilik) konusuna değineceğiz.
Kaynak www.bilisim-kulubu.com/makale/makale.php
Yorumunuzu Ekleyin