Delphi ile class yapısında program yazmak

Başlatan Zoroaster, 10 Ocak 2017, 14:56:18

Zoroaster

@Klein (Hocam konuya senin de müdahil olmanı isterim)

Aşağıdaki konuda class yapısında program yazmak lazım falan deniyor.

Delphide Class yapısında program nasıl yazılıyor? Basit bir örnek verebilir misiniz?

Class yapısı diyince kafamda bir şey şekillenmiyor.

https://www.picproje.org/index.php/topic,68265.0.html
Seytan deliginden kacti.

Klein

#1
Abi class dediğimiz şey, aslında bildiğimiz struct. Biraz gelişmiş hali.

Eğer  structları iyi kullanabiliyorsan sınıflara güzel bir giriş yapmışsın demektir. Eğer structları fonksiyon işaretçileri ile kullanıp çağıracağın fonksiyonu struct içerisinden değiştirebiliyorsan, bir kademe de ileri gitmişsin demektir.

Bundan sonrası sınıfların ek özellikleri.

Basit bir sınıf ve struct.

Class x{
   int a;
  int b;
} 
Struct x{
  int a;
  int b;
}

Struct ile benzerliğini açıkça görebilirsin. Hatta bazı C++ derleyicilerinde Class yerine Struct yazarsan muhtemelen sorunsuz derlenecektir.

Sınıfımızı biraz daha geliştirelim. Fonksiyon ekleyelim.

Class x{
	int a;
	int b;
	int Topla(int x, int y);
} 

x::Topla(int a, int b)
{
	return(a+b);
}

Kullanım
	x.Topla(3,5);
	
Struct x{
	int a;
	int b;
	void *(func)(int, int);
}

int Topla(int a, int b)
{
 return(a+b);
}
Kullanım 
 x.func =  Topla;
 x.func(3,5);

Yukarıdaki örnekten de görüldüğü gibi
Sınıfımızın üye değişkenleri var  a ve b;
Aynı şekilde structımızın da üye değişkenleri var a ve b;

Fakat sınıfımızın üye fonksiyonu varken sructımızın üye fonksiyonu yerine üye fonksiyon işaretçisi var.

Sınıfımızın üye fonksiyonunu yazarken
x::Topla(int,int); şeklinde yazdık.  Topla fonksiyonunun x sınıfına ait olduğunu belirttik.
structta ise
fonksiyon işaretçisine Topla(int,int) fonksiyonunun adresini geçtik.

Bundan sonrasında sınıf ile struct biraz ayrılıyor.
Daha doğrusu sınıfa ek özellikler geliyor.

Ekleme
Delphide de benzer durum record tipi için geçerli.

Zoroaster

Peki bu yapı bana ne avantaj sağlayacak?
Seytan deliginden kacti.

Klein

#3
Genellikle OOP programlaya Delphi ile başlayanlar sınıf yapısı ve OOP konusunu anlamakta biraz zorlanıyorlar.  OOP konusunu anlamak için C++ daha uygun. Bu yüzden C++ ile anlatacağım daha kolay şekillenir kafanda.

Classların esas özelliklerine geçmedik daha.
Fakat eğer struct kullanmak ve struct ile fonksiyon işaretçisi kullanmanın programa kattığı artıların farkındaysan, sınıfların ne kattığına geçebiliriz.
Ama struct kullanımı ve struct ile fonksiyon işaretçisi kullanımını önemsiz buluyorsan, o zaman biraz örnek hazırlamak için zamana ihtiyacım olacak.


Zoroaster

Seytan deliginden kacti.

Klein

Sınıflar programımızı daha iyi organize etmemizi ve daha iyi genişletmemizi sağlayacak.
Bence sınıfların en can alıcı özelliği kalıtım.
Bir sınıfın tüm özelliklerini alıp yeni bir sınıf yaratabiliyoruz.

Ama buna geçmeden önce başka bir özellikten bahsetmek istiyorum.
Sınıf yapılandırıcıları ve yokedicileri. Bu bile programın organizasyonu açısından başlı başına olay.

Bir struct tipimiz olsun.

typedef struct {
  int a;
  int b;
}X_Type;

Bu tipten bir kaç değişkenimiz olsun.

X_type  Ali;
X_Type  Veli;


öncelikle bu değişkenleri yapılandırmamız gerek. Bunu bir kaç şekilde yapabiliriz.
ya değişkeni tanımlarken

X_Type Ali = { 10, 20};
X_type Veli = {100, 200};


Ya da Yapılandırma fonksiyonu yazıp bunu  tüm değişkenler için çalıştırmak şeklinde.

void Yapılandır(X Type *Var,  int a, int b)
{
   Var->a = a;
   Var->b = b;
}

Yapılandır (&Ali, 10, 20);
Yapılandır(&Veli, 100, 200;


Peki ileride bu tipin fazla değişkenlisine ihtiyacımız olursa ne yaparız?
Yad da bu tipte değişiklik yapmak istediğimizde ne yaparız?
Programda tüm yapılandırıcıları bulup tek tek değiştiririz.
O zamanda sizin başka mesajda bahsettiğiniz "Programı değiştirmeye korkuyorum"  durumu ortaya çıkar.

Peki Class kullansaydık ne olurdu...

Klein

#6
Sınıfların kendi yapılandırıcı ve yok edici fonksiyonları vardır.

Class X_Type{
  int a;
  int b;
  X_Type(int v1, int v2);
}
//Sınıfın yapılandırıcı fonksiyonunun adı sınıf adı ile aynıdır.

X_Type::X_Type(int v1, int v2)
{
	a = v1;
	b = v2;
}

şimdi bu sınıf tipimizden bir nesne ( artık ismine değişken değil nesne diyoruz ) tanımlayalım.
X_Type Ali(10,20);
X_Type Veli(100, 200);

Nesnemizi tanımladığımız anda yapılandırıcı fonksiyon çalıştı ve ilk değer ataması gerçekleşti.

boreas

Anladığım kadarıyla esas sorun diğer konu başlığınızda ki büyük programların geliştirilmesiyle ilgili. Bu bir yapı işinize yarayadabilir yaramayadabilir. Sizin durumda öncelik programın nasıl bir yapısı olduğu nasıl büyüdüğü ? Şöyleki bir yazılım yaparsınız hesap makinesi, not defteri vs. gibi programlar eklendikçe yazılım büyür başka bir yazılım yaparsınız misal simülasyon yazılımı motor kısmı sabit kalır simüle edilecek entegreler eklendikçe yazılım büyür. Bu iki büyüme şekli birbirinden farklıdır. Bu yüzden doğru karar için programın özelliklerini detaylı bilmek gerekir.

Klein

Şimdi yukarıdaki  sınıfımızın yapılandırıcısını biraz daha değiştirelim

Yukarıda nesnemizi tanımlarken ilk değer aktarımını parametrik yapmıştık.
Çoğu zaman bu tip parametrik kullanıma ihtiyaç olmaz, ya da yapılandırmayı farklı şekillerde yapmak isteyebiliriz.

burada da OOP'taki  çok biçimlilik özelliği devreye giriyor. Fonksiyonların aşırı yüklenmesi.

class TMyClass{
   public:
	int a;
	int b;
	TMyClass(void);
	TMyClass(int v1);
	TMyClass(int v1,int v2);
};

TMyClass::TMyClass(void)
{
	a = 50;
	b = 60;
};

TMyClass::TMyClass(int v1, int v2)
{
	a = v1;
	b = v2;
};

TMyClass::TMyClass(int v1)
{
	a = v1;
};

TMyClass AClass;
TMyClass BClass(10);
TMyClass CClass(10,20);

ISS

oop yi böyle buradan öğrenemezsiniz. hatta zararı olur. nyp nin  arkasında çok geniş bir felsefe var sadece programcılık değil.
tavsiyem doğru düzgün bi kitap alıp ordan öğrenin. c++ için tavsiyem: accelerated c++.

Klein

Evet haklısın buradan OOP öğrenilmez. Buradaki amaç Neden OOP'a geçmeliyim konusunda kafasında bir ışık yakmak. Eskiden karmaşık yollarla halledebildiği şeyleri  OOP ile daha organize şekilde yapabileceğini göstermek.
Bir çeşit teaser yani.  @Zoroaster  hocamı biraz tanıyorum. Şu an Neden OOP kullanmalıym ya da nasıl OOP öğrenirim derdinde değil. Neden OOP Kullanmamalıyım sorusu daha çok ilgisini çekiyor. Ama içine girdikçe kendisinin de daha hevesli olacağına eminim. O zaman bir kitap almaya karar verecektir.

malaga

#11
Herbert schildt c++ kitabını tavsiye ediyorum alfa yayınları
Hiç bir kimsenin gönlünü yapmak için Allahın hükmünü çiğneme