OOP uzmanları için soru. - sayfa 6

 
Реter Konow :

Kod taşınabilir değil, özelliği bu. Taşınabilir olması amaçlanmamıştır. Başka bir amacı var. Değişkenlerin küresel kapsamı, karmaşık mekanizmaların çalışması için güçlü bir araçtır. Sadece nasıl kullanılacağını bilmeniz gerekiyor. Ve bana bazı gizli hatalardan ve buglardan bahsettiklerinde kayboluyorum. Değişkenlerin küresel görünürlüğü ile ilgili hiçbir zaman hatam olmadı. Hiç kelimeden.

Global değişkenlerle ilgili problem, eğer proje yeterince büyükse ve bu değişkenlerin durumu kodun birçok bölümünden değişiyorsa, o zaman hata aramanın oldukça zahmetli olmasıdır.

Misal. Global bir değişkenin değerinin olması gerektiği gibi olmadığı gerçeğiyle ilgili bir hata bulundu. Projede zaten birkaç düzine dosya ve 100500 satır kod var. Bu değişkenin kodda kaç yerde değiştiğini kimse hatırlamaz. Sonuç olarak - bir kutu kahve ve kafanız klavdayken sağlıklı bir uyku.

Ve şimdi aynı şey, ama OOP. Kodu doğru yazdık ve tüm alanlar özel. Buna göre sadece class metotlarında bizimle direkt, dışarıdan ise sadece Set metodu ile değişir. Buna göre Set yöntemine kesme noktaları asıyoruz ve alanın değiştiği sınıfta kaç tane yöntemimiz var ve nerelerde değişiklik yapıldığını ve nerede yanlış değiştirildiğini sakince takip ediyoruz.

 
Реter Konow :

Değişkenlerin küresel görünürlüğü ile ilgili hiçbir zaman hatam olmadı. Hiç kelimeden.

Seni bariz olana nasıl ikna edeceğimi bile bilmiyorum, ama muhtemelen buna değmez, bunun için bana para ödemiyorlar mı?

Ne için çabalıyorsun? Eh, övülmek istiyorsanız - devam edin:

Peter! Güzel iş böyle devam et!

))))

 
Vladimir Simakov :

Global değişkenlerle ilgili problem, eğer proje yeterince büyükse ve bu değişkenlerin durumu kodun birçok bölümünden değişiyorsa, o zaman hata aramanın oldukça zahmetli olmasıdır.

Misal. Global bir değişkenin değerinin olması gerektiği gibi olmadığı gerçeğiyle ilgili bir hata bulundu. Projede zaten birkaç düzine dosya ve 100500 satır kod var. Bu değişkenin kodda kaç yerde değiştiğini kimse hatırlamaz. Sonuç olarak - bir kutu kahve ve kafanız klavdayken sağlıklı bir uyku.

Ve şimdi aynı şey, ama OOP. Kodu doğru yazdık ve tüm alanlar özel. Buna göre sadece class metotlarında bizimle direkt, dışarıdan ise sadece Set metodu ile değişir. Buna göre Set yöntemine kesme noktaları asıyoruz ve alanın değiştiği sınıfta kaç tane yöntemimiz var ve nerelerde değişiklik yapıldığını ve nerede yanlış değiştirildiğini sakince takip ediyoruz.

Pratikten. Projemde 100'den fazla bağlantılı dosyam var. Bazıları 2000'den fazla kod satırına sahiptir. Genel değişkenler baştan sona kullanılır. Özellikle küresellikleriyle ilgili herhangi bir hata olmadı. Belki yeni alıştım?)) Muhtemelen hiçbiri yoktur çünkü tüm değişkenler Rusça ve isimleri anlamlıdır. Sdf veya iukj yok. Bu nedenle, bunlarla ilişkili herhangi bir hata yoktur. Temel olarak, global değişkenleri global olayların bayrakları için kullanıyorum - örneğin, bir pencere açmak, bir fare düğmesine basmak, ağaç listesini genişletmek, vb. ... Ayrıca, odaklanmak için. Yani, fare GUI'nin etrafında dolaşır ve tüm nesnelerin ve öğelerin sayıları ve özellikleri global değişkenlere girilir ve gerekli bloklar, odaktaki nesneler ve öğelerle anında çalışan OnChartEvent'ten çağrılır. Çok rahat.
 
Igor Makanu :

Seni bariz olana nasıl ikna edeceğimi bile bilmiyorum, ama muhtemelen buna değmez, bunun için bana para ödemiyorlar mı?

Ne için çabalıyorsun? Eh, övülmek istiyorsanız - devam edin:

Peter! Güzel iş böyle devam et!

))))

Hiçbir şey almıyorum. Belki de sadece OOP ile değil, harika projeler yazabileceğinizi anlamak. Ve sadece OOP'ye sahip olmak bir geliştiricinin işareti değildir. OOP ile birçok sorunu çözmenin mümkün olduğunu iddia etmiyorum. Ancak başka yaklaşımlar da var.
 
Tartışmaya katıldığınız için herkese teşekkürler. İki yaklaşımın olanaklarını gerçekten karşılaştırmak için OOP'yi anlamaya çalışacağım. OOP'nin sağlayabileceği hiyerarşi ile ilgilendim ve faydaları sözdiziminin altına gömülmezse, kesinlikle hizmete alacağım.
 
Реter Konow :
Belki de sadece OOP ile değil, harika projeler yazabileceğinizi anlamak. Ve sadece OOP'ye sahip olmak bir geliştiricinin işareti değildir. OOP ile birçok sorunu çözmenin mümkün olduğunu iddia etmiyorum. Ancak başka yaklaşımlar da var.

bu OOP ile ilgili değil, kod yazmanın ilkeleri hakkında, bundan ikinci kez bahsediyorum ve @Vladimir Simakov yukarıda bir örnek yazdı

değişkenlerin küresel görünürlüğünü kullanın - evet, soru yok, kimse yasaklamıyor, yapabilirsiniz - ama sessizce, kimse görmeden! )))

ama işte bu yüzden sürekli kullanılan program yazma tarzı kötüdür ve ne kadar çok kod olursa, bu kötülük o kadar fazla olur! - bu kadar açıklanmış mı? )))

Not: bir kontrol çekimi daha - MQL yardımına bakın, tüm işlevlerin ayrı tamamlanmış bağımsız bloklar tarafından gerçekleştirildiğini görüyor musunuz? - geçirilen parametreler = alınan sonuç! Metaquot programcılarının her şeyi yine yanlış yaptığını mı düşünüyorsunuz? fonksiyonları yazmak için bazı ücretsiz stiller kullanmanız gerekiyor - burada global görünürlükte açıklayacağız, ancak burada kullanıcı fonksiyonu çağıracak ve sonucu alacak! )))) - prosedürel stil (her alt program tam bir mantıksal blok olduğunda) doğru koddur, kodları doğru yazın! doğru değil ... peki, "çabuk ihtiyacınız olduğunda" gelecek;)

 
Реter Konow :
Pratikten. Projemde 100'den fazla bağlantılı dosyam var. Bazıları 2000'den fazla kod satırına sahiptir. Genel değişkenler baştan sona kullanılır. Özellikle küresellikleriyle ilgili herhangi bir hata olmadı. Belki de alışıyorumdur?

Sadece çok iyi bir hafızan var. Herkes o kadar şanslı değil. Bugün hangi değişkenleri tanıttığımı zar zor hatırlıyorum. Ve ne bir hafta önce - sadece unuttun. Ancak bu bir sorun değil, hepsi yereldir ve herhangi bir nesnenin alanlarına erişim yalnızca ilgili işlevlerden geçer. OOP, birçok noktayı hatırlamama izin veriyor, zaten bir kereden fazla söyledim - ideal olarak, kodun herhangi bir yerinde, yalnızca gerekli olan sizin için mevcut olmalıdır ve tek bir değişken daha fazla olmamalıdır - yani dilerseniz bile, siz olmaması gerekeni değiştiremez. Ve gerçekten ihtiyacınız olduğunda , değişkene erişmek için, neden erişiminiz olmadığını bulmanız gerekir - bu yalnızca bir gözden kaçırmadır veya çok daha sık olur, bu değişkeni değiştirmek için ek eylemlere ihtiyaç duyar. . Eğer hemen elinizin altında olsaydı, onları unuturdunuz ve daha sonra uzun bir süre programın neden istediğiniz gibi çalışmadığını veya çalışmadığını anlardınız.

 
Реter Konow :
Hiçbir şey almıyorum. Belki de sadece OOP ile değil, harika projeler yazabileceğinizi anlamak. Ve sadece OOP'ye sahip olmak bir geliştiricinin işareti değildir. OOP ile birçok sorunu çözmenin mümkün olduğunu iddia etmiyorum. Ancak başka yaklaşımlar da var.

OOP'nin başka iyi yanı, yaşam boyu yanınızda olan ve bu hayatı kolaylaştıran sınıf kitaplıklarını ve gerçekten evrensel olanları yavaş yavaş ediniyor olmanızdır.

Gerçek bir projeden, gerçekten işe yarıyor. Burada her şey sorunsuz, sadece mevcut siparişlerin / pozisyonların sayısını ve durumunu kontrol etmeniz gerekiyor. Bu fonksiyon sadece pozisyonun/emrin kapatılmadığını/iptal edilmediğini kontrol eder ve kapandıktan sonra listeden silinmesini sağlar.

 void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!= NULL ;
        it=it.Control()?gPos.Next():gPos.Delete());}

gPos burada CList<CTrade> gPos

CList ve CTrade standart kitaplıktan değildir.

CTrade - kendi CPosition kitaplığımdan miras alır.

Aslında, yalnızca proje kodunun okunabilirliğini sağlamak için gerekli olan tüm CTrade aşağıdadır:

 #include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade: public CPosition
  {
public :
                     CTrade( double mVolume, int mDirect, double mSL, double mTP);
   bool               Control() { return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade( double mVolume, int mDirect, double mSL, double mTP):
   CPosition( NULL ,
             mDirect> 0 ?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
Emirler/pozisyonlarla çalışmanın tüm uygulaması, platformlar arası kitaplık dosyası CPosition'da gizlidir.
 
Реter Konow :
Tartışmaya katıldığınız için herkese teşekkürler. İki yaklaşımın olanaklarını gerçekten karşılaştırmak için OOP'yi anlamaya çalışacağım. OOP'nin sağlayabileceği hiyerarşi ile ilgilendim ve faydaları sözdiziminin altına gömülmezse, kesinlikle hizmete alacağım.

YouTube yardımı. Çok var. Özellikle de arkadaş olduğun İngilizcede.


Kusura bakmayın Peter, 45 dakika. İlk aşamada, bu yoldaşın neden bahsettiğini anlamak çok önemlidir. Belki birçoğu onunla tartışacaktır, ancak genel olarak haklıdır:


 
Nikolai Semko :

YouTube yardımı. Çok var. Özellikle de arkadaş olduğun İngilizcede.


Kusura bakmayın Peter, 45 dakika. İlk aşamada, bu yoldaşın neden bahsettiğini anlamak çok önemlidir. Belki birçoğu onunla tartışacaktır, ancak genel olarak haklıdır:


Teşekkürler Nikolay. İzleyeceğim.