0

次の関数は C で実装されています。

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;
        }
    }
}

各ブランチにはさまざまな処理があり、Open-Closed Principle を満たしていません (p が指す構造体が安定していないため、新しいフィールドが頻繁に追加されます。つまり、新しいプロセス コードが関数に頻繁に追加されます) 。 ; OCP を満たすためにどのように変更できますか?

4

1 に答える 1

2

やるべきことはあまり与えられておらず、たくさんの条件があり、それらの条件に基づいてたくさんの "do" があります。

そのため...条件とコールバックのコレクションを格納するものを作成できます....

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);
      }
   }
}
于 2014-09-11T02:06:07.767 に答える