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

 
C-4 :
İşaretçiler, dinamik tür tanımlaması gerektiren karmaşık nesne dönüştürmeleri için vazgeçilmezdir.

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.

 
Integer :


Her yerde bir ilke vardır: her şey mümkün olduğunca basit yapılmalıdır. Sadece vahşi doğada olmak için vahşi doğaya tırmanmaya gerek yok. Bir problem basitçe çözülebiliyorsa, o zaman basitçe çözülmelidir.


Aynen öyle. Ve tam burada sınıfı doğru tasarlamak önemlidir. Ve bunun için bir sonraki sınıfların (mirasçıların) ne olacağını tahmin etmek önemlidir.

Genellikle, temel sınıf minimum işlevselliğe sahip olmalıdır, ancak sınıf kullanım vektörünü ayarlayacak birçok sanal yöntemin yapılması arzu edilir.

MQL durumunda - muhtemelen tam tersi - VOLDEMAR 'a gibi temel sınıfta daha fazla işlevsellik. Ama fanatizm olmadan.


Ticaret sembolü özellikleri vardır (POINT, STOPLEVEL, vb. MarketInfo() için MODE_ХХХ ). Örneğin, onları cSymbol sınıfına sokmak daha iyidir.


Emir özellikleri vardır (açık fiyat, tip, lot vb. OrderXXX() ). Örneğin, onları ayrı bir cOrder sınıfına sokmak daha iyidir.

Bir siparişin parça parça kapatılabileceğini hatırlarsak, o zaman BaseLot alanını da sınıfa ayarlayacağız (partinin hangi bölümünün daha önce kapatıldığını bulmak için), vb.


(Benim için) bir program var - siparişleri açıp kapatabileceğiniz belirli zaman dilimleri (günlere göre), sadece kapattığımız dönemler (zaten başabaştaysa trol) ve hiç çalışmadığımız bir dönem var. sonra açık olan her şeyi kapatıyoruz ve açılmayanları siliyoruz.

Hala boşlukları ve (hepsi değilse de) birçok DC'de alım satımın son saatinde alım satım koşullarının değiştiğini ve birçok DC'de her alım satım gününde metal alım satımında bir kırılma olduğunu hatırlıyorlar mı?


Ve son olarak, bir Uzman Danışman var - belirli bir sembolle, belirli bir programa göre, belirli bir "kendi" sipariş listesiyle ve hesaplama için kendi verileriyle çalışan belirli bir algoritma.

cSymbol sınıfından bir nesneye ve cOrder sınıfından bir nesne dizisine sahip olacak bir cExpert sınıfı oluşturabilirsiniz. Bu temel cExpert , cOrder nesnelerinin özelliklerini güncelleme işlevleri, siparişlerle çalışma işlevleri, hata işleme, istatistikler vb. içerir.

Şahsen, her sipariş için benzersiz bir sihir (belirli bir sipariş için ters sipariş vermek daha kolaydır), ters sipariş vermek için bir işlev vb. oluşturan, %% of AccountFreeMargin() cinsinden lotu hesaplamak için yararlı işlevler buluyorum.

Ve şimdi, bu cExpert'ten , piyasada ne zaman bir şey yapılacağına karar verecek benzersiz ek veri ve işlev setleriyle (siparişleri aç/eşlik et/kapat emirleri) mirasçılar yapabilirsiniz.

Onlar. ticaret stratejileri uygulamak. Ve "strateji danışmanı XXX" dediğimiz kişi olun.


Ancak TÜM temel işlevler, cExpert temel sınıfına bağlı olacaktır. Soy sınıfları zaten ticaret stratejisi algoritmalarını içerecektir.

Belki başka biri gelişmiş hata işleme veya gelişmiş ticaret istatistikleri ekler (eğer kaynak yoksa ve bunu temel cExpert'e aktaramazlarsa).

Uzman Danışmanlar yazmayı kolaylaştıracak bir sınıf oluşturmak için zaman ayırdığımızı lütfen unutmayın. Aslında, bu bir danışman şablonu. Yapısal olarak eksiksiz ve lekesiz (gerekli tüm veriler kodla birlikte tek bir yerdedir).


Açık siparişler () üzerindeki sarmalayıcı işlevlerinin sözde "fazlası" gelince, kişisel olarak sadece bu tür sarmalayıcıları destekliyorum (özellikle ek işlevlere sahiplerse ve yalnızca temel işleve bir çağrı değil).

Örneğin, SL ve TP sarmalayıcı çağrıdaki noktalarda belirtilmişse ve mutlak sayılara dönüştürülmesi ve hatta sipariş türüne bağlı olarak ekleme/çıkarma yapılması gerekiyorsa (bu durumda bu tür dönüşümler operorders() içine doldurulabilir).

Kişisel olarak, BuyStop(...) çağrısıyla kodu anlamak ve BuyStop()'un her şeyi doğru yaptığını bir kez kontrol etmek, parametrelerin doğruluğu için her seferinde OrderSend() parametrelerini ayrıştırmaktan daha kolay.

Not: Çok iş vardı, dahil. haftasonunda. Örnek kodlar için Pavlick ve mql5'e teşekkürler.

Bu örnekleri inceleyin ve düşünün - MQL'de yazılmış programlama görevleri alanında sınıf hiyerarşisini çitlemek gerekli midir?

Tabana dayalı bütün bir sınıf ailesine gerçekten ihtiyacınız var mı (tüm bu "üçgenler", "kareler" vb.)

Ve bir kez daha Integer 'a'nın altın sözleri: Sadece vahşi doğada olmak için vahşi doğaya tırmanmaya gerek yok.

O. Ya ben fark etmedim ya da yakın zamanda örneklerin olduğu dokümantasyon bölümü çıktı.

 
Zhunko :

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.


Burada, görünüşe göre, bahsettiğimiz şey bu.


Diyelim ki bir cFather sınıfı var, 3 değerini döndüren bir int GetData() yöntemine ve GetData () öğesinden ne aldığını görüntüleyen bir PrintData() yöntemine sahip.

Şimdi 5 döndüren GetData() işlevini geçersiz kılan cChild soyundan gelen var.

cFather TestObject türünde bir nesne bildirirsek, TestObject.GetData() her zaman 3 değerini döndürür.

cFather* TestObject=new cChild1 bildirirsek , TestObject.GetData() cFather gibi görünse bile 5 değerini döndürür.

Şimdi yazılan kodun cFather sınıfının herhangi bir halefi üzerinde GetData() yöntemini çağırabilmesi için, (halefi sınıf) henüz mevcut olmasa bile gereklidir.

Onlar. daha sonra GetData() değeri 7 döndüren cChild2 sınıfı görünürse, cFather* Test2=new cChild2'den sonra Test2.PrintData() işlevi 7 çıktı vermeye başlayacaktır.

Bir cFather sınıfı nesne referans parametresi bekleyen ve onu GetData() ile kullanan bir işlev varsa, o zaman herhangi bir cFather soyundan gelen için doğru verileri alacaktır.

Yöntem bağlama, new çağrıldığında gerçekleşir. Bir bağlantı değilse, bağlama zor olacaktır, yani. Bildirilen sınıfın yöntemleri çağrılır.

Buraya ve buraya bakın

 
EverAlex :

Burada, görünüşe göre, bahsettiğimiz şey bu.

...

Temel ve türetilmiş sınıfların tüm zincirindeki herhangi bir yönteme bellek ve işaretçi ayırmadan erişmenizi sağlayan böyle bir "::" operatörü vardır.
 
C-4 :


Sınıfınız %90 gereksiz. Ana işi sadece iki fonksiyon yapar, bunlar openorder ve ipucu Neden Sel, SelStop Satın Al vs. kullanasınız ki, aslında hepsi sadece Openorders diyorlar? Ayrıca, emir türü int olarak iletilir, yani korunmaz. İnt yerine kendi numaralandırmanızı veya standart ENUM_ORDER_TYPE'ı kullanmak daha iyidir. Ve genel olarak, "1", "2" vb. sihirli sayıları asla kullanmamak, yalnızca numaralandırmaları kullanmamak daha iyidir. Bu, siparişin sol değerinin fonksiyona gönderilmesini önleyecektir. Openorders işlevinin kendisi çok büyük. Anlaşma yapmak için bir blok ve koşulları kontrol etmek için bir blok olmak üzere iki bloktan oluştuğu açıktır. Her biri ayrı bir özel fonksiyon şeklinde olmalıdır.

Fena bir başlangıç değil, ama daha öğrenecek çok şey var. İpucu işlevi şu şekilde yeniden yazılabilir:

Yöntemi çağırırken benim için uygun, ne tür bir sipariş verdiğimi görsel olarak görebiliyorum ...

Karşılaştırmaya gelince, çifti 0 ile karşılaştırmanın neden önerilmediğini ayrıntılı olarak açıklayın.

 
C-4 :
İşaretçiler, dinamik tür tanımlaması gerektiren karmaşık nesne dönüştürmeleri için vazgeçilmezdir.

Dinamik tip tanımlamanın varlığı genellikle projenin koltuk değneği mimarisini gösterir.
 
Sınıf, Expert Advisor'da (Sınıf c;) global düzeyde bildirilirse, bir tikte değiştirilen sınıfın dahili nesnelerinin durumları, bir sonraki tik geldiğinde kaydedilecek mi?
 
EverAlex :

Burada, görünüşe göre, bahsettiğimiz şey bu.


Diyelim ki bir cFather sınıfı var, 3 değerini döndüren bir int GetData() yöntemine ve GetData () öğesinden ne aldığını görüntüleyen bir PrintData() yöntemine sahip.

Şimdi 5 döndüren GetData() işlevini geçersiz kılan cChild soyundan gelen var.

cFather TestObject türünde bir nesne bildirirsek, TestObject.GetData() her zaman 3 değerini döndürür.

cFather* TestObject=new cChild1 bildirirsek , TestObject.GetData() cFather gibi görünse bile 5 değerini döndürür.

Şimdi yazılan kodun cFather sınıfının herhangi bir halefi üzerinde GetData() yöntemini çağırabilmesi için, (halefi sınıf) henüz mevcut olmasa bile gereklidir.

Onlar. daha sonra GetData() değeri 7 döndüren cChild2 sınıfı görünürse, cFather* Test2=new cChild2'den sonra Test2.PrintData() işlevi 7 çıktı vermeye başlayacaktır.

Bir cFather sınıfı nesne referans parametresi bekleyen ve onu GetData() ile kullanan bir işlev varsa, o zaman herhangi bir cFather soyundan gelen için doğru verileri alacaktır.

Yöntem bağlama, new çağrıldığında gerçekleşir. Bir bağlantı değilse, bağlama zor olacaktır, yani. Bildirilen sınıfın yöntemleri çağrılır.

Buraya ve buraya bakın

 class cFather
{
public :
     int GetData() { return 3 ;}
};

class cChild : public cFather
{
public :
     int GetData() { return 5 ;}
};
    
int f(cFather *p) { return p->GetData();}
    
int main()
{
    cChild obj;
    f(&obj);                 // вернет 3
    obj.cFather::GetData(); // вернет 3
    
     return 0 ;
}
 
Pavlick :


Muhtemelen boşuna bir örnek yazdım. Bu, MKL'de çalışmaz:

cChild obj;
f(&obj);                 // вернет 3
obj.cFather::GetData(); // вернет 3

X'ler, işaretçiler değil, bir sopayla kahkahalar.

Not: dll'yah yaz, normal bir dil öğrenme şansı var.

 
Pavlick :


Muhtemelen boşuna bir örnek yazdım. Bu, MKL'de çalışmaz:

X'ler, işaretçiler değil, bir sopayla kahkahalar.

Not: dll'yah yaz, normal bir dil öğrenme şansı var.


 class cFather
  {
public :
   int GetData() { return 3 ;}
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cChild : public cFather
  {
public :
   int GetData() { return 5 ;}
  };

int f(cFather *p) { return p.GetData();}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStart ()
  {
   cChild obj,*ptr= GetPointer (obj);
   f(ptr);                     // вернет 3
   ((cFather *)ptr).GetData(); // вернет 3

   return 0 ;
  }