ホームページ  >  記事  >  バックエンド開発  >  型の動的な選択を必要とするコードの重複を避けるにはどうすればよいでしょうか?

型の動的な選択を必要とするコードの重複を避けるにはどうすればよいでしょうか?

王林
王林転載
2024-02-10 14:06:071110ブラウズ

型の動的な選択を必要とするコードの重複を避けるにはどうすればよいでしょうか?

コードを作成するとき、さまざまな条件に基づいてさまざまなタイプのコードを選択する必要がある状況に遭遇することがよくあります。この場合、適切に処理しないと、コードが冗長で反復的なものになる可能性があります。では、このコードの重複を避けるにはどうすればよいでしょうか? PHP エディター Baicao がいくつかのシンプルで効果的なソリューションを提供しました。見てみましょう。

質問内容

次のコードは、ビデオ ストリーム パーサーの簡略化された例です。入力は、ビデオおよびオーディオ フレームを含むバイナリ データです。各フレームは次の部分で構成されます:

  1. フレーム タイプ フラグ。ビデオ フレームかオーディオ フレームかを示します。
  2. ###タイトル### ###ペイロード###
  3. 目標は、ストリームを解析し、ヘッダーとペイロードからフィールドを抽出することです。
  4. 最初の方法は次のとおりです:
リーリー

これは機能しますが、

switch

の場合にコードが重複するのは好きではありません。基本的に、フレーム タイプが異なるという理由だけで、同じコードを繰り返す必要があります。

重複を避けるための 1 つの方法は次のとおりです: リーリー つまり、フレーム タイプに基づいて正しい構造のインスタンスを作成できるようにする

TMap

マッピングを導入することで、動的なタイプ選択を実装します。ただし、この解決策では、フレーム タイプごとに

GetLength()

メソッドを繰り返す必要があります。 私が非常に気になるのは、重複を完全に回避する方法がないようだということです。 何か見落としがあるのでしょうか、それとも単に言語の制限でしょうか?

これは関連する質問 (実際には同じ問題によって引き起こされます) ですが、その前提では動的な型選択の必要性が無視されているため、受け入れられている解決策 (ジェネリックスを使用) は役に立ちません。 回避策

Kingの答え

では、長さのエンコードに使用される整数型ごとにそれを繰り返す必要があります。

モンダリンの答え

ひどい reflect パッケージを使用してください。両方の問題を回避するための解決策は次のとおりです。この答えはキングの答えに基づいています。 GetLength() メソッドを使用してジェネリック型を宣言します。 リーリー 各ヘッダー タイプから GetLength メソッドを削除します。各ヘッダー タイプに共通の長さのタイプを埋め込みます:

リーリー

質問のように

TMap

を記述します。

GetLength

メソッドは、埋め込みフィールドによって提供されます。 リーリー https://www.php.cn/link/ceb9f6b8ffa77c49b6b4570ea19c76bf

(質問のコードと同様、この回答では、binary.Read 関数を介して間接的に

reflect

パッケージを使用します。 reflect パッケージは優れたツールですコードをドライに保つため。)

以上が型の動的な選択を必要とするコードの重複を避けるにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。