コードを作成するとき、さまざまな条件に基づいてさまざまなタイプのコードを選択する必要がある状況に遭遇することがよくあります。この場合、適切に処理しないと、コードが冗長で反復的なものになる可能性があります。では、このコードの重複を避けるにはどうすればよいでしょうか? PHP エディター Baicao がいくつかのシンプルで効果的なソリューションを提供しました。見てみましょう。
次のコードは、ビデオ ストリーム パーサーの簡略化された例です。入力は、ビデオおよびオーディオ フレームを含むバイナリ データです。各フレームは次の部分で構成されます:
これは機能しますが、
switchの場合にコードが重複するのは好きではありません。基本的に、フレーム タイプが異なるという理由だけで、同じコードを繰り返す必要があります。
重複を避けるための 1 つの方法は次のとおりです:
リーリー
つまり、フレーム タイプに基づいて正しい構造のインスタンスを作成できるようにする
マッピングを導入することで、動的なタイプ選択を実装します。ただし、この解決策では、フレーム タイプごとに
GetLength() メソッドを繰り返す必要があります。
私が非常に気になるのは、重複を完全に回避する方法がないようだということです。 何か見落としがあるのでしょうか、それとも単に言語の制限でしょうか?
これは関連する質問 (実際には同じ問題によって引き起こされます) ですが、その前提では動的な型選択の必要性が無視されているため、受け入れられている解決策 (ジェネリックスを使用) は役に立ちません。 回避策
Kingの答え ひどい reflect パッケージを使用してください。両方の問題を回避するための解決策は次のとおりです。この答えはキングの答えに基づいています。
GetLength() メソッドを使用してジェネリック型を宣言します。
リーリー
各ヘッダー タイプから GetLength メソッドを削除します。各ヘッダー タイプに共通の長さのタイプを埋め込みます:
質問のように
TMapを記述します。
GetLength メソッドは、埋め込みフィールドによって提供されます。
リーリー
https://www.php.cn/link/ceb9f6b8ffa77c49b6b4570ea19c76bf
(質問のコードと同様、この回答では、binary.Read 関数を介して間接的に
reflect パッケージを使用します。 reflect
パッケージは優れたツールですコードをドライに保つため。)
以上が型の動的な選択を必要とするコードの重複を避けるにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。