
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Her şeyi okudum, herkesin farklı ilgi alanları var ... Şimdi sanal bir grid kurmak ve yönetmek için bir sınıf yeniden yapıyorum, buna ihtiyacım var.
Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...
Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...
Çok ilkel şeyler yazıyor gibiyim...
Bir işlev işaretçisi kullanabilirsiniz .
Sanal işlevle öyle mi çıkıyor?
Evet ve bir işleve işaretçi - her zaman dahili reddetmeye neden oldum. Şimdi neden "saf C" üzerinde çalışırken - işlev işaretçilerinin kullanıldığını hatırlamıyorum. Ancak C++'a geçerken bir sebepten dolayı terk edilmeleri gerekiyordu. Ve o zamandan beri onları kullanmadım. İşaretçi - bir nesne üzerinde olmalıdır.
Ama "yüzde yüz doğru" olduğumu iddia etmeyeceğim. Çok fazla eski okul eski osuruk deneyimim olduğuna katılıyorum.
Çok ilkel şeyler yazıyor gibiyim...
Utangaç olmayın.
Tanımlamaları ustaca kullanmanla - bence kim karşılaştırabilir ki.
... İşlevim şuna benziyor:
George, burada görünmüyor, örneğin, _CompareByPrcVarWith() işlevi bir sınıf yöntemi veya normal bir işlevdir. C++, sınıf yöntemlerine yönelik işaretçilere sahiptir. Kendi özellikleri var... Dürüst olmak gerekirse, MQL5'te bu tür işaretçiler kullanmayı denemedim.
Ancak, kodun yapısını geliştirmek için hala bir rezerviniz olduğunu düşünüyorum.
Sonuçta, işlev nedir?
işlev ( lat. işlev - " performans, komisyon; görev çağrısı ") - birindeki değişikliğin diğerinde bir değişiklik gerektirdiği unsurlar arasındaki ilişki.
Onlar. fonksiyon bir şey yapar. Monoton eylemlerin tek bir işlev gövdesinde birleştirilmesi arzu edilir.
Örneğinizde, işlevlerin
_CompareByPartOfMaxDDWith(),
_CompareByPartOfMaxSLQueueWith(),
_CompareByLastPrcdataWith(),
_CompareByLastMnydataWith() vb.
KARŞILAŞTIRMA yapıyor ve veriyor bu karşılaştırmanın sonucu. İsimlerde farklılık gösterirler. IMHO, kötü uygulama. Parametrelerde farklılık göstermelerine izin verin ...
Böyle. Bence ya tüm fonksiyonları tek bir fonksiyonda birleştirmeye değer, ya da onları sanal metotlar ya da şablon olarak yapmaya değer. Yiyor ama sınıflar ebeveyn-çocuk hiyerarşisine uymalıdır.
Genel olarak, karmaşık kod yazmak çok kolaydır ve çok zor - basittir.
George, burada görünmüyor, örneğin, _CompareByPrcVarWith() işlevi bir sınıf yöntemi veya normal bir işlevdir. C++, sınıf yöntemlerine yönelik işaretçilere sahiptir. Kendi özellikleri var... Dürüst olmak gerekirse, MQL5'te bu tür işaretçiler kullanmayı denemedim.
Bu (ve alt çizgi ile başlayan her şey) korumalı bir sınıf özelliğidir.
KARŞILAŞTIRMA yapıyor ve dağda veriyor bu karşılaştırmanın sonucu. İsimlerde farklılık gösterirler. IMHO, kötü uygulama. Parametrelerde farklılık göstermelerine izin verin ...
Böyle. Bence ya tüm fonksiyonları tek bir fonksiyonda birleştirmeye değer, ya da onları sanal metotlar ya da şablon olarak yapmaya değer. Yiyor ama sınıflar ebeveyn-çocuk hiyerarşisine uymalıdır.
Böylece bir bütün halinde birleştirilirler!
Yalnızca bir işlev vardır - Karşılaştırma(), ancak içinde iletilen anahtarla karşılaştırmak gerekir. Buna göre, belirli korunan işlevlerden biri seçilir. Bu nedenle, kullanıcının erişemeyeceği şekilde korunurlar (korunurlar) - bunlara yalnızca, alt çizginin gösterdiği gibi Karşılaştır () üzerinden erişilir.
Bu aynı zamanda kod tasarım kurallarından biridir - alt çizgi ile başlayan bir işlevin kullanıcılar tarafından çağrılması amaçlanmamıştır, yalnızca belirli sınıf içi görevlere hizmet eder. Buna erişim sınırlıdır.
Ve burada 2 gün boyunca bir kopya oluşturucu ve bir atama operatörü ile uğraşıyordum. İşaretçiler biçiminde veri üyeleri olan karmaşık bir sınıf var ...
Denis, herkesin farklı yaklaşımları olduğunu söylemek istedim. Genel olarak, dün konuyu açtığımda, dünün sızlanmalarının "ahh OOP çok zor, SB korkunç bir kara kutu" görünüp görünmeyeceğini görmek ilginçti. Beklendiği gibi gelmediler.
Ama insanlar araya giriyor ve herkesin kendi yaklaşımı var. Bu, Renat'ın çokça bahsettiği ortak projeler açısından da ilginç.
Not: Projelerde paylaşım çalışmıyor, geçenlerde denedim.
Bu (ve alt çizgi ile başlayan her şey) korumalı bir sınıf özelliğidir.
Böylece bir bütün halinde birleştirilirler!
Yalnızca bir işlev vardır - Karşılaştırma(), ancak içinde iletilen anahtarla karşılaştırmak gerekir. Buna göre, belirli korunan işlevlerden biri seçilir. Bu nedenle, kullanıcının erişemeyeceği şekilde korunurlar (korunurlar) - bunlara yalnızca, alt çizginin gösterdiği gibi Karşılaştır () üzerinden erişilir.
Bu aynı zamanda kod tasarım kurallarından biridir - alt çizgi ile başlayan bir işlevin kullanıcılar tarafından çağrılması amaçlanmamıştır, yalnızca belirli sınıf içi görevlere hizmet eder. Buna erişim sınırlıdır.
Birçok _CompareXXX() yönteminiz varsa, bunlar nasıl birleştirilir? Ve benim anlayışımda 1 olmalı.
Soru, örneğin, _CompareByPartOfMaxDDWith() yönteminin CFactoryBalanceResultSeries::Compare() öğesinden başka bir yerde mi çağrıldığıdır ?
Birçok _CompareXXX() yönteminiz varsa, bunlar nasıl birleştirilir? Ve benim anlayışımda 1 olmalı.
Soru, örneğin, _CompareByPartOfMaxDDWith() yönteminin CFactoryBalanceResultSeries::Compare() öğesinden başka bir yerde mi çağrıldığıdır ?
Yalnızca bir _CompareXXX() yöntemi varsa, bunun orijinal Compare() sanal işlevinden hiçbir farkı yoktur.
İşin aslı, _CompareBy...() yöntemlerinin yalnızca ana Karşılaştırma() yönteminden çağrılmasıdır. Başlıktaki alt çizgi bu konuda uyarıyor.
Genel Karşılaştırma() yöntemi - iki nesneye işaretçiler ve nasıl karşılaştırılacağını gösteren bir anahtar kabul eder. Bu genel yöntemde, anahtar ayrıştırılır ve bundan sonra yalnızca bir anahtarı karşılaştırmak için tasarlanmış belirli bir yöntem çağrılır. Ayrıca, bu yöntemlerin her biri, geçirilen iki nesnenin anahtarlarının değerini hesaplar ve anahtarın int, double, bool veya string olmasına bağlı olarak, belirli bir türü karşılaştırmanın (ayrıca korumalı) yöntemi çağrılır.
Tüm _CompareBy...() yöntemleri tek bir işlevde yazılabilir. Ancak, o zaman kodun görünürlüğü bence daha da kötüleşecekti.
Yalnızca bir _CompareXXX() yöntemi varsa, bunun orijinal Compare() sanal işlevinden hiçbir farkı yoktur.
İşin aslı, _CompareBy...() yöntemlerinin yalnızca ana Karşılaştırma() yönteminden çağrılmasıdır. Başlıktaki alt çizgi bu konuda uyarıyor.
Genel Karşılaştırma() yöntemi - iki nesneye işaretçiler ve nasıl karşılaştırılacağını gösteren bir anahtar kabul eder. Bu genel yöntemde, anahtar ayrıştırılır ve bundan sonra yalnızca bir anahtarı karşılaştırmak için tasarlanmış belirli bir yöntem çağrılır. Ayrıca, bu yöntemlerin her biri, geçirilen iki nesnenin anahtarlarının değerini hesaplar ve anahtarın int, double, bool veya string olmasına bağlı olarak, belirli bir türü karşılaştırmanın (ayrıca korumalı) yöntemi çağrılır.
Tüm _CompareBy...() yöntemleri tek bir işlevde yazılabilir. Ancak, o zaman kodun görünürlüğü bence daha da kötüleşecekti.
Seni anladım. Muhtemelen bir zevk meselesi. Ama her şeyi tek bir yöntemle yapardım. Özellikle korumalı ve özel yöntemler Karşılaştırma() dışında başka hiçbir yerde çağrılmıyorsa.