Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 192

 

OOP'ta ustalaşmaya başladım ve bir sonraki engeli aşamadım. Örnek olarak, aşağıdaki komut dosyası:

CSum result;
void OnStart ()
  {
//---
  }
//+----------------------------------------+
class CSum
  {
public :
   int                Calculate( int A, int B);
  };
//---
int CSum::Calculate( int A, int B)
  {
   return (A+B);
  }

"CSum sonucu" satırı olmadan; derleyici hata vermez. Ve bir hata ile geliyor:

Bana neyin yanlış olduğunu söyle. Sınıfın bir nesnesini doğru olarak bildirmiş gibi görünüyor.

 
paladin800 :

OOP öğrenmeye başladı ve bir sonraki engeli aşamadı. Örnek olarak, aşağıdaki komut dosyası:

"CSum sonucu" satırı olmadan; derleyici hata vermez. Ve bir hata ile geliyor:

Bana neyin yanlış olduğunu söyle. Sınıfın bir nesnesini doğru olarak bildirmiş gibi görünüyor.

CSum (sonuç) türündeki değişken - CSum'un açıklaması yapılmadan önce bildirilir, bu da derleyicinin henüz bu türü bilmediği anlamına gelir. Dosyanın en başına CSum ekleyin.
 
Lone_Irbis :
Ama bana daha fazlasını söyle , küresel değişkenler sistemini kullanmak ne kadar mümkün/değer? Bir şeyi bu şekilde aşırı yüklemek veya bir tür sınırla karşılaşmak mümkün mü? Diyelim ki iki yüz birkaç değişken (hangi kod parçasının test gerektirdiğine bağlı olarak bunların yaklaşık yarısı girdi ve geri dönüşüyor) ve küresel düzeyde yaklaşık bir düzine buçuk küçük dizi - bu çok mu yoksa az mı? ^^' Sistemi bitirme sürecinde iki veya üç kat daha fazla olurlarsa? Ve kendinizi bu kadar kaptırmak istemiyorsanız, çoğu birbirinin çalışmasının sonuçlarını gerektiren bir düzine farklı alt sistem arasında veri alışverişi yapmanın daha kolay bir yolu var mı?
Hayır, buna değmez. Global değişkenler başka amaçlar için kullanılır. Alt sistemleri tanımlamak için sınıfları kullanın. Ve genel olarak dizilerin ve global değişkenlerin kullanımını reddetmek daha iyidir.
 
C-4 :
CSum (sonuç) türündeki değişken - CSum'un açıklaması yapılmadan önce bildirilir, bu da derleyicinin henüz bu türü bilmediği anlamına gelir. Dosyanın en başına CSum ekleyin.
Ps, işe yaradı. Yerleştirme işlevlerine benzer şekilde sınıfı kodun sonuna yerleştirdim. Böyle bir düzenin sınıf için önemli olacağını beklemiyordum.
 
paladin800 :
Ps, işe yaradı. Yerleştirme işlevlerine benzer şekilde sınıfı kodun sonuna yerleştirdim. Böyle bir düzenin sınıf için önemli olacağını beklemiyordum.
Evet, sipariş önemlidir. En zor durum, iki sınıfın aynı anda birbirini kullanmasıdır. O zaman ilk hangi sınıfı eklersek, ikinci sınıf derleyici tarafından bilinmeyecek ve bir hata üretecektir. Bu durumda, sınıf bildirimi vazgeçilmezdir. Sizin durumunuzda, CSum'u ayrı bir dosyaya, örneğin Sum.mqh'ye ayırmak ve onu #include "Sum.mqh" yönergesine dahil etmek daha iyidir.
 
C-4 :
Hayır, buna değmez. Global değişkenler başka amaçlar için kullanılır. Alt sistemleri tanımlamak için sınıfları kullanın. Ve genel olarak dizilerin ve global değişkenlerin kullanımını reddetmek daha iyidir.
Tabii ki, sınıfları bulmanın akıllıca olacağını anlıyorum ... ama onlarsız daha tanıdık olduğu ve yine de işe yaradığı düşünülürse, hala bir şekilde tembelim. Ama sadece merak ediyorum, avantajları nedir? Kodun bir yazar tarafından yalnızca kendisi için yazıldığı ve belirli bir programın dışında hiç kimseye asla yararlı olmayacağı kesin olarak bilindiği takdirde? Her nasılsa, yalnızca birisi için / biriyle / satılık yazarsanız, sınıflarla uğraşmanın her zaman mantıklı olduğu görülüyordu, ancak bir hobi olarak kendiniz için çok fazla fark olmayacak. Estetik ve genel "beklendiği gibi" ek olarak, tüm bu sınıf-yapılara tırmanmanın pratik bir anlamı var mı? Verim? Başka bir şey?
 
Lone_Irbis :
Tabii ki, sınıfları bulmanın akıllıca olacağını anlıyorum ... ama onlarsız daha tanıdık olduğu ve yine de işe yaradığı düşünülürse, hala bir şekilde tembelim. Ama sadece merak ediyorum, avantajları nedir? Kodun bir yazar tarafından yalnızca kendisi için yazıldığı ve belirli bir programın dışında hiç kimseye asla yararlı olmayacağı kesin olarak bilindiği takdirde? Her nasılsa, yalnızca birisi için / biriyle / satılık yazarsanız, sınıflarla uğraşmanın her zaman mantıklı olduğu görülüyordu, ancak bir hobi olarak kendiniz için çok fazla fark olmayacak. Estetik ve genel "beklendiği gibi" ek olarak, tüm bu sınıf-yapılara tırmanmanın pratik bir anlamı var mı? Verim? Başka bir şey?

Tam tersi. Siparişe yazdığınızda, genellikle müşteri kaynak kodunu ister. Ve burada, sınıflardan işlevleri çıkarmanız ve bunları kaynak koduna eklemeniz gerekir. Yine de, müşterinin işi tek bir dosyada aktarması ve müşteriye aktarılan işte çok sayıda kullanılmayan işlevin bulunduğu kitaplıklarından bir dağ çekmemesi daha iyidir. Yani, sipariş vermek için yapılandırılmış programlama kullanmak daha iyidir.

Kendiniz için OOP kullanmak daha iyidir - her şey orada ve kaynağı aktarırken uğraşmanıza gerek yok.

 
artmedia70 :

Tam tersi. Siparişe yazdığınızda, genellikle müşteri kaynak kodunu ister. Ve burada, sınıflardan işlevleri çıkarmanız ve bunları kaynak koduna eklemeniz gerekir. Yine de, müşterinin işi tek bir dosyada aktarması ve müşteriye aktarılan işte çok sayıda kullanılmayan işlevin bulunduğu kitaplıklarından bir dağ çekmemesi daha iyidir. Yani, sipariş vermek için yapılandırılmış programlama kullanmak daha iyidir.

Kendiniz için OOP kullanmak daha iyidir - her şey orada ve kaynağı aktarırken uğraşmanıza gerek yok.

Hmm... Şey, belki öyle :) Bu, ilke, elbette, cazip görünüyor... teoride. Özellikle herhangi bir yapı ve sınıf olmadan tek bir dosyam olamayacağını düşünürsek. Mesele şu ki, çoğunlukla meraktan yazıyorum, kendi rastgele teorilerimi test ediyorum ve sonsuz bisikletler icat ediyorum. Paralel olarak, yalnızca fikri uygulamak için gerekli olanı incelemek. Bütün bunlar, bir eğitimsel ve deneysel Uzman Danışman çerçevesinde gerçekleşir - başlangıçta en basit Martin, ancak şimdi daha çok tomurcukta (ve şimdi teorik olarak karlı) çok işlevli bir yüzücü. Böylece, bir noktada robot çok büyük oldu. >>> Çoğu zaman doğru kod parçasını aramak için fare tekerleğini aptalca kaydırmaya başladığımda, onu ayrı dosyalara bölmek için "mükemmel" bir fikir buldum (şu anda 13 eklenti parçası) , sadece işlevleri ortak kavramlarına göre gruplayarak. Buradaki bir haber ayrıştırıcısı, orada seviye işleme, geyik denetleyicileri, ayrı istatistikler vb. Ama o zamanlar OOP ile başa çıkma hevesim daha fazlası için yeterli değildi ...

Yani, görünüşe göre benim sorunum, aklıma gelen her fikri kapmak ve onu mevcut bir robotun üzerinde oldukça ... kaotik bir sırayla bitirmem. Sonuç oldukça garip ve farklı modların her türlü anahtarı ve birçoğu tamamlanmamış olan kombinasyonlarıyla dolu. Resim, çok fazla zaman almamaları için girişlerden çıkarılması gereken ve test cihazının görselleştiricisinde başlangıçta basılan yüzlerce global değişkenle tamamlanır. Artı, tabii ki, çöp dağları ve terk edilmiş veya yeniden işlenmiş fikirlerin temelleri.

Ve sonra, öyle görünüyor ki, tüm bu çöp yığınını temizlemenin ve her şeyi sınıflara sokmanın zamanı geldi (ve ilk önce süreçte uykuya dalmadan OOP hakkında en az bir makaleyi sonuna kadar okuyun) ... ilerisi kafa karıştırıcı ve, um, tüm bunların başlamanın potansiyel anlamı ile ilişkisi. Yani, her şeyi sınıflara dahil etmek o kadar hacimli bir görev gibi görünmüyor ... Ancak, örneğin, tüm bu özel / korunanları gereksiz olarak görmezden gelerek, örneğin, her şeyi aptalca herkese açık hale getirmeniz mantıklı olur mu? Bir avuç .mph klasörüne, her biri bir düzine normal işleve sahip olmaktan daha iyi ne olabilir, eğer hepsi bir ve tek bir robotta bir araya gelirse?

 
Lone_Irbis :

Başlatma, bağlantı, her zaman gerekli verilerin toplanması için en gerekli eylemlerin zaten kayıtlı olduğu tek bir şablon oluşturmanızı tavsiye ederim. vb. ...

Akla beklenmedik bir fikir geldi - şablonu yüklüyoruz, yeniden adlandırıyoruz ve içine yalnızca bu fikirle ilgili olanı yazıyoruz. Ve her zaman, herhangi bir kodda kullandığınız, her durumda aynı verileri döndüren işlevler - bunları sınıflara koyun. Ve her şey hemen yerine oturacak. Ve yine de dizinleri yapılandırmak mümkündür. \experts\ create (benim için) Orders klasöründe, farklı müşterilere ait tüm dosyaları da ayrı klasörlere ekliyorum, Ideas, Tests vb. bir klasör var.

Bu şekilde işleri kendiniz düzene koyacaksınız.

 
Ne yazık ki, resmi olarak OOP eğitimi almış olsanız bile, bir OOP programı oluşturamazsınız. Burada daha çok, bu yaklaşımın felsefesine dalmak gerekir ve bu, formel bilgi edindikten sonraki bir sonraki aşamadır. Yani ortaya çıkıyor, ama buna ihtiyacın var mı? Ancak bunu en iyi nasıl yapacağınızla ilgili sorular sorarsanız, seçtiğiniz yolun uygun olmadığını hissedersiniz. Her durumda, seçim sizin.