MQL5'te OOP hakkında sorular - sayfa 9

 
Igor Makanu :

Hangi tonlardan bahsediyoruz? gözden kaçan her şey, her şey terminal tarafından rapor edilecek, silinecek yer de biliniyor - OnDeint() .... konuşma, bir boşlukta küresel bir at tartışmasına indirgendi mi? )))

Numara. Atın olması gereken yere sürmesine izin verin.

Ve daha önce bilinmeyen nesnelerin yaratılmasından bahsediyoruz. Ve sadece özellikler hakkında değil, aynı anda yaratılan nesnelerin sayısı hakkında da bilinmiyor.

Birincisi, elbette bir işaretçi oluşturabilir ve bu işaretçiyi kullanarak bu nesneyle çalışabiliriz. Ama kaç tane işaretçiye ihtiyaç duyulacağını önceden bilmiyorsak, o zaman hangi at var? nasıl bir boşluk? Burada yalnızca en basit ve aynı anda mevcut olanlardan - işaretçileri listelerde saklamak. Onları listeden alın. Her nesnenin, işaretçinin ne tür bir nesneye işaret ettiğini belirleyebileceğiniz kendi tanımlayıcısı (Type () yöntemi) olabilir. Oluştururken, bir nesnenin tam olarak tanımlanmasını organize etmek mümkündür (türüne ek olarak, bir nesneye onu aynı türdeki aynı nesnelerden ayıran başka özellikler de verilebilir).

Genel olarak - nesnelerin sınıflandırılmasını gerektiren daha karmaşık yapılardan bahsettiğim hissi, bunların depolanması için listeler ve yalnızca istek üzerine bilgi depolayabilen ve veremeyen, aynı zamanda "yaşayan ve geliştiren" nesnelerle çalışma yöntemleri programla etkileşime girmek, zaman zaman kendilerini değiştirmek ve bu eylem hakkında raporlama yapmak.

Muhtemelen ormana tırmandım ve başlatma sırasında iki alanı değiştirmeniz gereken ve yaşam boyunca hiçbir şekilde değişmemeleri gereken bir nesneyi tartışmanız mı gerekiyor? Ve neden girdi değişkenleri varsa, o zaman bir nesne?

 
Bir nesneyi kendisi yaratan dışında hiç kimse silmek zorunda değildir. Bazı durumlarda bu olsa bile, güvenmemelisiniz. Kendim oluşturdum - kendim sildim.
 
Dmitry Fedoseev :
Bir nesneyi kendisi yaratan dışında hiç kimse silmek zorunda değildir. Bazı durumlarda bu olsa bile, güvenmemelisiniz. Kendim oluşturdum - kendim sildim.

Bu doğru. Ama şimdi başka bir şeyden bahsediyoruz. Öyle değil mi?

Nesnelerin kesinlikle kaybolmadığı ve onları kesinlikle bulabileceğiniz yöntemlerden bahsediyoruz.

Bir nesne oluşturuldu - lütfen onu bilin ve kaybetmeyin, böylece daha sonra silebilirsiniz ve nesneye işaretçinin kaybolması nedeniyle bellek sızıntısı olmadı (işaretçinin işaretçinin bulunduğu örnekte bir bellek sızıntısı ile başladık). işleve iletilen nesneye, işlevin gövdesinde yeni oluşturulan nesneye yeniden atanmıştır).

Ve herkesin kendi tercihleri vardır - biri bir şeyden hoşlanır, başka biri. Ama nesnelerimizin her biri hakkında bilgi sahibi olmak için - en azından iki tane var, en azından iki bin iki tane var, yapmalıyız - peki .., onları daha sonra silmek için. Ama onları silerek kendimiz mi silelim, yoksa listenin onları Clear() ile mi yoksa liste üzerinde bir döngü içinde silmesine ve silmesine izin mi vereceğiz, yoksa başka bir şekilde mi - bu aynı soru değil.

 
Artyom Trishkin :

Genel olarak - nesnelerin sınıflandırılmasını gerektiren daha karmaşık yapılardan bahsettiğim hissi, bunların depolanması için listeler ve yalnızca istek üzerine bilgi depolayabilen ve veremeyen, aynı zamanda "yaşayan ve geliştiren" nesnelerle çalışma yöntemleri programla etkileşime girmek, zaman zaman kendilerini değiştirmek ve bu eylem hakkında raporlama yapmak.

Muhtemelen ormana tırmandım ve başlatma sırasında iki alanı değiştirmeniz gereken ve yaşam boyunca hiçbir şekilde değişmemeleri gereken bir nesneyi tartışmanız mı gerekiyor? Ve neden girdi değişkenleri varsa bir nesne?

garip OOP kavramı, OOP her şeyden önce uygundur - bir kez yazın, ardından nesnenin yeni örneklerini oluşturun

tartışmanın başına dönersek, işte örneğim, sık sık kullanıyorum https://www.mql5.com/en/forum/160683/page861#comment_11840254

Şimdi ticareti bir zaman aralığı ile sınırlamam gerekiyor ve bir dahaki sefere 2.. 4...

2 tıklama örneğim bu görev için değiştirildi:

 int OnInit ()
{
   Work1= new CWorkTime(StartHour1,StartMinute1,StopHour1,StopMinute1);
   Work2= new CWorkTime(StartHour2,StartMinute2,StopHour2,StopMinute2);
   Work3= new CWorkTime(StartHour3,StartMinute3,StopHour3,StopMinute3);
   Work4= new CWorkTime(StartHour4,StartMinute4,StopHour4,StopMinute4);
}


Bilmiyorum, ama kategorilerde düşünmek, OOP'nin sadece her şeyi bir sınıfa sarmak olduğunu ve işte bu bir mucize - benim üst sınıfım ve bunu ve şunu yapabilir ... ve eğer sınıf 10 satır ise, o zaman burada OOP gerekli değil - neden kendinizi sınırlayıp herkesi yanlış yönlendiriyorsunuz?

benim için uygun olan yerde, orada OOP kullanıyorum, tartışma kesinlikle dine girdi - OOP'yi yasaklamak veya kullanmak))))

 
Igor Makanu :

garip OOP kavramı, OOP her şeyden önce uygundur - bir kez yazın, ardından nesnenin yeni örneklerini oluşturun

tartışmanın başına dönersek, işte örneğim, sık sık kullanıyorum https://www.mql5.com/ru/forum/160683/page861#comment_11840254

Şimdi ticareti bir zaman aralığı ile sınırlamam gerekiyor ve bir dahaki sefere 2.. 4...

2 tıklama örneğim bu görev için değiştirildi:


Bilmiyorum, ama kategorilerde düşünmek, OOP'nin sadece her şeyi bir sınıfa sarmak olduğunu ve işte bu bir mucize - benim üst sınıfım ve bunu ve şunu yapabilir ... ve eğer sınıf 10 satır ise, o zaman burada OOP gerekli değil - neden kendinizi sınırlayıp herkesi yanlış yönlendiriyorsunuz?

benim için uygun olan yerde, orada OOP kullanıyorum, tartışma kesinlikle dine girdi - OOP'yi yasaklamak veya kullanmak))))

Kesinlikle - Ben aktif olarak OOP kullandığım için sizi bu dine almıyorum.

Örneğin: ya biraz daha aralık gerekirse? Yeni WorkNNN oluşturulsun mu? Ne için? Program koduna müdahale etmeden tek bir liste ile idare edebilirseniz.

Görünüşe göre farklı şeylerden bahsediyoruz. Ben kullanım kolaylığından bahsediyorum ve siz ... kolaylıktan da bahsediyorsunuz, ama gösterdiğiniz kod uygun değil. Belki sadece abartılı elbette ve ben bunu anlamadım ...

 
Artyom Trishkin :

Örneğin: ya biraz daha aralık gerekirse? Yeni WorkNNN oluşturulsun mu? Ne için? Program koduna müdahale etmeden tek bir liste ile idare edebilirseniz...

sınıf örneklerinin listelerini veya dizilerini kullanmanız gerekecek - önemli değil, ancak böyle bir örnek için bir dizi kullanmak daha kolay ve sadece bir döngü yapın:

 bool DisableTrade= false ;
   for ( int i= 0 ;i< ArraySize (Work);i++)
     {
       if (Work[i].Disable()) {DisableTrade= true ; break }
     }
   if (DisableTrade)
     {
       Comment ( "Не торговое время!!! Сопровождение открытых ордеров" );
     }
   else ...

Artyom Trishkin :

Görünüşe göre farklı şeylerden bahsediyoruz. Ben kullanım kolaylığından bahsediyorum ve siz ... kolaylıktan da bahsediyorsunuz, ama gösterdiğiniz kod uygun değil. Belki sadece abartılı elbette ve ben bunu anlamadım ...

Ne yazık ki, evrensel bir kod yazmak imkansızdır, eğer yazılırsa, daha fazla modifikasyonu zahmetli bir süreç olacaktır ve sonuç olarak, evrensel kod daha kaynak yoğun olacaktır - genel olarak, bunun hakkında sonsuza kadar konuşabiliriz. , zaten yazdığımda, tanınmış programcılardan birinin dediği gibi - "kod görevini yerine getirmeli! - bu kadar yeter" ve diğer her şey ... iyi, bu daha derine inme arzusu veya .. diyelim ki oluşturmak! )))

 
Artyom Trishkin :

///

Örneğin: ya biraz daha aralık gerekirse? Yeni WorkNNN oluşturulsun mu? Ne için? Program koduna müdahale etmeden tek bir liste ile idare edebilirseniz.

///

Ardından, özellikler penceresinde aralığın sayısal parametreleri olmayacaktır. Optimize etmek imkansız olacak. Bir seçenek değil.

Her aralık için yeni bir nesne oluşturulması da en iyi seçenek değildir. Yine de, frenleri arttırır. Eğer bir sınıf yapacaksak, o zaman içindeki interval parametreleri diziye eklenecek şekilde. Daha hızlı olacak.

 
Dmitry Fedoseev : rmoza. Eğer bir sınıf yapacaksak, o zaman içindeki interval parametreleri diziye eklenecek şekilde. Daha hızlı olacak.

tek bir sınıf veya birkaç parametre eklediğiniz () bir fonksiyon oluşturmanız, bireysel parametrelerle birkaç sınıf oluşturmanız kesinlikle hiçbir fark yaratmaz.

Not: Uzun bir "kod ayak örtüsü" şeklinde büyük bir işlev yazarsanız - geçişleri tahmin ederken böyle bir "ayak bezi" kazanmak mümkün olsa da, işlemci önbelleği her zaman verimli kullanılmayacağını unutmayın. .... bu yalnızca test gösterebilir, ancak belirli bir bilgisayarda ve belirli bir derleyicide ...

 
Dmitry Fedoseev :

Daha sonra, özellikler penceresinde aralığın sayısal parametreleri olmayacaktır. Optimize etmek imkansız olacak. Bir seçenek değil.

Her aralık için yeni bir nesne oluşturulması da en iyi seçenek değildir. Yine de, frenleri arttırır. Eğer bir sınıf yapacaksak, o zaman içindeki interval parametreleri diziye eklenecek şekilde. Daha hızlı olacak.

Kabul ediyorum. Ve yine, her şey ödeme alanlarını ayarlama yöntemlerine bağlıdır. Ve bunların giriş parametrelerinden tüm aralıkları depolayan bir nesneye nasıl aktarılacağı bir teknoloji meselesidir. Aralıklar listesinin tüm nesnelerini yeniden oluşturmak ve bunlardan yalnızca birini değiştirirken mümkün olsa da - bu, kod yazarken verileri değiştirme sorunuyla ilgili bir pratiklik ve "rahatsız edici / rahatsız edici değil" meselesidir.

 
Roman :

Lütfen yeni operatör aracılığıyla dinamik bir nesne oluşturmanın anlamını açıklayın.

Otomatik olarak bir nesne oluştururken, yığın üzerinde bir sınıf nesnesi oluşturulur, yürütme süresi açısından dinamik olandan daha hızlıdır.
Dinamik olarak bir nesne oluştururken, işletim sistemi bellek yöneticisini kullanırken bellekte (yığın üzerinde) bir sınıf nesnesi oluşturulur, işlem daha yavaştır.

İşte sorular:
Otomatik oluşturma daha hızlıysa, dinamik nesneleri kullanmak neden daha iyidir?
Açıkça bellek tahsisini kontrol ediyor musunuz?
Olası bir yığın taşması ekarte edilsin mi?
Ve aniden nesneyi kaybetmez misin?
Yığın taştığından beri nesne otomatik olarak silinecek mi?

Tünaydın. Bilgisayar belleği, yığın veya yığın bağlamında kullanılsa da aynı performansa sahiptir. Dinamik belleğin yönetimi, çöp toplayıcının uygulanmasına bağlıdır: örneğin, Python'da olduğu gibi (daha yavaş sürüm) referans sayımı veya arka plan işleminde yürütme grafiğini atlayarak nesne oluşturma dönemlerinin analizi (Net CLR) olabilir. MQL'de hangi varyantın kullanıldığı bilinmiyor, ancak aşırı verimliliğini varsayabiliriz, çünkü MQL5 kullanıcısının doğrudan silme operatörüne erişimi vardır, bu da GC'nin çalışmasını büyük ölçüde basitleştirir. Bu bağlamda, yeni kullanırken ek yük'a ilişkin endişeleriniz boşuna - dinamik bellek kullanmaktan çekinmeyin.

"Yığın taşması"na gelince, bu duruma modern sistemlerde ancak karmaşık özyineleme kullanıldığında veya özyinelemeli algoritmada bir hata olduğunda rastlamak mümkündür. Modern bir program her zaman korumalı OC modunda, dinamik sayfa yükleme ile sanal bir adres alanında çalışır, bu nedenle endişelenmeyin: yığın bitmeyecek :)