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

 

Bazı nüanslarla ilgili daha deneyimli programcıların görüşlerini bilmek istiyorum. Sınıflarda en az değişken bildirimleri alın. Örneğin, sınıflarımda bu belirli sınıfın çeşitli yöntemlerinde bildirilen değişkenler var. Her yöntemde en sık bildirilirler. Bunu yapmaya değer mi yoksa özel bölümde bir kez ilan edip sonra kullanmak daha mı iyi?

Anladığım kadarıyla, sayaç değişkenleri döngü halindeyse kullanmak daha mantıklı olur, değil mi? Sonuçta sayaç, örneğin bir döngü kullanıyorsanız, hesaplama sırasındaki değer tarafından açıkça ayarlanır:

 for (i = OrdersTotal () - 1 ; i >= 0 ; i--)
{

}

Her yöntemde, bir i değişkeni bildirmek mantıklı değildir, çünkü bu görünüşe göre bellek hücreleri için ekstra bellek maliyetleridir. Genel olarak, bu tür anlar ilgi çekicidir.

Aynısı sadece çevrimler için değil, aynı zamanda diğer seçenekler için de geçerlidir. Sonuçta, bir kereden fazla bildirilmesi gereken, ancak aynı rolü oynayan yeterince farklı değişken var.. Tek şey, gördüğüm kadarıyla, bazılarının "çöp" olmaması için değer olarak sıfırlanması gerekecek. onları önceki operasyonlardan O zaman bunu yapmak mantıklı mı yoksa böyle bir değişkeni yeniden ilan etmek daha mı kolay... Genel olarak bunu profesyonellerden duymak isterim.

 
hoz :

Bazı nüanslarla ilgili daha deneyimli programcıların görüşlerini bilmek istiyorum. Sınıflarda en az değişken bildirimleri alın. Örneğin, sınıflarımda bu belirli sınıfın çeşitli yöntemlerinde bildirilen değişkenler var. Her yöntemde en sık bildirilirler. Bunu yapmaya değer mi yoksa özel bölümde bir kez ilan edip sonra kullanmak daha mı iyi?

Anladığım kadarıyla, sayaç değişkenleri döngü halindeyse kullanmak daha mantıklı olur, değil mi? Sonuçta sayaç, örneğin bir döngü kullanıyorsanız, hesaplama sırasındaki değer tarafından açıkça ayarlanır:

Her yöntemde, bir i değişkeni bildirmek mantıklı değildir. bu görünüşe göre bellek hücreleri için ekstra bellek maliyetleridir. Genel olarak, bu tür anlar ilgi çekicidir.

Aynısı sadece çevrimler için değil, aynı zamanda diğer seçenekler için de geçerlidir. Sonuçta, bir kereden fazla bildirilmesi gereken, ancak aynı rolü oynayan yeterince farklı değişken var.. Tek şey, gördüğüm kadarıyla, bazılarının "çöp" olmaması için değer olarak sıfırlanması gerekecek. onları önceki operasyonlardan O zaman bunu yapmak mantıklı mı yoksa böyle bir değişkeni yeniden ilan etmek daha mı kolay... Genel olarak bunu profesyonellerden duymak isterim.

Bunu yapmaya değip değmeyeceği, değişkenin oluşturulma amacına bağlıdır. Bir sınıf, örneğin bir siparişi, bazı varlıkları içine alıyorsa, özelliklerini ifade etmek için, örneğin bir sipariş bileti, sınıfta tanımlanan değişkenler gerekli olacaktır. Bu değişkenler, o sınıfın aynı nesnesi için belirli bir sınıfın tüm yöntemlerinde ortak olacaktır.

Bir metot içinde bir döngü düzenlemek için bir değişken yaratılmışsa, o zaman metot içinde otomatik olarak (yani, statik anahtar kelime kullanılmadan) tanımlanmalıdır. Bu durumda, bir metot kendi döngüsünün içinden başka bir metodu çağırsa, ki bu da bir döngü organize eder ve aynı isimli bir değişkeni kullanırsa, problem olmayacaktır. Bir sınıfta bildirilen bir değişkeni kullanırken, ikinci yöntem döngüsünde değişkenin üzerine yazılır.

Otomatik değişkenler için, işleve girerken bellek otomatik olarak tahsis edilir ve çıkarken otomatik olarak silinir, üstelik minimum ek yük ile. Ayrıca, işlevler basitse, derleyici öyle bir kod üretebilir ki, otomatik belleğin tahsis edilmesi ve boşaltılması için hiçbir özel eylem olmayacak.

Bu tür hafıza hücrelerini kurtarmak bir zamanlar anlamlı bir aktivite olabilirdi ama bu aktivite 20 yıl önce anlamını tamamen yitirdi...

 

Bir sınıf var. O kadar basit bir yöntemi var ki, hepsi rezalet için basılmış, çünkü. Sövenin nerede olduğunu arıyordum:

 // 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0 ;     // устанавливаем минимальную разрядность лота в ноль
   Print ( "LotPrecision()_Before: li_LotPrecision = " , li_LotPrecision);
   Print ( "LotPrecision()_BeforeCircle: SLots.gd_LotStep = " , SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1 )
   {
       Print ( "LotPrecision(): SLots.gd_LotStep < 1" );
      SLots.gd_LotStep *= 10 ;
       Print ( "SLots.gd_LotStep *= 10" );
       Print ( "LotPrecision(): SLots.gd_LotStep = " , SLots.gd_LotStep);
      li_LotPrecision++;
       Print ( "LotPrecision(): li_LotPrecision = " , li_LotPrecision);
   }
   Print ( "LotPrecision(): LOTPRES = " , li_LotPrecision);
   return (li_LotPrecision);
}

li_LotPrecision değişkeninin statik değiştiricisi yoktu, sonra değerini kaybetmemesi gerektiğini gördüm ve değiştiricisini değiştirdim. Bir değiştirici eklememe rağmen, yine de bu li_LotPrecision değişkeninin değerini kaydetmediği fark edildi.

OnInite() içinde yazdırırım:

 void OnTick ()
{
   int Lot = CBase.LotPrecision();
   Print ( "Lot = " , Lot);
}

Günlükte:

 17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo ( _Symbol , MODE_LOTSTEP); = 0.01
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep *= 10
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep *= 10
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: Lot = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: Lot = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

Burada LotPrecision() işlevinden çıktıktan sonra li_LotPrecision değişkeninin değerinin kaybolduğu açıkça görülmektedir. Sabit kalması için nasıl yapılır?

Bu li_LotPrecision değişkenini daha sonra statik değiştiriciyi atayabilmek için sınıfın özel bölümüne eklemeye çalıştım, ancak derleyici bunun imkansız olduğuna yemin ediyor.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

Bir değişkeni sınıftan çıkarmak bir sebep değildir, çünkü başka hiçbir yerde gerekli değildir.

Nasıl olunur?