Oop - Nesne Yönelimli Programlama

Transkript

Oop - Nesne Yönelimli Programlama
Oop - Nesne Yönelimli Programlama
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!
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;
www.dijitalders.com
Oop - Nesne Yönelimli Programlama
1
Oop - Nesne Yönelimli Programlama
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");
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!
www.dijitalders.com
Oop - Nesne Yönelimli Programlama
2
Oop - Nesne Yönelimli Programlama
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.
}
}
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.
www.dijitalders.com
Oop - Nesne Yönelimli Programlama
3
Oop - Nesne Yönelimli Programlama
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);
}
}
Ş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");
www.dijitalders.com
// CepTelefonu sınıfının kendi metodu
Oop - Nesne Yönelimli Programlama
4
Oop - Nesne Yönelimli Programlama
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
www.dijitalders.com
Oop - Nesne Yönelimli Programlama
5

Benzer belgeler