Höyükte OOP hakkında konuşun - sayfa 5

 
Alexey Volchanskiy :

Her şeyi okudum, herkesin farklı ilgi alanları var ... Şimdi sanal bir grid kurmak ve yönetmek için bir sınıf yeniden yapıyorum, buna ihtiyacım var.

Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...

 
Dennis Kirichenko :

Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...

Çok ilkel şeyler yazıyor gibiyim...

 

Sanal işlevle öyle mi çıkıyor?

Evet ve bir işleve işaretçi - her zaman dahili reddetmeye neden oldum. Şimdi neden "saf C" üzerinde çalışırken - işlev işaretçilerinin kullanıldığını hatırlamıyorum. Ancak C++'a geçerken bir sebepten dolayı terk edilmeleri gerekiyordu. Ve o zamandan beri onları kullanmadım. İşaretçi - bir nesne üzerinde olmalıdır.

Ama "yüzde yüz doğru" olduğumu iddia etmeyeceğim. Çok fazla eski okul eski osuruk deneyimim olduğuna katılıyorum.

 
fxsaber :

Çok ilkel şeyler yazıyor gibiyim...

Utangaç olmayın.

Tanımlamaları ustaca kullanmanla - bence kim karşılaştırabilir ki.

 
George Merts :


... İşlevim şuna benziyor:

 int CFactoryBalanceResultSeries::Compare( const CObject *poNode, const int iMode) const
{
   CFactoryBalanceResultSeries* pfdsAnother = CONVERT_OBJECT_WITH_CHECK(poNode,CFactoryBalanceResultSeries,MOT_FACTORYBALANCERES_SERIES);
   
   switch (iMode)
      {
       case FSM_BY_PART_OF_MAX_DD_A:     return (_CompareByPartOfMaxDDWith(pfdsAnother, true ));
       case FSM_BY_PART_OF_MAX_DD_D:     return (_CompareByPartOfMaxDDWith(pfdsAnother, false ));

       case FSM_BY_PART_OF_MAX_SLQUEUE_A: return (_CompareByPartOfMaxSLQueueWith(pfdsAnother, true ));
       case FSM_BY_PART_OF_MAX_SLQUEUE_D: return (_CompareByPartOfMaxSLQueueWith(pfdsAnother, false ));

       case FSM_BY_LAST_PRCDATA_A:       return (_CompareByLastPrcdataWith(pfdsAnother, true ));
       case FSM_BY_LAST_PRCDATA_D:       return (_CompareByLastPrcdataWith(pfdsAnother, false ));
       case FSM_BY_LAST_MNYDATA_A:       return (_CompareByLastMnydataWith(pfdsAnother, true ));
       case FSM_BY_LAST_MNYDATA_D:       return (_CompareByLastMnydataWith(pfdsAnother, false ));
       case FSM_BY_LAST_MNYLOTDATA_A:   return (_CompareByLastMnylotdataWith(pfdsAnother, true ));
       case FSM_BY_LAST_MNYLOTDATA_D:   return (_CompareByLastMnylotdataWith(pfdsAnother, false ));
      
       case FSM_BY_PRCYEARRECOVERY_A:   return (_CompareByYearPrcrecoveryWith(pfdsAnother, true ));
       case FSM_BY_PRCYEARRECOVERY_D:   return (_CompareByYearPrcrecoveryWith(pfdsAnother, false ));
       case FSM_BY_MNYYEARRECOVERY_A:   return (_CompareByMnyYearRecoveryWith(pfdsAnother, true ));
       case FSM_BY_MNYYEARRECOVERY_D:   return (_CompareByMnyYearRecoveryWith(pfdsAnother, false ));
       case FSM_BY_MNYLOTYEARRECOVERY_A: return (_CompareByMnylotYearRecoveryWith(pfdsAnother, true ));
       case FSM_BY_MNYLOTYEARRECOVERY_D: return (_CompareByMnylotYearRecoveryWith(pfdsAnother, false ));
      
       case FSM_BY_PRCVAR_A:             return (_CompareByPrcVarWith(pfdsAnother, true ));
       case FSM_BY_PRCVAR_D:             return (_CompareByPrcVarWith(pfdsAnother, false ));
       case FSM_BY_MNYVAR_A:             return (_CompareByMnyVarWith(pfdsAnother, true ));
       case FSM_BY_MNYVAR_D:             return (_CompareByMnyVarWith(pfdsAnother, false ));
       case FSM_BY_MNYLOTVAR_A:         return (_CompareByMnylotVarWith(pfdsAnother, true ));
       case FSM_BY_MNYLOTVAR_D:         return (_CompareByMnylotVarWith(pfdsAnother, false ));
      
       case FSM_BY_PRC_GRAILRATIO_A:     return (_CompareByPrcGrailratioWith(pfdsAnother, true ));
       case FSM_BY_PRC_GRAILRATIO_D:     return (_CompareByPrcGrailratioWith(pfdsAnother, false ));

       case FSM_BY_MAGIC_A:             return (_CompareByMagicWith(pfdsAnother, true ));
       case FSM_BY_MAIGC_D:             return (_CompareByMagicWith(pfdsAnother, false ));
       default :
         break ;
      };
         
   return ( NULL );
};

George, burada görünmüyor, örneğin, _CompareByPrcVarWith() işlevi bir sınıf yöntemi veya normal bir işlevdir. C++, sınıf yöntemlerine yönelik işaretçilere sahiptir. Kendi özellikleri var... Dürüst olmak gerekirse, MQL5'te bu tür işaretçiler kullanmayı denemedim.

Ancak, kodun yapısını geliştirmek için hala bir rezerviniz olduğunu düşünüyorum.

Sonuçta, işlev nedir?

işlev ( lat.   işlev - " performans, komisyon; görev çağrısı ") - birindeki değişikliğin diğerinde bir değişiklik gerektirdiği unsurlar arasındaki ilişki.

Onlar. fonksiyon bir şey yapar. Monoton eylemlerin tek bir işlev gövdesinde birleştirilmesi arzu edilir.

Örneğinizde, işlevlerin

_CompareByPartOfMaxDDWith(),

_CompareByPartOfMaxSLQueueWith(),

_CompareByLastPrcdataWith(),

_CompareByLastMnydataWith() vb.

KARŞILAŞTIRMA yapıyor ve veriyor   bu karşılaştırmanın sonucu. İsimlerde farklılık gösterirler. IMHO, kötü uygulama. Parametrelerde farklılık göstermelerine izin verin ...

Böyle. Bence ya tüm fonksiyonları tek bir fonksiyonda birleştirmeye değer, ya da onları sanal metotlar ya da şablon olarak yapmaya değer. Yiyor ama sınıflar ebeveyn-çocuk hiyerarşisine uymalıdır.

Genel olarak, karmaşık kod yazmak çok kolaydır ve çok zor - basittir.

 
Dennis Kirichenko :

George, burada görünmüyor, örneğin, _CompareByPrcVarWith() işlevi bir sınıf yöntemi veya normal bir işlevdir. C++, sınıf yöntemlerine yönelik işaretçilere sahiptir. Kendi özellikleri var... Dürüst olmak gerekirse, MQL5'te bu tür işaretçiler kullanmayı denemedim.

Bu (ve alt çizgi ile başlayan her şey) korumalı bir sınıf özelliğidir.

KARŞILAŞTIRMA yapıyor ve dağda veriyor   bu karşılaştırmanın sonucu. İsimlerde farklılık gösterirler. IMHO, kötü uygulama. Parametrelerde farklılık göstermelerine izin verin ...

Böyle. Bence ya tüm fonksiyonları tek bir fonksiyonda birleştirmeye değer, ya da onları sanal metotlar ya da şablon olarak yapmaya değer. Yiyor ama sınıflar ebeveyn-çocuk hiyerarşisine uymalıdır.

Böylece bir bütün halinde birleştirilirler!

Yalnızca bir işlev vardır - Karşılaştırma(), ancak içinde iletilen anahtarla karşılaştırmak gerekir. Buna göre, belirli korunan işlevlerden biri seçilir. Bu nedenle, kullanıcının erişemeyeceği şekilde korunurlar (korunurlar) - bunlara yalnızca, alt çizginin gösterdiği gibi Karşılaştır () üzerinden erişilir.

Bu aynı zamanda kod tasarım kurallarından biridir - alt çizgi ile başlayan bir işlevin kullanıcılar tarafından çağrılması amaçlanmamıştır, yalnızca belirli sınıf içi görevlere hizmet eder. Buna erişim sınırlıdır.

 
Dennis Kirichenko :

Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...


Denis, herkesin farklı yaklaşımları olduğunu söylemek istedim. Genel olarak, dün konuyu açtığımda, dünün sızlanmalarının "ahh OOP çok zor, SB korkunç bir kara kutu" görünüp görünmeyeceğini görmek ilginçti. Beklendiği gibi gelmediler.

Ama insanlar araya giriyor ve herkesin kendi yaklaşımı var. Bu, Renat'ın çokça bahsettiği ortak projeler açısından da ilginç.

Not: Projelerde paylaşım çalışmıyor, geçenlerde denedim.

 
George Merts :

Bu (ve alt çizgi ile başlayan her şey) korumalı bir sınıf özelliğidir.

Böylece bir bütün halinde birleştirilirler!

Yalnızca bir işlev vardır - Karşılaştırma(), ancak içinde iletilen anahtarla karşılaştırmak gerekir. Buna göre, belirli korunan işlevlerden biri seçilir. Bu nedenle, kullanıcının erişemeyeceği şekilde korunurlar (korunurlar) - bunlara yalnızca, alt çizginin gösterdiği gibi Karşılaştır () üzerinden erişilir.

Bu aynı zamanda kod tasarım kurallarından biridir - alt çizgi ile başlayan bir işlevin kullanıcılar tarafından çağrılması amaçlanmamıştır, yalnızca belirli sınıf içi görevlere hizmet eder. Buna erişim sınırlıdır.


Birçok _CompareXXX() yönteminiz varsa, bunlar nasıl birleştirilir? Ve benim anlayışımda 1 olmalı.

Soru, örneğin, _CompareByPartOfMaxDDWith() yönteminin CFactoryBalanceResultSeries::Compare() öğesinden başka bir yerde mi çağrıldığıdır ?

 
Dennis Kirichenko :

Birçok _CompareXXX() yönteminiz varsa, bunlar nasıl birleştirilir? Ve benim anlayışımda 1 olmalı.

Soru, örneğin, _CompareByPartOfMaxDDWith() yönteminin CFactoryBalanceResultSeries::Compare() öğesinden başka bir yerde mi çağrıldığıdır ?

Yalnızca bir _CompareXXX() yöntemi varsa, bunun orijinal Compare() sanal işlevinden hiçbir farkı yoktur.

İşin aslı, _CompareBy...() yöntemlerinin yalnızca ana Karşılaştırma() yönteminden çağrılmasıdır. Başlıktaki alt çizgi bu konuda uyarıyor.

Genel Karşılaştırma() yöntemi - iki nesneye işaretçiler ve nasıl karşılaştırılacağını gösteren bir anahtar kabul eder. Bu genel yöntemde, anahtar ayrıştırılır ve bundan sonra yalnızca bir anahtarı karşılaştırmak için tasarlanmış belirli bir yöntem çağrılır. Ayrıca, bu yöntemlerin her biri, geçirilen iki nesnenin anahtarlarının değerini hesaplar ve anahtarın int, double, bool veya string olmasına bağlı olarak, belirli bir türü karşılaştırmanın (ayrıca korumalı) yöntemi çağrılır.

Tüm _CompareBy...() yöntemleri tek bir işlevde yazılabilir. Ancak, o zaman kodun görünürlüğü bence daha da kötüleşecekti.

 
George Merts :

Yalnızca bir _CompareXXX() yöntemi varsa, bunun orijinal Compare() sanal işlevinden hiçbir farkı yoktur.

İşin aslı, _CompareBy...() yöntemlerinin yalnızca ana Karşılaştırma() yönteminden çağrılmasıdır. Başlıktaki alt çizgi bu konuda uyarıyor.

Genel Karşılaştırma() yöntemi - iki nesneye işaretçiler ve nasıl karşılaştırılacağını gösteren bir anahtar kabul eder. Bu genel yöntemde, anahtar ayrıştırılır ve bundan sonra yalnızca bir anahtarı karşılaştırmak için tasarlanmış belirli bir yöntem çağrılır. Ayrıca, bu yöntemlerin her biri, geçirilen iki nesnenin anahtarlarının değerini hesaplar ve anahtarın int, double, bool veya string olmasına bağlı olarak, belirli bir türü karşılaştırmanın (ayrıca korumalı) yöntemi çağrılır.

Tüm _CompareBy...() yöntemleri tek bir işlevde yazılabilir. Ancak, o zaman kodun görünürlüğü bence daha da kötüleşecekti.


Seni anladım. Muhtemelen bir zevk meselesi. Ama her şeyi tek bir yöntemle yapardım. Özellikle korumalı ve özel yöntemler Karşılaştırma() dışında başka hiçbir yerde çağrılmıyorsa.

Neden: