0

私はより良いコードを書こうとしています。

関数が2つの異なるタイプの入力を処理するようにしました。関数は長く、2つのタイプの違いはわずかです。現在、私は次のように書いています:

function(typeA  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}


function(typeB  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}

私が知りたいのは、非常に多くの繰り返しコードを配置する必要がないより良い方法があるかどうかです.1つの関数を書くだけでタイプを切り替えることができます...

typeA と typeB は異なる基本クラスです。

現在、A には 5 つのアイテムがあり、B には 3 つのアイテムがあります。

4

6 に答える 6

3

typeAとの両方が基本クラス (またはインターフェイス)typeBから継承されていると仮定して、これを試してください。BaseType

SharedFunction(BaseType inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......
}

FunctionA(typeA  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}

FunctionB(typeB  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}
于 2013-10-30T16:47:29.030 に答える
0

より一般的なタイプまたは親タイプを使用できます。例えば、

function(object input)
{
  if (input is TypeA)
  {

  }
  else if (input is TypeB)
  {
  }
}
于 2013-10-30T16:50:43.970 に答える
0

コードが単純な場合は、新しい関数を作成して繰り返し作業を行い、それを 2 回呼び出します (カールが行ったように)。

クラスをカスタマイズ可能にしたい場合 (たとえば、フレームワークを作成していて、ユーザーが持つ可能性のある新しい型に対して異なる動作を指定できるようにしたい場合)、特定のメソッドがサブクラスによって定義されるテンプレート メソッド パターンの使用を検討する必要があります。 (そして、ポリモーフィズム/オーバーロードを使用します)。継承を使用して、クラスを簡単にカスタマイズできます。

http://en.wikipedia.org/wiki/Template_method_pattern

問題がさらに複雑な場合は、アルゴリズム全体が別のクラスで定義されている戦略パターンを使用できます。

http://en.wikipedia.org/wiki/Strategy_pattern

于 2013-10-30T16:51:54.487 に答える
0

両方のタイプTypeATypeB両方が同じ基本クラスから派生し、関数パラメーターを基本タイプに一般化し、タイプに基づいて「異なる」セクションの条件付きロジックがあると仮定すると、これにより、1 つのメソッドで両方のタイプを処理できるようになります。これ:

function(typeBase inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......

    if(inputs is TypeA)
    {
       // Do stuff here for TypeA
    }
    else if(inputs is TypeB)
    {
       // Do stuff here for TypeB
    }
}
于 2013-10-30T16:48:10.783 に答える