3 Şubat 2009 Salı

Obje / Nesne(Object) ve Sınıf(Class) Nedir?

Bu yazıda sizlere obje ya da nesne(object) ile sınıf(class) kavramlarını açıklamaya çalışacağım.

Obje / Nesne (Object) : Bellekte üzerindeki bir adreste yer kaplayan (ki biz buna "yaşayan" diyoruz) herşeye verilen addır. Tabi yer kaplıyorsa da ne kadar yer kapladığını ve bu yeri nasıl bir kalıba uygun olarak işgal ettiğinin de merakının uyandığını düşünüyorum...

OOP(Object Oriented Programming) denilen yapı içerisinde "Object" ifadesine odaklanmalısınız. Sanki buradan nesneleri programlamanız gerektiğini hisseder gibi oluyorsunuz. Hatta bir önceki tanımdan yola çıkarak; "belirli bir adresi ve kalıbı olan bellek üzerinde yer kaplayan değerleri programlıyor olurken kullanılırlar" sonucuna erişmeniz hiç de zor değil

Yaşamdan nesneye en önemli örnek olarak: "belirli bir plana bakılarak yapılmış bir arabayı" gösterebilirim.

Sınıf (Class) : Bellekte yer kaplayan bir nesnenin(object) ne büyükükte ve nasıl bir kalıpta olmasını gerektiğini belirttiğimiz zarf olarak adlandırılabilir. İşin biraz daha teorik noktasına inecek olursam sınıf; birbiri ile bağlantılı birden fazla veriyi tek bir küme altında toplamak için hazırlanmış bir plan, şablon ya da kalıp olarak düşünülebilir.

Eskiden struct ile verilerin kümelenmesi sağlanırdı. Günümüzde structların yerini sınıflar almıştır. Bunun nedenini sınıflar için kullanacağımız polymorphism, abstraction, inheritance gibi kavramlarla açıklıyor olacağım. Sınıfları kullanıyor olmamızın en önemli avantajı kod tekrarını azaltmak, kodun bakımını ve esnekliğini arttırmaktır.

Tasarlanan sınıf olarak adlandırılan şablonları obje / nesne(object) üretmek içi kullanıyor olacağız. Böylelikle üretilen her nesne aynı kalıptan ya da bizim belirlediğim kalıplardan geliyor olacak.

Not: daha sınıflar referans tipleridir.

Yaşamdan sınıfa en önemli örnek olarak: "belirli bir arabayı üretmek için hazırladığımız kağıt üzerindeki planı" gösterbilirim.


O zaman genel olarak 3 adımdan bir akış oluşturmak mümkün:
1. Sistem içerisinde devamlı kullanılacak olan verileri bulmaya çalışırız.
Örn: ad, soyad, tckimlikno
2. Bu verileri sınıf olarak kümeleriz.
Örn: ad, soyad, tckimlikno olarak belirlediğimiz verileri Kisi sınıfı altında toplarız.
3. Kisi sınıfını kullanan nesneler oluştururuz.
Örn: Kisi k = new Kisi(); //Burada k adında ve Kisi tipinde bir nesne oluşturmuş olduk.

16 Eylül 2007 Pazar

Struct (Daha Yakından)

Özellikleri:

1. Değer Tipidirler.

2. Fieldlarını direkt olarak örnekleyemezsiniz. Aşağıdaki örnekte x field'ına 0 değerini atayarak ilklendirme yapmak istedim. Kodu derlediğimde(ctrl+shift+b) "Error 1 'StruckOzellikleri.Nokta.x': cannot have instance field initializers" hatası ile karşılaştım.


3. Struct'lar default bir "yapıcı method"(contructor) a sahiptirler.

4. Eğer Struct içerisnde yapıcı method kullanılması gerekiyorsa, yapıcı methodun parametre alma zorunluluğu vardır. Diğer durumlarda hata ile karşılaşırız.(Not:Yapıcı method konusunu daha sonra göreceğiz.)

5. Struct'ların örneğini oluşturmak için new anahtar kelimesi kullanılır.



6. Struct'ların örneğini oluşturmak için class'lar gibi new anahtar kelimesini kullanma zorunluluğu yoktur.


7. Class'ları miras alamazlar(inheritance) fakat interface'leri implement edebilirler.

15 Eylül 2007 Cumartesi

Değer Tipleri ve Struct

Değer tipleri için : "Değer tipleri, belleğin stack bölümünde saklanan değerler olarak adlandırılırlar." ifadesini kullanmıştım. Değer tiplerinin stack üzerinde saklanmasının meydana getirdiği bazı davranışlar söz konusudur.

Özellikleri;

1- Referans tutmazlar.
2- Belleğin stack bölümünde saklanırlar.
3- Operasyonlara katıldıklarında kendilerini stack üzerinde kopyalarlar.

3. Maddeyi aşağıdaki örnek bize açıklamaktadır.



1- Yukarıda Nokta adında bir struct oluşturdum ve bunun içerisinde iki adet int tipinde değişken tanımladım. (Not: Sınıf ya da struct içerisinde global olarak tanımlanan değişkenlere field adı verilir.)

2- Main metodu altında ise nokta yapısından nokta1 adında bir örnek oluşturdum ve x değişkenine 3, y değişkenine 4 değerlerini atadım.

3-Nokta yapısından nokta2 adında bir örnek daha oluşturdum ve bu örneğin değerini nokta1 olarak belirledim.(işte bu nokta değer tiplerinin operasyonlara katılması noktası. Burada nokta1 bütün özellikleriye stack üzerinde kopyalanıyor ve nokta2 nokta1'den bağımsız bir örnek haline geliyor)

4- nokta1 adlı örnekteki x ve y değişkenlerinin değerlerini değiştirdim.(nokta1 ile nokta2 birbirinden bağımsiz nesneler olduklarından bu değişiklik sadece nokta1'i etkileyecek, nokta2 bu değişiklikten etkilenmeyecektir.)

5- nokta1 ve nokta2'nin x ve y değişkenlerinin değerlerini ekrana yazdırdım.

Sonuc :

nokta1 için : 5 ve 15

nokta2 için : 3 ve 4

5 Eylül 2007 Çarşamba

Veri Tipleri

Nesne yönelimli programlamanın başlangıç noktası olan veri tipleri .net framework içerisinde Değer Tipleri ve Referans Tipleri olmak üzere ikiye ayrılır. Visual studio .net içerisinde bulunan CLR(Common Language Runtime), bizim yerimize belleği yönetir. C++ programıcılarının daha yakın olduğu bellek yönetimi, .net'in arka planında c++'ın çalışma mantığına çok yakın bir mimari otomatik hale getirilmiştir.

Referans tipleri, c++'ta kullanılan işaretçi mantığına çok benzerler ve oluşturulduklarında belleğin stack bölümünde referansları saklanır ve heap bölümünde referansın işaret ettiği değer saklanır. Referans tipleri ile ilgili daha detaylı bilgiyi "Referans Tipleri İle Çalışmak" başlığında görebilirsiniz.

Değer tipleri ise belleğin stack bölümünde saklanan değerler olarak adlandırılırlar.

İki tip arasındaki farkı rahat olarak anayabilmemiz için bu konuları teker teker ele alarak açıklayacağım.

4 Eylül 2007 Salı

Nesne Yönelimli Programlamaya Başlamadan Önce...

Nesne yönelimli programlama içerisindeki konulara başlamadan önce kendimize bir programalama dili seçmeliyiz. .Net üzerindeki tecrübelerimden dolayı C#'ı tercih ediyorum. Asıl amacımın nesne yönelimli programalamayı anlatmak olduğunu unutmada C# dili üzerinde örneklerimizi yapacağız.

Neden Nesne Yönelimli Programlama?

Nesne yönelimli programlama üzerine Wikipedia aşağıdaki gibi bir tanım yapmış. Bu tanımın blog'ta bulunmasının nedeni ise Wikipedia'nın değerli bir kaynak olmasıdır.

Nesne yönemli programlama üzerine bir çok tanım yapılabilir fakat biz uygulama geliştiren kişilerin tanımları daha açık bir şekilde kavrayıp, uygulamak üzerine odaklanmamız gerekiyor. Bu işin önemli tarafı da bu zaten.

Daha önceleri prosedürel programlama adı verilen bir programlama tekniği ile uygulamalar geliştiriliyordu. Binlerce alt alta yazılmış kodlar arasında yazılım geliştiricilerin aynı uygulamanın kodlarını devamlı kopyalayarak ve yapıştırarak yeni kod parçacıkları oluşturduğu bir kodlama tekniğiydi. Prosedürel protramlama tekniği kullanılarak geliştirilen kodlar sonucunda ortaya çıkan uygulamalar, günün hızlı değişen koşullarına yetişmek için yeterli esneklikte olmadığı için zamanla tercih edilmemeye başlandı.

O zaman prosedürel programlama ile ilgili iki sorundan söz edebiliriz :

1- Tekrar kullanılabilir kod sayısının az olması yani kopyalama yapıştırmanın çok tekrar edilmesi.
2- Teknolojinin çok ilerlediği büyük firma sayısının arttığı bir dönemdeki değişikliklere rahat ayak uyduramaması.

Nesne yönelimli programlama hayatın sanal ortama aktarılmış bir halidir. Hayatın içerisinde var olan hiyerarşi, nesne yönelimli programlama içerisinde de aynen bulunmaktadır. Nesne yönelimli programlama belirli bir kalıp üzerine oturtulaması ya da nesne tabanlı programlama budur ve bu şekilde kodlanır denmesi bana göre yanlıştır. Nesne yönelimli programlama sorunlar içerisinde durumlar tanımlar ve tanımlanan durumlara göre kendi başlarına davranışlar gösterebilen nesneler tanımlayarak problemlere çözümler geliştirir. Aslında kendi içerisinde sistemler barındıran büyük bir sistem kuran programlama tekniğidir.

Nesne yönelimli programlama ile ilgili bilgileriniz gün geçtikçe dah da derinleşecektir.

Nesne yönelimli programlama (NYP)

Nesne yönelimli programlama (NYP) (İngilizce - Object Oriented Programming (OOP)) özetle bir bilgisayar programlama yaklaşımıdır.

NYP'dan önceki uygulamaların bakım maliyeti ve karmaşıklık ilişkisi1960'lı yılların sonuna doğru ortaya çıkan bu yaklaşım, o dönemin yazılım dünyasında beliren bir bunalımın sonucudur. Yazılımların karmaşıklığı ve boyutları sürekli artıyor, ancak belli bir nitelik düzeyi korumak için gereken bakımın maliyeti (zaman ve çaba olarak) daha da hızlı artıyordu. NYP'yi bu soruna karşı bir çözüm haline getiren başlıca özelliği, yazılımda birimselliği (İngilizce - modularity) benimsemesidir.

NYP'nın altında yatan birimselliğin ana fikri, her bilgisayar programının (izlence), etkileşim içerisinde olan birimler veya nesneler kümesinden oluştuğu varsayımıdır. Bu nesnelerin her biri, kendi içerisinde veri işleyebilir, ve diğer nesneler ile çift yönlü veri alışverişinde bulunabilir.

Halbuki NYP'dan önce var olan tek yaklaşımda (Yordamsal programlama), programlar sadece bir komut dizisi veya birer işlev (fonksiyon) kümesi olarak görülmektediler.Bilimsel çevreler tarafından NYP'nın geçmişe göre daha yüksek esneklik ve bakım kolaylığı sunduğu iddia edilmektedir. Bu sebepten dolayı, günümüzün geniş çaplı yazılım projelerinde yaygınca kullanılmaktadır.

Kaynak : http://tr.wikipedia.org/wiki/Nesne_Yönelimli_Programlama