MQL5'te OOP hakkında sorular - sayfa 90

 
Igor Makanu :

eğer benim örneğimde:

onTick() yöntemindeki ask ve bid değerlerini kopyalayacağım ve diğer yöntemlerde _Ask, _Bid kullanacağım (sanal ticaret)

global değişkenlerle çalışmaya benzer mi?

Not: bir seçenek olarak, elbette, tüm yöntemlere atıfta bulunarak geçebilir ve işaretleyebilirim, ancak yine, neyin daha verimli olduğuyla ilgili sorular

Bu konu hala geçerliyse, alanları kaydetme seçeneğinin kavramsal olarak hem daha az verimli hem de daha az doğru olduğunu belirteceğim. Prensip olarak, bu 2 kavram neredeyse her zaman ilişkilidir.
Temiz kod (yan etkisi yoktur) derleyici tarafından her zaman daha iyi optimize edilir ve anlaşılması daha kolaydır.
Nesnenizin girişe göre durumunu değiştirmesi amaçlanıyorsa, bu girişi kendi içinde saklamamalıdır (önbelleğe alma amaçları dışında).
Sinekleri pirzolalardan ayırmak gerekir.

 

Bir şekilde burada bir sınıftaki değişkenleri başlatmanın iki yolu hakkında bir soru sordum. Işte bir tane:

 class CA{
   protected :
       int val;
   public :
      CA(){
         val= 0 ;
      }      
};

Ve bu:

 class CA{
   protected :
       int val;
   public :
      CA():val( 0 ){
      }      
};

İkinci yöntemin avantajının ne olduğunu sordum ve statik üyeler başlatabileceklerine dair bir cevap aldım. Ancak yalnızca statik üyeler bu şekilde başlatılmaz.

Yani soru hala aynı - herkes için temel bir fark var mı ve ikinci yöntemin avantajı nedir?

 

Alıntı

Хочется закончить свою песнь важными словами. Любые описанные механизмы, принципы и паттерны, как и ООП в целом не стоит применять там, где это бессмысленно или может навредить. Это ведет к появлению статей со странными заголовками типа «Наследование — причина преждевременного старения» или «Синглтон может приводить к онкологическим заболеваниям».

 

 
Dmitry Fedoseev :

Bir şekilde burada bir sınıftaki değişkenleri başlatmanın iki yolu hakkında bir soru sordum. Işte bir tane:

https://www.mql5.com/en/forum/85652/page45#comment_15975127

Dmitry Fedoseev :

İkinci yöntemin avantajının ne olduğunu sordum ve statik üyeler başlatabileceklerine dair bir cevap aldım. Ancak yalnızca statik üyeler bu şekilde başlatılmaz.

statik değil, sabit alanlar

 class CA
{
protected :
   const int          val;
   static int         static_val;
public :
                     CA(): val( 0 ) { }
};
static int CA::static_val = 12345 ;
Dmitry Fedoseev :

Yani soru hala aynı - herkes için temel bir fark var mı ve ikinci yöntemin avantajı nedir?

"Kötü form olarak kabul edilir" ifadesini atarsak , o zaman daha uygun olanı kullandığımız şeydir, IMHO

 
Evet, aynen, sabit, aldatılmış)
 

apnu konusu yine son mesajı sildi kendim çözdüm sandım....


bu kod var:

class CSetting  
{
public :
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private :
   int                param1, param2;
   T                 t;
   D                 d;
   V                 v;
public :
                     CSetting( const int in_param1, const int in_param2, const T in_t, const D in_d, const V in_v);
  };
//+------------------------------------------------------------------+
CSetting::CSetting( const int in_param1, const int in_param2, const T in_t, const D in_d, const V in_v)
   : param1(in_param1),
     param2(in_param2),
     t(in_t),
     d(in_d),
     v(in_v)
  {}

//--- input parameters
input int               Input_p1 = 1 ;   // p1 = -1000 ... +1000
input int               Input_p2 = 2 ;   // p2 = -1000 ... +1000
input CSetting::T      Input_T = CSetting::T::T1;
input CSetting::D      Input_D = CSetting::D::D1;
input CSetting::V      Input_V = CSetting::V::V1;

CSetting'in özel bölümünden 3 enum ve 2 int'yi bu verileri parça parça saklayacağım bir int yardımıyla doldurmak istiyorum, kodu çizdim:

 class CSetting
  {
public :
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private :
   int                param1, param2;
   T                 t;
   D                 d;
   V                 v;
public :
                     CSetting( const uint data);
  };
//+------------------------------------------------------------------+
CSetting::CSetting( const uint data)
{
   v = (V)(data & 0x3 );
   d = (D)((data >> 2 ) & 0x7 );
   t = (T)((data >> 5 ) & 0x7 );
   uint tmp = ((data >> 8 ) & 0xFFF );
   param2 = (tmp & 0x800 ) == 0x800 ? -( int )(tmp & 0x7FF ) : ( int )(tmp & 0x7FF );
   tmp = data >> 20 ;
   param1 = (tmp & 0x800 ) == 0x800 ? -( int )(tmp & 0x7FF ) : ( int )(tmp & 0x7FF );
}
//+------------------------------------------------------------------+
//--- input parameters
input int DATA         = 0xFFFFFFFF ;

teorik olarak bu işe yaramalı, enum için veriden alt 2 + 3 +3 biti alıyorum ve kalan 24 biti int'den param1 ve param2'yi doldurmak için kullanıyorum ve yüksek 12. bitteki sayının işaretini koruyorum


Herhangi bir hata olup olmadığını nasıl kontrol edebilirim? )))

peki, ya da başka birinin bu verilerin int'de nasıl saklanacağı seçeneği için minnettar olurum.

 
Bunu da yapabilirsiniz: t + d * 10 + v * 100
 
Igor Makanu :

Herhangi bir hata olup olmadığını nasıl kontrol edebilirim? )))

Her zamanki gibi - Paketledim, açtım, kimliği kontrol ettim. tüm uç durumların test edilmesi arzu edilir.
 
Dmitry Fedoseev :
Bunu da yapabilirsiniz: t + d * 10 + v * 100

işe yaramayacak

ya bit parça kaydırmanız ya da bir kaydırmaya eşdeğer olan 2 ile çarpmanız / bölmeniz gerekir

TheXpert :
Her zamanki gibi - Paketledim, açtım, kimliği kontrol ettim. tüm uç durumların test edilmesi arzu edilir.

yani evet ... mantıklı

ancak paketleme yapmayı planlamadım - optimizer için giriş değişkenlerinin sayısını ve GA'nın hızlı bir şekilde birleşmemesi için üstlerindeki Gray kodunu azaltıyorum - çok sayıda GA geçişine ihtiyacınız var


Sınır durumlarını zaten kontrol ettim, ancak deneyimlerime göre .... hatalar çok sinsi !!! )))

Not: Elbette, döngüyü 0 ... MAX_UINT'den dosyaya sıfırlayabilir ve görsel olarak bakabilirim, ancak en iyi seçenek değil, IMHO

 
Igor Makanu :

işe yaramayacak

...

Neden aniden çalışmıyor? Üç numaralandırma, hiçbiri 10'dan büyük değil. İlkokul ikinci sınıf aritmetiği.

Neden: