ホームページ  >  記事  >  バックエンド開発  >  1 つのことを期待し、多くのことを期待するオブジェクトをリファクタリングする

1 つのことを期待し、多くのことを期待するオブジェクトをリファクタリングする

WBOY
WBOY転載
2024-02-08 23:39:08381ブラウズ

1 つのことを期待し、多くのことを期待するオブジェクトをリファクタリングする

php Xiaobian Yuzai プログラミングでは、オブジェクトが複数の役割を引き受けたい状況によく遭遇します。この種のオブジェクトは、「1 つのことを期待し、多くのことを期待するオブジェクトのリファクタリング」と呼ばれます。このようなオブジェクトは通常、コードの肥大化、結合度の高さ、および保守と拡張の困難につながります。この記事では、そのようなオブジェクトをリファクタリングして、より明確で、より柔軟で、保守しやすくする方法を検討します。見てみましょう!

質問内容

Go コードベースの更新に取り組んでいます。当社には、架空の DataStore と呼ばれる中央データ ストアがあり、さまざまなデータセットやスキーマに公開したり、そこから読み取ることができます。私たちの特定のコード ベースには、特定のデータセット/スキーマを DataStore 実装に結合するコードが含まれています。他の (おそらくさらに多くの) データセットに書き込めるようにするには、このコードをリファクタリングする必要があります。

以下のコードの dataStoreSchema は、「Customers」データなどの単一のスキーマを表します。しかし、「Orders」などの他のスキーマ、または書き込み先の異なるフィールドを持つスキーマがあります。

transformEvent DataStore に渡されるデータを取得し、いくつかのロジックを実行して dataStoreSchema オブジェクトを作成し、それを実際のデータストアに書き込みます。クラウド。

この実装が結合されているスキーマだけでなく、データ ストア上の の基礎となる任意の スキーマに書き込みたいと考えています。

リーリー

現在の挙動はこんな感じです

リーリー

でも、こんなことができるようになりたいです

リーリー

または、Go 用語で最も意味のあるもの

回避策

私の理解が正しければ、現在の実装は dataStoreSchema 構造体と transformEvent メソッドは特定のパターンと密接に結びついています。 transformEvent メソッドは入力を受け取り、それを dataStoreSchema オブジェクトに変換し、データストアに書き込みます。

現在の実装が結合されているスキーマだけでなく、データ ストア上の任意のスキーマに書き込むこともできます。

リーリー

意味: それぞれが異なるスキーマと対応する変換関数 (transformEvent1transformEvent2transformEvent3) に関連付けられた、異なる DataStore クライアントを作成したいと考えています。 )。
これは、変換ロジックを DataStore 構造から切り離し、異なるスキーマを処理するために異なる変換関数を使用できるようにすることを意味します。

インターフェイスを使用して、さまざまなスキーマ変換を実行し、Parameters および DataStore 構造を変更できます。 リーリー

Transformer 関数タイプは、イベント タイプの

E とスキーマ タイプの S という 2 つの型パラメータでパラメータ化されるようになりました。 パラメーターとデータ ストレージ構造も、同じ 2 つの型パラメーター
ES を使用してパラメーター化されます。 データストアのtransformEventメソッドは、
E型のイベントを受け入れ、#S型のパターンを返すようになりました。

より多くのパターンを処理するには、

Transformer 関数シグネチャに準拠する新しい関数タイプまたはインスタンス、および対応するイベントおよびパターン構造を定義できます。 Transformer はインターフェイスではなく関数型であるため、Transformer インターフェイスを実装する新しい構造体を定義する必要はありません。 したがって、既存の
DataStore 実装を変更せずに、新しい 変換関数とスキーマ構造を定義できます。

以上が1 つのことを期待し、多くのことを期待するオブジェクトをリファクタリングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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