Okul çocukları için OOP.

 

================================================= ================================================== ===================

Bu başlıkta OOP kullanımına ilişkin çok basit bazı örnekler olacak.

Acemi programcılardan gelen sorular açıktır. OOP'yi gerçekten anlamak isteyenler.

Yanlış bir şey yaptığımı düşünen "akıllılar", kendi konularınızı başlatın ve hemen orada yapın. Burada kimsenin sana ihtiyacı yok.

OOP'nin gerekliliği ve yararsızlığı hakkındaki argümanlar da burada önemsizdir.

================================================= ================================================== ===================


1. Koordinat düzleminde noktalarla bir şeyler yaptığımızı varsayalım.

Sadece 10 olsunlar.

Bunları farklı şekillerde bellekte saklayabilirsiniz.

Böyle:

 double x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6, x7, y7, x8, y8, x9, y9, x10, y10;

Veya bunun gibi:

 double pointsX[ 10 ];
double pointsY[ 10 ];

Veya bunun gibi:

 double points[ 10 ][ 2 ];

Ama bunu yapmak çok daha kolay:

 struct POINT
{
   double x;
   double y;
};

POINT points[ 10 ];

Düzlemde bir nokta olan yeni bir veri tipimiz var.

Ayrı bir varlık gibi bir nokta ile çalışıyoruz.

Örneğin noktalar arasındaki uzaklığı hesaplayan bir fonksiyon yazalım.

POINT p1, p2;

double D = Distance( p1, p2 );

double Distance( const POINT& p1, const POINT& p2 )
{
   double dx = p1.x - p2.x;
   double dy = p1.y - p2.y;
   return sqrt ( dx * dx + dy * dy );
}

Böylece, OOP bize problemli bir dilde programlama yeteneği verir.


Devam edecek...

 

2. Polimorfizm .

Diyelim ki bu kodumuz var:

 int iA = 1 ;
int iB = 3 ;

double dA = 4.5 ;
double dB = 3.14 ;

string sA = "abcd" ;
string sB = "efgh" ;

int iC = iA + iB;

double dC = dA + dB;

string sC = sA + sB;

Bu üç durumda artı işaretinin arkasında üç farklı toplama işlevi vardır.

Buna polimorfizm denir.

OOP, bu eylemi diğer verilere genişletmenize olanak tanır.

Örneğin, matris sınıfımız var. matrix.mqh dosyasında bulunur

Daha sonra şöyle bir kod yazabiliriz:

#include < matrix.mqh >

matrix < double > mA( 2, 2 );
mA[0][0] = 1.0;
mA[0][1] = 2.0;
mA[1][0] = 3.0;
mA[1][1] = 4.0;

matrix < double > mB( 2, 2 );
mB[0][0] = 5.0;
mB[0][1] = 6.0;
mB[1][0] = 7.0;
mB[1][1] = 8.0;

matrix < double > mC = mA + mB;

Burada OOP, programın farklı bölümleri arasında sorumluluğu paylaşmamıza izin verir.

matrix sınıfını yazarken nasıl kullanılacağını düşünmüyoruz.

Yazıldığında ve hata ayıklandığında, onu çeşitli görevlerde kullanırız, artık matrisleri toplama ve çarpma kurallarını düşünmeyiz.

Ve sadece + ve * koyun.


Devam edecek ...

 

3. Sanal işlevler .

Geometrik şekilleri temsil eden birkaç sınıf yazdığımızı varsayalım.

Hepsi aynı Shape temel sınıfından miras alır.

 class Shape
{
public :
  Shape();

   virtual void Draw() = 0 ;
};

class Circle : public Shape
{
public :
  Circle();

   virtual void Draw();
};

class Rectangle : public Shape
{
public :
  Rectangle();

   virtual void Draw();
};

class Star : public Shape
{
public :
  Star();

   virtual void Draw();
};

Temel sınıfa bir işaretçi dizisi bildirirsek, tüm bu şekilleri tek bir diziye koyabiliriz.

Shape* shapes[ 10 ];

Init() işlevinde bu diziyi dolduruyoruz.

 void Init()
{
   for ( int i = 0 ; i < 10 ; i++ )
  {
     switch ( i % 3 ){
       case 0 :
        shapes[i] = new Circle();
         break ;
       case 1 :
        shapes[i] = new Rectangle();
         break ;
       case 2 :
        shapes[i] = new Star();
         break ;
    }
  }
}

OnPaint() fonksiyonu, tüm şekilleri ekranda göstermemiz gerektiğinde çağrılır.

 void OnPaint()
{
   for ( int i = 0 ; i < 10 ; i++ )
   {
      shapes[i].Draw();
   }
}

Tüm şekiller arasında dolaşıyoruz ve her biri için Draw() işlevini çağırıyoruz.

Burada, her şekil için, bu belirli şeklin nasıl çizileceğini bilen kendi işlevi denir.

Bu, sanal işlevlerin özüdür.

Ve elbette, sonunda onları silmeyi unutmayın.

 void OnDeinit ()
{
   for ( int i = 0 ; i < 10 ; i++ ){
     delete shapes[i];
  }
}


Devam edecek ...

 

Hayır, onlar (öğrenci) anlamayacaklar. Özellikle matrisler. Diyecekler: Bu polimorfizm bizim için ne... herhangi? Ayrıca, emkülde etkinliği ancak bu şekilde en az 10 seçenek varsa kendini gösterir.

Genel değişkenlerden ve bunlarla ilişkili kafa karışıklığından kurtulmak için muhtemelen işlevleri ve değişkenleri birleştirme olasılığıyla başlamalısınız.

 
Dmitry Fedoseev :

Hayır, onlar (öğrenci) anlamayacaklar. Özellikle matrisler. Diyecekler: Bu polimorfizm bizim için ne... herhangi? Ayrıca, emkülde etkinliği ancak bu şekilde en az 10 seçenek varsa kendini gösterir.

Genel değişkenlerden ve bunlarla ilişkili kafa karışıklığından kurtulmak için muhtemelen işlevleri ve değişkenleri birleştirme olasılığıyla başlamalısınız.

Muhtemelen )))

Şahsen hala bu OOP'nin gerekli olup olmadığını anlamıyorum ... Bariz bir avantaj görmüyorum (muhtemelen aynı tür görevlerle uğraşmıyorsanız). Ve bu konuya basit ve net bir giriş bulamadım (belki de gerçekten çabalamadığım için?))))))))

 

4. Kapsülleme.

Burada sık sık şunu duyabilirsiniz: "Neden OOP'de gömülü sınıf üyeleri yapmanız gerekiyor? Her şeyin her yerde açık ve erişilebilir olmasını istiyoruz."

Ancak OOP, tüm üyeleri gizli olmaya zorlamaz. Neyin gizlenip neyin saklanmayacağına programcı kendisi karar verir.

Ve genellikle yanlışlıkla veri bozulması olasılığını azaltmak için neyin gizlenmesi gerektiğini gizlerler.

Örneğin, herhangi bir renge ayarlanabilen bir düğmemiz var.

 class ColorButton
{
   color myColor;

public :
   ColorButton( color clr ) : myColor( clr ){}

   color GetColor() const
   {
       return myColor;
   }

   void SetColor( color clr )
   {
      myColor = clr;
      Update();
   }

   void Update();
};

myColor değişkenini herkese açık hale getirebilir ve herhangi bir zamanda basit bir atama ile düğmenin rengini değiştirebiliriz.

Ancak bu değişkene atamak, düğmenin hemen yeniden çizilmesine neden olmaz.

Bu nedenle, myColor değişkenini özel yapıyoruz. Ve rengi değiştirmek için SetColor() işlevini çağırıyoruz.

Bu işlev, bir değişken atamanın yanı sıra, sisteme düğmenin yeniden çizilmesi gerektiğini söyler.

Ayrıca, diğer gerekli işlemleri de içine yerleştirebilirsiniz.

Bir düğmenin rengini almak için GetColor() işlevini kullanın. Çağrısı, bir değişkene doğrudan erişimden hiç de daha pahalı değildir,

çünkü derleyici onu kolayca optimize edebilir.

 
Koldun Zloy :

4. Kapsülleme.


Bu örnekte bunun argoda, aynı alıcılar ve ayarlayıcılar olduğunu doğru anlıyor muyum?

 
Roman :

Bu örnekte bunun argoda, aynı alıcılar ve ayarlayıcılar olduğunu doğru anlıyor muyum?

Evet. Her şey doğru.

 
Emkule'de alıcı ve ayarlayıcı yok.
 
Dmitry Fedoseev :
Emkule'de alıcı ve ayarlayıcı yok.

Bu, MQL tarafından değil, programcı tarafından belirlenir. İstiyor - olacak.

 
Ihor Herasko :

Bu, MQL tarafından değil, programcı tarafından belirlenir. İstiyor - olacak.

Programlama dilini tanımlar.