MQL5'te OOP hakkında sorular - sayfa 40

 
Dmitry Fedoseev :

const - bir değişkene atamayı yasaklamak gerekirse (başlatma sırasında bir kez hariç). Değişken conts olarak bildirilmişse, o zaman onu bir fonksiyona referans yoluyla iletirken, fonksiyon argümanı da const olmalıdır, ancak derleyici onu zorlayacaktır, bunun hakkında düşünmeniz gerekmez. Değişken atanmamışsa, const olarak da işaretlenebilir - daha hızlı çalışır, bu işlev argümanları için geçerlidir. Ancak, herhangi bir zamanda revizyon gerektirebilir ...

statik - bu bir sınıftaki bir değişkense, bu nadir bir durumdur, hatta en nadirdir. Bu bir sınıf yöntemiyse, yalnızca bu yöntemin argümanları ve statik sınıf değişkenleri yöntemde işlenirse, bu da nadir bir durumdur (ancak, işlevlerin yalnızca kolaylık sağlamak için toplanması çok nadir değildir). sınıf).

Henüz MQL5 altında C# DLL'yi denemeye başlamadım. C++'da sarmalayıcılarla yapardım, artılardan C#'da sınıfın bir örneğini oluşturdum. Artık DLL'de olasılıkları büyük ölçüde sınırlayan statik bir sınıfın kullanılacağına dair bir şüphe var. Sınıfın şimdi statik mi yoksa dinamik mi olduğunu bilen var mı?

 
Alexey Volchanskiy :

Henüz MQL5 altında C# DLL'yi denemeye başlamadım. C++'da sarmalayıcılarla yapardım, artılardan C#'da sınıfın bir örneğini oluşturdum. Artık DLL'de olasılıkları büyük ölçüde sınırlayan statik bir sınıfın kullanılacağına dair bir şüphe var. Sınıfın şimdi statik mi yoksa dinamik mi olduğunu bilen var mı?

MQL5 için yalnızca statik olanları kullandım - statik bir değiştirici varsa, imza doğrudan ME'den görülebilir, çok uygun

kısıtlama hakkında, bir seçenek olarak, görevi ayrı bir iş parçacığına atın, ardından öldürün, C #'da çok hızlı bir şekilde yapılır

veya dll'nin içine aramalar yazabilirsiniz

bence sorun değil


UPD:

MQL görevlerinde OOP kullanmanın makul olup olmadığı konusundaki son araştırmamı açıklayabileceğimden şüpheliyim, ancak gördüklerimi yazacağım

Genel olarak, OOP stilini kullanıyorsanız, tamamen erişim kontrolü ile ve bilinçli olarak tüm özel / korumalı / genel değiştiricileri ayarlayın ve her bir yöntemi ve imzayı tanımlarken const kullandığınızdan emin olun (yöntemin amacı değiştirmek ise kaldırabilirsiniz). veri) ve korunan verilere tüm erişimleri get / set ile yazın - OOP'nin doğru kullanımının sonucu , geliştirme aşamasında kasıtsız veri değişikliğinden kaynaklanan karmaşık hataların tanımlanmasıdır.

Bir sınıfı bu şekilde sıfırdan yeniden yazdım - derleyici görevimle hemen bir tutarsızlık buldu, fikri kontrol ederken (test ederken) çocuktan temel sınıfa tırmandı, her zamanki gibi dikkatim dağıldı ve onu kaldırmayı unuttum - Test sırasında bu hatayı bulabileceğim bir gerçek değil, böyle tasarlanmış olduğunu düşünmek isterim))).

Benim için bir başka göze çarpan artı, küresel olarak tanımlanmış tüm değişkenleri bırakmam - bunları kullanmamaya çalışıyorum, burada hiç kullanılmıyorlar (genel bayrak optimizasyonu dışında - görevlerim ve kritik bir hata bayrağı için) ticaret yaparken)

İlginç bir gözlem, tüm çağrıları get / set yoluyla yeniden yazdığımda, sınıf kaynağının önce hacminin artması ve ardından get / set çağrılarında ikame etmeye başladığında önemli ölçüde küçülmeye başlamasıdır - yani. Bunun kodu hacim olarak büyük ölçüde şişirdiğini söylemeyeceğim, ancak bir kez daha - bu, verilerin bütünlüğü üzerinde kontrol sağlayacaktır!


Not: Pekala, eğer özünde mükemmeliyetçiyseniz ve get / set üzerinden yapılan ekstra bir aramanın ekstra işlemci döngüleri olduğunu düşünüyorsanız, o zaman görev %100 tamamlandığında, her bir get / setin çağrılarını saymak zor değildir. kaynak kodda bir arama yaparak ayarlayın ve eski kuralı uygulayın - bir kod bölümünü bir kereden fazla çağırırsanız, bu kod bölümünü bir alt program olarak düzenlemeniz gerekir .... kimse bunun tersini yasaklamaz ---> sadece bir kez get / set çağrısı alanın atanmasına / okunmasına genişletildi ....

 
Igor Makanu :

MQL5 için yalnızca statik olanları kullandım - statik bir değiştirici varsa, imza doğrudan ME'den görülebilir, çok uygun

kısıtlama hakkında, bir seçenek olarak, görevi ayrı bir iş parçacığına atın, ardından öldürün, C #'da çok hızlı bir şekilde yapılır

veya dll'nin içine aramalar yazabilirsiniz

bence sorun değil

Sharp için, statik üyeler demek istemedim, ama bu

 public static class ClassName {}

Statik bir sınıfın bir örneği yeni yoluyla oluşturulamaz, silme yoluyla yok edilemez, yapıcıları ve yıkıcıları yoktur, tüm üyeler ve yöntemler yalnızca statiktir. Kısacası uzun zamandır çalışmıyorum ama Procrustean yatak gibi ne kadar çok rahatsızlık olduğunu hatırlıyorum.

Genellikle matematik gibi kütüphane işlevleri için bir kapsayıcı olarak kullanılırlar.

 
Alexey Volchanskiy :

Sharp için, statik üyeler demek istemedim, ama bu

MQL'nin statik değiştirici olmadan görmeyeceğini düşünüyorum, bu bir sınıftır, ancak statik değiştiricili içindeki yöntemler görürse

dll içinde yerel olarak, sınıfları istediğiniz gibi kullanın, dll'de statik olmayan bir WinForm sınıfı yaptım, her şey yolunda gidiyor, ancak bildirilen işlevleri statik aracılığıyla çağırdım ve bu işlevlerin hangi sınıfın içinde bildirildiği önemli değil dll'yi MQL'den çağırmak için, tüm sınıf statik olsa bile, en azından hepsi değil

Henüz kontrol edemiyorum, stüdyoyu SSD ile değiştirdikten sonra ihtiyacım olana kadar dizüstü bilgisayara kurmadım

 
Alexey Volchanskiy :

Henüz MQL5 altında C# DLL'yi denemeye başlamadım. C++'da sarmalayıcılarla yapardım, artılardan C#'da sınıfın bir örneğini oluşturdum. Artık DLL'de olasılıkları büyük ölçüde sınırlayan statik bir sınıfın kullanılacağına dair bir şüphe var. Sınıfın şimdi statik mi yoksa dinamik mi olduğunu bilen var mı?

Sınıf normaldir, yöntemler statiktir. Diğer seçenekleri denemedim.

 
Igor, Dmitry, kısacası, kendin denemek zorundasın. Anladığım kadarıyla, her durumda, sınıf nesnesinin adına değil, sınıf adına başvurmanız gerekir. Deneyeceğim efendim.
 
Tünaydın! Ve sinyaller hakkında bir sorum olursa nereye yazmalıyım? Depozito 312 $ ise, sinyallere abone olmanın tavsiye edilip edilmediğini bilmek istiyorum. Ve bir buçuk ay önce ticarete başladıysanız, bir komisyoncuya nasıl hiç güvenip verimli çalışamazsınız? Teşekkür ederim.
 
Alexey Volchanskiy :
Igor, Dmitry, kısacası, kendin denemek zorundasın. Anladığım kadarıyla, her durumda, sınıf nesnesinin adına değil, sınıf adına başvurmanız gerekir. Deneyeceğim efendim.

Sınıf adına göre adres.

 
Alexey Volchanskiy : Igor, Dmitry, kısacası, kendiniz denemelisiniz. Anladığım kadarıyla, her durumda, sınıf nesnesinin adına değil, sınıf adına başvurmanız gerekir. Deneyeceğim efendim.

MQL5'ten C# çağırmanın tek yolunun bu olduğunu söyleyemem, geliştiricilerden bir örnek kullandım https://www.mql5.com/ru/forum/285631

 #import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int x= 41 ;
   TestClass::Inc(x);
   Print (x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

C#'da giriş noktasını almak için başka yöntemler kullanmadım, teflerle belli bir dansla aynı .dll kodu MT4 için derlenebilir

makale ve araştırmam makaledeki kodun neden amaçlandığı gibi çalışmadığını https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - her şey şu ana kadar çalışıyor

 

OOP tarzı kodla savaşımın sonuçlarını gözden geçirdim - hmm... mükemmel! ))))


soru ortaya çıktı, ancak kodumda, üç kez, formun yapısı tam olarak kullanılıyor:

 private :
   COrder            *m_order;
.......

// использую так
return ( CheckPointer (m_order)== POINTER_INVALID ? true : m_order.Orderclose());

//или так

if ( CheckPointer (m_order)== POINTER_INVALID )

aramaların tümü özel yöntemlerdedir, ancak bir "jedi hilesi var mı?" CheckPointer'dan kaynak metinde kaçmak için (m_order)==POINTER_INVALID

Bazı get / set hakkında soruyorum

özel bir sorun yok, ama tabiri caizse bir heves veya C ++'daki OOP teknikleri bilgisi için susuzluk henüz azalmadı

Neden: