OOP (Nesneye Yönelik Programlama) hakkında sorular - sayfa 7

 
Zhunko :

Vasili, bir örnek, lütfen!

Bellek ayırmanın gerekli olduğu ve ona bir işaretçiye ihtiyaç duyulduğu durumlarda yalnızca bir vaka biliyorum.

Eminim neredeyse her zaman onsuz yapabilirsin. Manuel bellek yönetimini kullanmamanız önerilir. Bu sorunların zaten çözüldüğü standart bir kitaplık her zaman vardır.


 enum ENUM_CLASS_TYPE
{
   CLASS_PARENT,
   CLASS_CHILD_1,
   CLASS_CHILD_2
};

class Parent
{
   public :
      ENUM_CLASS_TYPE( void ){ return classType;}
       virtual string GetName(){ return "Base" ;}
   protected :
       Parent(ENUM_CLASS_TYPE type){classType = type; }
   private :
      ENUM_CLASS_TYPE classType;
};

class Child1 : public Parent
{
   public :
      Child1() : Parent(CLASS_CHILD_1){;}
       void MethodChild1(){;}
};

class Child2 : public Parent
{
   public :
      Child2() : Parent(CLASS_CHILD_2){;}
       void MethodChild2(){;}
};

int Start()
{
   Parent* parent = new Child1();
   switch (parent.GetType())
   {
       case CLASS_CHILD_1:
      {
          Child1* ch = parent;
           ch.MethodChild2() ;
           break ;
      }
       case CLASS_CHILD_2:
      {
          Child1* ch = parent;
           ch.MethodChild2();
           break ;
      }
   }
}
 
TheXpert :
Dinamik tip tanımlamanın varlığı genellikle projenin koltuk değneği mimarisini gösterir.


Dinamik tip tanımlamanın varlığı, yüksek derecede polimorfizm ve daha yüksek seviyede soyutlama gösterir. Proje yönetilebilirliğini ve ölçeklenebilirliğini artırır. Arayüz düzeyinde kodla çalışmanıza izin verir ve programcıyı uygulama ayrıntılarına girmemeye teşvik eder.
 
Vasily, bence, örneğiniz hayattan kopuk. Şablonlar vardır (µl cinsinden makrolar), derleme aşamasında birçok sorunu çözebilirler. Ve eğer aşağılamanız gerekiyorsa, programı kötü tasarladınız (Stroustrup bile bundan bahsetti).
 
Pavlick :
Vasily, bence, örneğiniz hayattan kopuk. Şablonlar vardır (µl cinsinden makrolar), derleme aşamasında birçok sorunu çözebilirler. Ve eğer aşağılamanız gerekiyorsa, programı kötü tasarladınız (Stroustrup bile bundan bahsetti).

Güçlü tip denetimiyle aşağı yayın neden kötü? Stroustrup bunu henüz tip denetimi yokken söyledi. Artık, türetilmiş türü bilerek, dönüştürmeyi başlamadan önce garanti edebilir ve böylece çalışma zamanı hatalarını önleyebilirsiniz.

Ancak downcast'in avantajları açıktır. Ana olan, arayüz seviyesindeki bu çalışmadır. Temel sınıf oluşturucu korumalı kapsamda kapalıysa, bu bir arabirim ve soyut bir sınıftır ve torunların belirtilmiş uygulamasını bilmek zorunda kalmadan onunla kendi düzeyinde çalışabiliriz. Ancak, bir örneğin türüne bağlı olarak polimorfik davranış uygularsak, ilgili örneğin uygulamasını iyileştirebileceğimiz ve örneğin yalnızca doğal yöntemini çağırabileceğimiz garanti edilir. Sanal işlevlerle, tip dökümü bile gerekli değildir. Sonuçta , sanal işlevler somut bir uygulamayı "perde arkasında" arayacaktır.

 
C-4 :

... Sanal fonksiyonlarla, tip dökümü bile gerekli değildir. Sonuçta, sanal işlevler somut bir uygulamayı "perde arkasında" arayacaktır.


Seçime karşı hiçbir şeyim yok. Örnekte, farklı bir yaklaşım seçtiniz.
C-4 :

Güçlü tip denetimiyle aşağı yayın neden kötü? ...

Doğru yazarsanız, bu sadece gerekli değildir.

Not: Türlerin kendi kendini tanımlamasını ve sanal işlevlerin mekanizmasını tek bir şişede birleştirmiyorum.

 

Gerçek bir MQL uygulamasından bir örnek:

Дана строка таблицы состоящая из ячеек нескольких типов. Часть из них являются обычным полями текста OBJ_TEXT, часть - кнопками OBJ_BUTTON а часть - ячейками, в которых текст можно редактировать (OBJ_EDIT). Значения введенное в ячейку типа OBJ_EDIT запоминается, и в случае его корректности формируется некий приказ, который отправляется на выполнение внешней системе. В промежутке времени между отправкой приказа и получения ответа от системы необходимо заблокировать строку таблицы таким образом, что бы все ячейки с возможностью редактирования в них текста больше не позволяли вводить в них текст. Все кнопки входящие в строку таблицы не позволяли нажимать на себя, а в целом, все ячейки в которых есть текст, должны были бы изменить его цвет на красный, сигнализируя тем самым о своей блокировке. Строки входящие в таблицу не идентичны друг другу и не содержат регулярной структуры. Одна строка может содержать кнопку, тогда как другая нет. Одна строка может содержать какой-либо столбец, а другая нет и т.д.

Uzmanların görüşlerini, benzer bir sorunu nasıl çözmeye başlayacaklarını duymak isterim. Şahsen, dinamik tip tanımlama, "şablon yöntemi" deseni ve downcasts yardımıyla çözdüm. O kadar iyi çözüldü ki sonunda düzensiz, tamamen özelleştirilebilir öğelerle karmaşık etkileşimli tabloların oluşturulmasına izin verdi. Sonuçlar o kadar somut ki, "dinamik özdeşleşme bir koltuk değneğidir" ve "sınıf düşürme kötüdür" demek bana safça görünüyor.

ps Pavlick, Bu arada, tam olarak neyin kötü olduğunu cevaplamadın.

 

Nesin sen, ben bir uzmandan çok uzağım. Downcasting hakkında söylediklerim benim deneyimim, bu şekilde yazmaya çalışıyorum + saygı duyduğum insanlar bunu onaylıyor. Bir şeyi kanıtlamak için bir program yazmak için harcadığım zamana üzülüyorum.

Pavlick, Bu arada, hala downcasting'in neden kötü olduğunu cevaplamadın.

Açıklaması zor. Anlıyorum, ama söyleyemem))). Kitaplar muhtemelen daha iyi açıklayacaktır.

 
C-4 :
 enum ENUM_CLASS_TYPE
{
   CLASS_PARENT,
   CLASS_CHILD_1,
   CLASS_CHILD_2
};

class Parent
{
   public :
      ENUM_CLASS_TYPE( void ){ return classType;}
       virtual string GetName(){ return "Base" ;}
   protected :
      Parent(ENUM_CLASS_TYPE type){classType = type;}
   private :
      ENUM_CLASS_TYPE classType;
};

class Child1 : public Parent
{
   public :
      Child1() : Parent(CLASS_CHILD_1){;}
       void MethodChild1(){;}
};

class Child2 : public Parent
{
   public :
      Child2() : Parent(CLASS_CHILD_2){;}
       void MethodChild2(){;}
};

int Start()
{
   Parent* parent = new Child1();
   switch (parent.GetType())
   {
       case CLASS_CHILD_1:
      {
          Child1* ch = parent;
          ch.MethodChild 2 (); // Это не ошибка?
          break ;
      }
       case CLASS_CHILD_2:
      {
          Child 1 * ch = parent;// Это не ошибка?

          ch.MethodChild2();
           break ;
      }
   }
}

Hata olmasa bile şablonlar ve typeid() var.
 
Pavlick :

Nesin sen, ben bir uzmandan çok uzağım.

Ama Stroustrup bir uzmandır. Ve diğerleri de. Hepiniz haklısınız.
 
Typeid() maalesef değil ve şablonların gücü statik tanımlamada. Farklı görevler farklı yöntemlerle çözülür ve bir yöntemin kötü, diğerinin iyi olduğunu söylemek çevik bir varsayımdır.