2014-09-11 1 views
0

Следующая функция реализована в C:Как изменить функцию для удовлетворения OCP?

function(struct_XX *p) 
{ 
    if(p->A) 
    { 
     if(p->B) 
     { 
      do something0; 
     } 
     if(p->C) 
     { 
      do something1; 
     } 
     if(p->D && p->E) 
     { 
      do something2; 
     } 
      if(p->Z) 
     { 
      do something3; 
     } 
    } 
} 

каждая ветвь имеет различные вещи, чтобы сделать, это не удовлетворяет принцип Открыт-Закрыт (потому что структура, которая р указывает на не является стабильным, новые поля будут добавлено в него часто, это означает, что новые коды процессов будут добавлены в функция); как он может быть изменен для удовлетворения OCP?

+3

Добро пожаловать на переполнение стека. Вскоре прочитайте страницу [О программе]. «Делают что-то одно и то же, или они разные? Сделайте что-нибудь из того, что «что-то изменит», на что указывает «p'? Каково значение «' ¡¡»в коде? Почему функция не имеет типа возврата? –

+1

В вашем вопросе недостаточно информации, чтобы предложить что-нибудь полезное. OCP требует, чтобы ваш код предоставлял механизмы для расширения функциональности. Какой механизм (ы) предоставляет ваш код для расширения основных функций? –

+0

Вы можете изменить 'struct_XX' определение или если оно исправлено, покажите это нам. –

ответ

2

Вы не дали многого, чтобы уйти, у вас есть куча условий и куча «сделай» на этих условиях.

Итак, учитывая, что ... Вы можете сделать что-то, что хранит коллекции условий и обратных вызовов ....

void ocpfunction(struct struct_XX *p) 
{ 
    int i; 
    for(i=0; i<p->conditions_count; i++) 
    { 
     if(p->conditions[i].evaluate(p)) 
     { 
      p->conditions[i].callback(p, p->conditions[i].context); 
     } 
    } 
} 
+0

Итак, p-> содержит структуру или массив? –

+0

Условиями будут массивы структур с указателями функций для обратных вызовов и оценок –