多くの場合、異なるタイプの入力に対して同じ機能を持つメソッドを書きたいと思います。これは、パラメーターの型が異なる場合、メソッドのオーバーロードによって簡単に実現できます。
しかし、パラメーターの型が同じ(つまり、同じ型のデータの2つの異なる表現)である場合を解決するための最善の(最も堅牢な)方法は何ですか?
この例は、自然にint[][]
として格納できる整数行列です。しかし、行列の転置も受け入れるメソッドを作成したい場合はどうでしょうか?転置もint[][]
ですが、完全に異なる表現です。
これを行うにはいくつかの方法があります。
3番目の方法がこれを行う最も明確な方法だと思います。残念ながら、私はいくつかの高性能ライブラリに取り組んでいますが、それは実行可能なソリューションではありません。
特にパフォーマンスが重要な場合は、「メソッドに異なる名前を付ける」オプションに投票します。
使わない そして method1(int[][])
。method2(int[][])
たとえば、method(int[][])
およびmethod_transposed(int[][])
を使用します。
メソッド名は常に、読者がメソッド名を理解するのに役立つはずです。
パラメータ型でオーバーロードされたメソッドを持つAPIを注意深く設計する必要があります。メソッドはまったく同じことを行う必要があります。そうしないと、ユーザーが混乱します。
マトリックスをとる2つのメソッド、「まっすぐ」なものと転置されたものの2つは、まったく同じことを行わないため、異なるタイプのオーバーロードはあまり当てはまりません。
「フラグ」と「別の名前」の選択は簡単です。メソッドが次のようになっている場合
int[][] mul(int[][] a, int[][] b, bool flag) {
if (flag) {
// Do one thing
} else {
// Do another thing
}
}
次に、別のメソッドを使用する必要があります。フラグ付きのメソッドが大量のコードを共有する場合は、フラグ付きのメソッドを使用する必要があります。
パラメータタイプが同じ場合は、異なるメソッド名を使用します。簡単ですよね?
私はあなたがどの言語を使っているのかわかりませんが、構造体またはタプルがint [] []とフラグを1つの「もの」にグループ化して、許容できるパフォーマンスを実現し、インターフェイスがよりクリーンになります。そうでない場合、クラスに最も論理的に類似しているのは、クラスタイプであるものを別のパラメーターに分割することです(おそらくオプションではなく、列挙型またはフラグではなく、オプションを開いたままにします)。そして、よりクリーンなインターフェースよりも意識的に速度を選択します。あなたはそれが重要であることを確かめるために速度をチェックするかもしれません、マトリックスが1,000×1,000であるならば、それは重要ではないかもしれません。これはすでにあなたに起こっていると思いますが。
異なる表現に同じデータ型を使用しないでください。メソッドの行列と「行列の転置表現」バージョンがある場合、これらの表現に2つのデータ型を作成することをお勧めします。このようにして、間違った場所を誤ってどこかに使用した場合にも、コンパイラーはあなたに怒鳴りつけます。
これはインターフェースの完璧なユースケースです。単一の基本クラスを使用してビジネスロジックをカプセル化しますが、さまざまなパラメーターを取るサブクラスに異なるインターフェイスを実装します。これは、実装ではなくインターフェイスにコーディングする理由を完全に示しています。だからはい、あなたは異なるクラスを使用しますが、あなたはそうするでしょう
public class MatrixOne implements ThisMatrix {
//code
}
public class MatrixTwo implements TransposeMatrix {
//code
}
明らかに、これは単純化です。他のオプションもありますが、マトリックスのどのバージョンが有効であるかを示すメッセージを渡すことができる場合は、受信者にそれを処理する方法を伝えることもできます。