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

 
VOLDEMAR :

Her zaman olduğu gibi, öğrenmek istedim, ama kesinlikle akıllı olmak dışında ve söyleyecek başka bir şeyi olmayanlar olacak ...

Ben ayrıştırmak için basit bir örnek yazdım, OOP ile daha doğru nasıl yazılır bilmiyorum... Bu sadece bir örnek, eğer böyle bir kodu doğru yazmayı ve OOP'yi biliyorsanız lütfen yazın ki ben ve diğerleri öğrenebilir...

OOP, bir nesne aramasıyla başlar. Nesne yoksa, OOP yoktur.

Genellikle, bir nesne bir tür kaynaktır, veridir.

Sadece yazmalı ve başkalarının nasıl yazdığını izlemelisiniz. Sonra gelecek. Ayrıca ders kitaplarını da okuyabilirsiniz. İnternette onlardan bolca var.

 
Zhunko :

OOP, bir nesne aramasıyla başlar. Nesne yoksa, OOP yoktur.

Genellikle, bir nesne bir tür kaynaktır, veridir.

Sadece yazmanız ve başkalarının nasıl yazdığını izlemeniz gerekiyor. Sonra gelecek. Ayrıca ders kitaplarını da okuyabilirsiniz. İnternette onlardan bolca var.


Birkaç öğretici önerin lütfen ... Sizce en basit ve kullanışlı ...
 
VOLDEMAR :

Birkaç öğretici önerin lütfen ... Sizce en basit ve kullanışlı ...

Grady Butch. "Nesneye Yönelik Analiz ve Tasarım . C++'da Örnek Uygulamalarla"

Ire Paul (bazen Ira Paul olarak yazılır) "C++'da Nesne Yönelimli Programlama"

 

1) OOP ile ilgili değil, ancak ticari işlem hatası işleyicisi ( OrderSend() , OrderDelete() , OrderModify() ) eklenmeli...

OOP ile ilgili olması için - onu sanal bir sınıf yöntemi olarak yapın (böylece diğer kodların işlenmesi eklenerek alt sınıflarda geçersiz kılınabilir).

2) Alt sınıflarda şimdi olduğu gibi çalışmayabilecek tüm sınıf yöntemleri - onları sanal yapın.

İlk aday openorders() .

Eksilerden - sanal yöntemlerde parametre sayısını ve türünü değiştiremezsiniz.

Artı tarafta, "eski" Buy , Sel , BuyStop , vb. "yeni" (alt sınıfta değiştirilmiş) openorders() öğesini çağırabilecektir .

3) Hemen daha güzel isimler yapalım. Örneğin, openorders yerine OpenOrders .

4) Terminolojide bir şeyi aramak geleneksel ise, o zaman benzer terminoloji kullanırsınız.

sale = SELL ise, Sell veya SELL'i de çağırırsınız (yani SelStop yerine SellStop )

5) Tüm sabitleri sınıftan (500 vb.) çıkarmak gerekir.

Değişkenlerden alınmalarına veya yöntemlerin parametreleri olarak ayarlanmasına izin verin.

Şimdi açık olarak yaklaşık 500 kablolu hatırlıyorsunuzsiparişler () ve sonra unutacaksınız veya bu sınıfları kullanarak bir sürü baykuş yazılacak ve bir şeyi değiştirmek zor olacak.

Mimari hatalar, düzeltilmesi en zor olanlardır.

Ve şimdi iskeleti yaratıyorsunuz (eğer bu sadece bir egzersiz değilse).

6) Her şeyi bir sınıfa koymayın.

Bir clOrder sınıfı oluşturun ve ona SetSL , CloseOrder , GetSL , GetProfit , SetTP , GetTP , vb. ekleyin.

Ve clTrade sınıfında, bir dizi/sipariş listesi, bir sembol ve sembol özellikleri dikin ( TICKETSIZE , POINT , TICKETVALUE, MINLOT, MAXLOT, STOPSTEP, LOTSTEP, LOTSIZE , vb.).

Ask ve Bid'i (sembol özellikleri olarak) vidalarsanız, bunları OnTick() içinde güncellemeyi unutmayın.

MT değişkenlerini güncelledikten sonra Ask ve Bid özelliklerinin güncellenmesi için RefreshRates() 'e bir bağlama yapın (Ayrıca emirlerin durumunu, kimlerin açıldığını ve kimlerin kapandığını kontrol ediyorum. Kapatılanlar emir listesinden silinir).

Bir ticaret programı (ayrıca bir sınıfı birinci yapmak) ve bir takip eden durdurma (ayrı bir sınıf yapmak da) ekleyebilirsiniz.

Not: Tüm hafta sonu boyunca yaptım (ticaret için bir kütüphane yaptım), ancak bu sefer sınıflar olmadan yapmaya karar verdim (sadece yapılar, yapı dizileri ve tüm bunlarla çalışan işlevler).

Ayrıca her gün için bir program var (çünkü Alpler altın için her gün 0:00 ile 1:00 arasında mola veriyor). İşlemin son 2 dakikasında, program kontrol işlevi tüm işlemleri kapatır ve tüm emirleri iptal eder.

Ve ticaretin son saatinde, kârsız işlemleri kapatır, siparişleri iptal eder ve kârlı işlemlerin peşine düşer. Trailing de yaptı. Tek tip, ancak farklı parametreler nedeniyle - farklı karakterler için uygundur.

Şema aşağıdaki gibidir - Semboller (alanlarıyla birlikte), Düzenler (alanlarıyla birlikte), Çizelgeler (alanlarıyla birlikte) ve kendi alanlarına (sihir vb.) Siparişler ve Çizelgeler listesi.

Hiyerarşinin en üstünde Danışmanlar listesi bulunur (sembol+sihir kombinasyonu benzersiz olmalıdır).

 
VOLDEMAR :

Birkaç öğretici önerin lütfen ... Sizce en basit ve kullanışlı ...

CodeBase'in artık OOP kullanılarak yazılmış örnekleri var. VOLDEMAR 'a'dan, örneğin)))

Aslında, https://www.mql5.com/ru/code/11159 adresiniz , yapılar için ticaret kitaplığını yeniden yazmamı istedi.

Şimdilik derslerle birlikte beklemeye karar verdim - henüz MQL'de kullanmanın bir anlamı görmüyorum.

 
Tam olarak anlamadım, şimdi standart Ticaret sınıfını kullanmak mümkün mü?
Veya yalnızca MQL5'te standarttır ve oradan yeni meta düzenleyiciye taşındı.
 
EverAlex :

CodeBase'in artık OOP kullanılarak yazılmış örnekleri var. VOLDEMAR 'a'dan, örneğin)))

Aslında, https://www.mql5.com/ru/code/11159 adresiniz , yapılar için ticaret kitaplığını yeniden yazmamı istedi.

Şimdilik derslerle birlikte beklemeye karar verdim - henüz MQL'de kullanmanın bir anlamı görmüyorum.


Evet bunu yazdım ama fonksiyonları bir sınıfa aktarmaktan başka bir şey anlamadım henüz,
 
VOLDEMAR :

Evet bunu yazdım ama fonksiyonları bir sınıfa aktarmaktan başka bir şey anlamadım henüz,

3(+1) OOP ilkeleri:

1) Kapsülleme . Onlar. değişkenleri, sözde değişkenleri ("nesne özellikleri" veya basitçe "özellikler" olarak anılır) nesnenin kendisinde depolamak. Onlar. bir sınıf uygun şekilde bildirildiğinde, verileri dışarıdan değiştirilemez.

Yalnızca sınıfın işlevlerini kullanarak ("sınıf yöntemleri" veya yalnızca "yöntemler" olarak anılır). Herhangi bir değişkene sadece değer atamak için değil, bu alanların değiştirilmesi ile ilgili bazı eylemlerin gerçekleştirilmesi için de gereklidir.

Ve bu, OOP'yi MQL'ye sokmanın ana (bence) faydasıdır ve işlevlerin transferi değil (ticaret kitaplığımın işlevleri EA endeksini parametrelerden biri olarak alır ve dizi de dahil olmak üzere seçilen EA ile çalışır. emirler).

Elleri çarpık hiç kimse, oluşturduğunuz sınıfın verilerine (kaynak kodları yoksa) giremez ve ardından kodunuzun hatalarla çalıştığı çürüklüğü besleyemez.

2) Miras . Bir alt sınıf oluştururken, ata sınıfın tüm alanlarını ve yöntemlerini miras alır (dereden sınıflarda görülemeyen alanlar ve yöntemler için özel bir tür vardır, ancak şimdilik bunu burada atlıyoruz).

Burada, bir nesnenin tasarım aşamasında, mimariyi - bu sınıfın nasıl kullanılacağını, içine hangi alanların dahil edileceğini, bunların torunlarda nasıl görüneceğini vb. - açıkça düşünmeniz gerekir.

Güçlü sistemlerde ve sınıf kitaplıklarında, seviyesini kişisel olarak ticaret görevlerinde görmediğim görevler için kullanılır. Ama belki birinin ihtiyacı olur. Örneğin, farklı sondaki duraklarla alt sınıflar oluşturabilirsiniz.

Bu nedenle - yöntemlerin içinde sabitler yoktur, her şey dışarıdan ilgili yöntemlerle (genellikle .Set ile başlar) veya doğrudan yöntem parametreleri olarak ayarlanmalıdır. 500'den bahsediyorum.

3) Polimorfizm . Yukarıda birkaç mesaj yazdığım şey, alt sınıfta yeniden çalışılan openorders() işlevinin eski Buy() işlevleri vb. tarafından sakince çağrılacağı zamandır.

Polimorfizmin bir örneği, farklı şekiller için geometrik bir şeklin alanının hesaplanmasıdır.

Bir daire için bir şekilde, bir kare için - başka bir şekilde hesaplanır. Ancak her durumda - Figura.GetSquare() öğesini çağırarak, temel sınıftan miras alınan belirli bir şeklin alanını alacağız (orada Square() bildirmeyi unutmadıysak).

Yine, temel sınıf mimarisini oluşturmak için biraz beceri gereklidir. Örneğin, Square() öğesini virtual olarak bildirmeyi unutursanız, genel olarak Square çağırma yeteneğinizi kaybedersiniz (her çağrıdan önce sınıfın türünü kontrol etmeniz ve tam olarak Square uygulamasını çağırmanız gerekir).

Bazıları, yapıcılar dışındaki tüm yöntemleri sanal yapmayı önerir (eğer bu sınıfın büyüyebileceği ufuklar bir sınıf oluştururken görünmüyorsa, aynı bakış açısına bağlı kalırım). Ana şey, yıkıcıların da sanal olması gerektiğidir.


Güncelleme:

================

4) Soyutlama (yoldaşların isteği üzerine, OOP okuduğumda (1990'larda) bir ilke olarak kabul edilmedi (çünkü aslında sadece ilk üçten sonra geliyor) ve makalede (aşağıdaki bağlantıya bakın) bunun hakkında yazılmış, ancak makalenin başlığında değil, sadece 3) var.

Pratik kullanımda bu, "boş" bir temel sınıfın oluşturulmasıdır (yöntemlerin bildirildiği ancak hiçbir şey yapılmadığı). Bazı dillerde bir yöntemi soyut olarak işaretlemek mümkündür. Bu, soyundan gelen sınıfta geçersiz kılınması gerektiği anlamına gelir (yani, bir şey yapan bir yöntem eklenir).

===================

Not: Kısaca, vahşi doğaya girmeden buradan okuyabilirsiniz


PPS: Kimseyi gücendirmek istemem ama Work'te bir ticaret kütüphanesi yazılmasını istediğimde sadece 1 kişi elinde olduğunu ve kullandığını söyledi.

5 MQL programcısı (Skype'da), içinde ne olması gerektiği hakkında hiçbir fikirleri olmadığını ve gerekli işlevleri bir baykuştan diğerine kopyala-yapıştır yaptıklarını söyledi. RefreshRates () , hiçbir şeyi değiştirmeyen ve birkaç milisaniyeden fazla yürütülemeyen kod bölümleri arasında sıkışıp kaldığı noktaya kadar. Ve aşağıdaki kod hiçbir şekilde değiştirilen Ask ve Bid'e ve (belki değiştirilmiş emir türlerine) bağlı değildir.

Bu nedenle, daha önce diğer programlama dillerinde OOP ile çalışmamış olan MQL programcıları için MQL'de OOP herhangi bir fayda sağlamayacaktır. Maksimum olarak - verileri harici değişikliklerden gizleyin (ki bu da fena değil).

 
EverAlex :

OOP'nin 3 ilkesi:

1) Kapsülleme . Onlar. değişkenleri, sözde değişkenleri ("nesne özellikleri" veya basitçe "özellikler" olarak anılır) nesnenin kendisinde depolamak. Onlar. bir sınıf düzgün bir şekilde bildirildiğinde, verileri

2) Miras . Bir alt sınıf oluştururken, ata sınıfın tüm alanlarını ve yöntemlerini miras alır (dereden sınıflarda görülemeyen alanlar ve yöntemler için özel bir tür vardır, ancak şimdilik bunu burada atlıyoruz).

3) Polimorfizm . Birkaç mesaj yukarıda yazdığım şey, alt sınıflarda elden geçirilen openorders() fonksiyonunun eski Buy() fonksiyonları vb. tarafından sakince çağrılacağı zamandır.

Polimorfizmin bir örneği, farklı şekiller için geometrik bir şeklin alanının hesaplanmasıdır.

Bir daire için bir şekilde, bir kare için - başka bir şekilde hesaplanır. Ancak her durumda - Figura.GetSquare() öğesini çağırarak, temel sınıftan miras alınan belirli bir şeklin alanını alacağız (orada Square() bildirmeyi unutmadıysak).

Dördüncü nerede? Soyutlama nerede! Haksız yere unutulmuş :-(
 
Zhunko :
Dördüncü nerede? Soyutlama nerede! Haksız yere unutulmuş :-(


Ekle.