Как избежать дублирования кода? - страница 4

 
prostotrader #:

Тогда зачем ООП?

Передавайте параметр в цикл.

эмм... у меня слова закончились, не знаю уже как объяснить свой запрос лучше, сори )

Повезло, что Дмитрий понял и досконально всё объяснил.

 
leon_17 #:

эмм... у меня слова закончились, не знаю уже как объяснить свой запрос лучше, сори )

Повезло, что Дмитрий понял и досконально всё объяснил.

Понятно :)

То что написал Дмитрий и я одно и тоже.

void MyCycle(const int param_1, const int param_2)
 
{
  double result;

  switch(param_1)
    {
      case 0:
        result = //Фунуция 1;
      break;
      case 1:
        result = //Фунуция 2;
      break;
    }
  //Разный result используется в Вашем цикле
  for(int i = 0; i< param_2;i++)
  {
    //
  } 
}

Так понятнее?
думается, что такая конструкция будет работать гораздо быстрее.

Но, Вам виднее...

 
prostotrader #:

Понятно..

То что написал Дмитрий и я одно и тоже.

Так понятнее?
думается, что такая конструкция будет работать гораздо быстрее.

Но, Вам виднее...

Где здесь исполнение различного кода (который должен зависеть от заданного параметра в сигнатуре базовой функции) внутри тела цикла?

 
leon_17 #:

Где здесь исполнение различного кода (который должен зависеть от заданного параметра в сигнатуре базовой функции) внутри тела цикла?

Извините, но я не учу программированию, и тем более нет желания писать код за Вас.

Не забудьте создать Класс, чтобы сложить A и B (если что, то это шутка)

 
prostotrader #:

//Разный result используется в Вашем цикле

Мне не нужен разный резалт , ни по одиночке, ни даже в структуре. Мне нужен блок различных операций. Этого ваш код реализовать никак не может. Можно было бы свитчить на каждой итерации, как вы предложили на первой странице, но не вот это вот... хотя возможно мне еще реально далеко до вашего уровня и я просто не в состоянии понять предложенного алгоритма, пусть он мне и кажется на данный момент довольно простым. 

 
leon_17 #:

Мне не нужен разный резалт , ни по одиночке, ни даже в структуре. Мне нужен блок различных операций. Этого ваш код реализовать никак не может. Можно было бы свитчить на каждой итерации, как вы предложили на первой странице, но не вот это вот... хотя возможно мне еще реально далеко до вашего уровня и я просто не в состоянии понять предложенного алгоритма, пусть он мне и кажется на данный момент довольно простым. 

Давайте, на этом закончим...

Это глупо, с моей стороны, дальше объяснять.

Вы даже код не смотрите (последний)!

Это

typedef void (*TFunc)(int&,double&); 

TFunc ptr;

void f1(int & a1,double & a2){
   a2=(double)a1/100;
}

void f2(int & a1,double & a2){
   a2=(double)a1/1000;
}

double main(int a1,double a2,TFunc & f){
   double r1=0,r2=0;
   for(int i=a1;i<a2;i++){
      f(i,r1);
      r2+=r1;
   }   
   return r2;
}

//


и это

void MyCycle(const int param_1, const int param_2)
 
{
  double result;

  switch(param_1)
    {
      case 0:
        result = //Фунуция 1;
      break;
      case 1:
        result = //Фунуция 2;
      break;
    }
  //Разный result используется в Вашем цикле
  for(int i = 0; i< param_2;i++)
  {
    //
  } 
}

одно и тоже по сути!

 
prostotrader #:

Давайте, на этом закончим...

Это глупо, с моей стороны, дальше объяснять.

Вы даже код не смотрите (последний)!

Это

и это

одно и тоже по сути!

Я так не считаю. Ваш код не сможет работать с функциями типа void. А варианты с указателями и ООП, легко!

 
leon_17 #:

Я так не считаю. Ваш код не сможет работать с функциями типа void. А варианты с указателями и ООП, легко!

Вам еще рано советников писать, подумайте об этом...

Все! Пока!

Проверьте на досуге

typedef void (*TFunc)(int&,double&); 

TFunc ptr;

void f1(int & a1,double & a2){
   a2=(double)a1/100;
}

void f2(int & a1,double & a2){
   a2=(double)a1/1000;
}

double main(int a1,double a2,TFunc & f){
   double r1=0,r2=0;
   for(int i=a1;i<a2;i++){
      f(i,r1);
      r2+=r1;
   }   
   return r2;
}

//
double MyCycle(int &param_1, double &param_2, const int param_3)
{
  switch(param_3)
  {
    case 0:
      ptr = f1;
    break;
    case 1:
      ptr = f2;
    break;
  }
  double r1=0,r2=0;
  for(int i=param_1;i<param_2;i++){
      ptr(i,r1);
      r2+=r1;
  }
  return(r2); 
}

void OnStart(){

   ptr=f1;
  double r1=main(0,10,ptr);
   ptr=f2;
  double r2=main(0,10,ptr);   
   Print("Дмитрий: ", r1," ",r2);
   
   int par_1 = 0;
   double par_2 = 10;
   r1=MyCycle(par_1,par_2,0);
   r2=MyCycle(par_1,par_2,1);   
   Print("prostotrader: ", r1," ",r2);
 
prostotrader #:

Вам еще рано советников писать, подумайте об этом...

Все! Пока!

Проверьте на досуге

Выпей валерьянки.

 
leon_17 #:

А в чём странность, если не секрет? Я без подвоха спрашиваю... лишь одна из областей полиморфизма я так понимаю. Там есть гораздо более сложные вещи, как мне кажется. 


Я несколько неточно выразился, стоило написать "экзотическое". Вам придётся плодить потомков только ради вариантов функции. Придётся создать объекты этих классов, которые по сути объекты-пустышки.

Но, в принципе, такое решение имеет право на жизнь :) Код получается вполне читабельным. Вот, если бы со спецификатором "virtual" можно было использовать "static"..., но у-вы.