Konular

EBooklar

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

OOP - Nesne Yönelimli ProgramlamaKavramlar 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;

    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!

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.
 
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");    // 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


Yorumlar

  1. olkun
    Normalde php için oop öğrenmeye çalışırken rastladım derslerinize zaten çok benziyor ve gördüğüm en güzel anlatımlardan biri teşekkürler.
    29 Ocak 2013 09:00:50, Salı Like



  • Kurallı İfadeler (regex Engine)
  • Kurallı İfadeler (regex Engine) ~ 32,811

    Bir regex'in gerçekte nasıl çalıştığını bilmek daha efektif çalışan regex ifadeleri oluşturmamızı ve regex'leri daha isabetli oluşturmamızı sağlar. Bu yazımızda oluşturduğunuz regex ifadelerinin neden beklediğiniz sonuçları vermediğini ve umduğunuz eşleşm...



  • PHP ile PDF dosya oluşturmak
  • PHP ile PDF dosya oluşturmak ~ 26,084

    Php ile yeni bir pdf dosyası oluşturmak : Öncelikle php ile pdf işlemleri yapmak için bir pdf kütüphanesine ihtiyacınız olacak



  • PHP nedir?
  • PHP nedir? ~ 24,729

    HTML kodlarının arasına yerleştirilmiş php kodlarından ayrıştırıp işleyerek sonuçta saf HTML formatında bir çıktı üretmek ve Web sunucusuna iletmektir.


  • $_FILES
  • $_FILES ~ 23,430

    Örnek kod ve açıklamalar



  • Xampp Kurulumu ~ 19,472

    Xampp apache, mysql, php ve phpmyadmin için kolay ve basit kurulum sağlayan bir uygulamadır.




  • Php İle Excel Dosyası Oluşturmak
  • Php İle Excel Dosyası Oluşturmak ~ 18,588

    Genelde, herhangi bir biçimlendirme söz konusu olmadığında, veritabanındaki bir bilgiyi ya da başka bir tabloyu excel ortamına aktarmak için csv yöntemini kullanırım. Bu yöntem herkesin bildiği gibi, her sütunu tab ya da noktalı virgül gibi bir karakterle...


  • Verileri doğrulamak için PHP ile filtreleme işlemleri
  • Verileri doğrulamak için PHP ile filtreleme işlemleri ~ 18,384

    Ziyaretçilerden gelen verilerin istediğimiz formata uygunluğunu kontrol etmeliyiz ki, güvenlik açığı yaratmayalım. E-postaları, web adreslerini, bilgi girişlerini ve dahasını Her birine uygun farklı fonksiyonlar yazıldı bu vakte kadar. Ancak PHP 5.2.0 ve ...


  • Php ile Oturum Yönetimi (SESSION)
  • Php ile Oturum Yönetimi (SESSION) ~ 17,865

    Türkçesi oturum anlamına gelen session bilgilerin saklanması için kullanılan mantıksal bir nesnedir.Session oturum yönetimini kullanarak şifreli sayfalar oluşturarak ve bu sayfaları belirlediğiniz kullanıcıların görmesini sağlayabilirsiniz.


  • En iyi 25 php template motoru
  • En iyi 25 php template motoru ~ 17,754

    Php tabanlı web siteleri dizayn ederken, php kodlarını html kodlar arasına gömeriz. Fakat gün gelir bu kodları düzenlemek istediğimizde çok büyük bir çaba gerektirir. Bu tarz durumlarla başa çıkabilmek için ve daha kararlı bir sistem kodlamak için t...


  • Dizi Tanımlamaları
  • Dizi Tanımlamaları ~ 17,509

    PHP’de array tanımlayıcısını kullanarak içerisinde elemanları yerleştirmek yoluyla ya da index numarasını köşeli parantezler içerisinde belirterek atama yaparak dizi oluşturmak mümkündür


  • Php Mysql to XML
  • Php Mysql to XML ~ 17,473

    Bu yapıyı geliştirerek mysql veritabanınızdaki datalarınızı xml standartlarına dönüştürebilirsiniz.


  • $_SERVER
  • $_SERVER ~ 17,427

    $_SERVER host bilgileri, header bilgileri, yollar ve script yolları gibi bilgileri içeren bir dizidir. Bu dizideki değerler web server tarafından üretilir. Tüm server yazılımlarının, tüm değerleri atayacağına dair bir kesinlik yoktur. Yazılım bazıl...











  • $_REQUEST
  • $_REQUEST ~ 14,413

    $_GET, $_POST, ve $_COOKIE değişkenlerini içeriğinden meydana gelen çağrışımlı bir dizidir. Bu değişken bir superglobal olduğu için tüm alanlarda (scope) geçerlidir ve bundan dolayıdır ki global $_REQUEST ; şeklinde bir tanımlamaya ihtiyaç duymaz. Eğer ...