2014-09-11 3 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; 
     } 
    } 
} 

각 지점은, 그것은 오픈 폐쇄 원칙을 만족하지 않습니다 할 수있는 다른 일이있다 (때문에에게 구조체 P 포인트가 안정되지에서 새로운 분야가 될 것이다 종종 새로운 프로세스 코드가 function에 추가된다는 의미입니다. OCP를 만족시키기 위해 어떻게 수정 될 수 있습니까?

+3

에 오신 것을 환영합니다 .... ... 당신이 조건 콜백의 컬렉션을 저장하는 무언가를 만들 수 주어진. 곧 [About] 페이지를 읽으십시오. '무언가가 모두 똑같습니까? 아니면 각각 다른 것입니까? '무엇이''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

조건은 콜백 및 평가를위한 함수 포인터가있는 구조체의 배열입니다. –