OOP vs prosedürel programlama - sayfa 6

 
Dmitry Fedoseev :

Ve takip etmenin farklı parametrelere uyum sağlaması için bunu nasıl yapacaksınız?

Belirli bir görev üzerinde deneyelim. Evet ise, lütfen sağlayın.
 
Реter Konow :
Belirli bir göreve öncülük etmek arzu edilir. Bu açıklama çok net değil. Uygulamamda, algoritma değişen harici parametrelerden değişmez. Bu parametrelerin herhangi bir değeri için önceden evrenseldir. Yani ne demek istediğin çok açık değil. Belirli bir örnekle açıklayın.
 class Ордер
{
   public : int SELL;

  Ордер( void ) // Конструктор имеет то же имя, что и класс. Выполняется при инициализации переменной класса
  {
    SELL= 0 ;
     int k= OrdersHistoryTotal ()- 1 ;
     for (; k>= 0 ; k--)
    {
       if (! OrderSelect (k, SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderType ()== OP_SELL )SELL++;
    }
  }
}x;

void OnStart ()
{
   Alert (x.SELL);
}

OOP sayesinde, ana program çok kısa ve açıklayıcıdır. Bu sadece aklıma gelen ilk örnek. Sipariş sayısının sık sık hesaplanması gerekiyorsa, avantajları açıktır. İlk kez anlamak zor. Ama sonuçta, işlevler ve hatta parametrelerle bile bir zamanlar zordu.

 
Реter Konow :
Belirli bir görev üzerinde deneyelim. Evet ise, lütfen sağlayın.

Özel görev. Müşteri, iki MA'da bir Uzman Danışman sipariş etti, böylece kod tabanında mevcut olan tüm takip seçenekleri buna eklendi ve aynı zamanda test cihazında yavaşlamadı.

Evet ve gelecekte yeni takip seçeneklerinin sonuçlandırılması beklentisiyle (pahalı değil).

 
STARIJ :

OOP sayesinde, ana program çok kısa ve açıklayıcıdır. Bu sadece aklıma gelen ilk örnek. Sipariş sayısının sık sık hesaplanması gerekiyorsa, avantajları açıktır. İlk kez anlamak zor. Ama sonuçta, işlevler ve hatta parametrelerle bile bir zamanlar zordu.

Her zaman yukarıdaki döngüyü yapacak ve "SAT" sayacının değerini döndürecek olan "int Number_of_orders()" işlevini neden yapmadığımı anlamıyorum?

Örneğin:

 int Количество_ордеров()
  {
    SELL= 0 ;
     int k= OrdersHistoryTotal ()- 1 ;
     for (; k>= 0 ; k--)
    {
       if (! OrderSelect (k, SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderType ()== OP_SELL )SELL++;
    }
   return (SELL);
  }


Sınıf neden burada?

 
Dmitry Fedoseev :

Örneğin, bir Expert Advisor'da 100 takip eden durdurma seçeneği bulunmalıdır. Prosedürel programlama ile bu ayak örtüsünü elde edersiniz:

100 özdeş kod bölümü. Program çalışırken, genellikle sondakilerden yalnızca biri etkinleştirilir, kalan 99 if'ler kaynakları tüketir.

Şimdi OOP ile bir varyant. Expert Advisor'ı başlatırken, diziyi işaretçiler ile fiilen etkinleştirilmiş sonların sayısına göre ölçeklendirir ve yalnızca etkinleştirilmiş sonlar için nesneler yaratırız. Sonuç olarak, aşağıdaki kod sürekli çalışacaktır:

Bir izleme etkinleştirilirse, cnt=1 olur, yani gereksiz bir şey yoktur.

Bir dizi işlev adı oluşturun, dizine göre bir ad seçin ve ona erişin.


OOP'nin bununla hiçbir ilgisi yok. Bu, OOP'nin çözmeye çalıştığı dilin bir sınırlamasıdır.

 

Denemedim bile ama örneğin OOP olmadan dili yazılmamış yapamazsınız

 
Реter Konow :

Her zaman yukarıdaki döngüyü yapacak ve "SAT" sayacının değerini döndürecek olan "int Number_of_orders()" işlevini neden yapmadığımı anlamıyorum?

Dersi bitirdikten sonra x.SELL x.BUY x.ALL ve ihtiyacım olan her şeyi alacağım. Ve onlara erişmek çok kolaydır. OOP sınıfları - basitlik için
 
Dmitry Fedoseev :

Özel görev. Müşteri, iki MA'da bir Uzman Danışman sipariş etti, böylece kod tabanında mevcut olan tüm takip seçenekleri buna eklendi ve aynı zamanda test cihazında yavaşlamadı.

Evet ve gelecekte yeni takip seçeneklerinin sonuçlandırılması beklentisiyle (pahalı değil).

Apaçık. Bu, OOP lehine yadsınamaz bir argümandır. Müşterinin aptallığı ve bununla başa çıkmak için zamanın olmaması ve başkasının algoritmasını geliştirme isteksizliği.)) Evet, bu durumda OOP gereklidir. Kabul ediyorum.)
 
STARIJ :
Dersi bitirdikten sonra, x.SELL x.BUY x.ALL ve ihtiyacım olan her şeyi alacağım. Ve onlara erişmek çok kolaydır. OOP sınıfları - basitlik için
Fonksiyonu sonlandırdıktan sonra, aynı değişkenlerin hepsini bu fonksiyona ileteceğiniz bir dizide alabilirsiniz. Belirtildiği şekilde daha fazla kullanım ...
 
СанСаныч Фоменко :

Bir dizi işlev adı oluşturun, dizine göre bir ad seçin ve ona erişin.


OOP'nin bununla hiçbir ilgisi yok. Bu, OOP'nin çözmeye çalıştığı dilin bir sınırlamasıdır.

Burada string olarak verilen bir fonksiyon çağrısı yoktur. Ve olduğu dillerde, bu tablonun karması aracılığıyla yapılır, yani bunlar korkunç frenlerdir.

Böyle bir sorunu çözmenin normal yolu,işlev işaretçilerini kullanmaktır (bunun hakkında burada yazdım). Ancak neden yalnızca işaretçileri kullanmanın daha uygun bir yolu var - OOP, yalnızca işlevlere yönelik işaretçilerden yararlanmaya değil, aynı zamanda verileri ve kodu uygun şekilde yapılandırmaya da izin verir.

Neden: