php Xiaobian Yuzai プログラミングでは、オブジェクトが複数の役割を引き受けたい状況によく遭遇します。この種のオブジェクトは、「1 つのことを期待し、多くのことを期待するオブジェクトのリファクタリング」と呼ばれます。このようなオブジェクトは通常、コードの肥大化、結合度の高さ、および保守と拡張の困難につながります。この記事では、そのようなオブジェクトをリファクタリングして、より明確で、より柔軟で、保守しやすくする方法を検討します。見てみましょう!
Go コードベースの更新に取り組んでいます。当社には、架空の DataStore と呼ばれる中央データ ストアがあり、さまざまなデータセットやスキーマに公開したり、そこから読み取ることができます。私たちの特定のコード ベースには、特定のデータセット/スキーマを DataStore 実装に結合するコードが含まれています。他の (おそらくさらに多くの) データセットに書き込めるようにするには、このコードをリファクタリングする必要があります。
以下のコードの dataStoreSchema
は、「Customers」データなどの単一のスキーマを表します。しかし、「Orders」などの他のスキーマ、または書き込み先の異なるフィールドを持つスキーマがあります。
transformEvent
DataStore
に渡されるデータを取得し、いくつかのロジックを実行して dataStoreSchema
オブジェクトを作成し、それを実際のデータストアに書き込みます。クラウド。
この実装が結合されているスキーマだけでなく、データ ストア上の の基礎となる任意の スキーマに書き込みたいと考えています。
リーリー現在の挙動はこんな感じです
リーリーでも、こんなことができるようになりたいです
リーリーまたは、Go 用語で最も意味のあるもの
私の理解が正しければ、現在の実装は dataStoreSchema
構造体と transformEvent
メソッドは特定のパターンと密接に結びついています。 transformEvent
メソッドは入力を受け取り、それを dataStoreSchema
オブジェクトに変換し、データストアに書き込みます。
現在の実装が結合されているスキーマだけでなく、データ ストア上の任意のスキーマに書き込むこともできます。
リーリー意味: それぞれが異なるスキーマと対応する変換関数 (transformEvent1
、transformEvent2
、transformEvent3) に関連付けられた、異なる
DataStore クライアントを作成したいと考えています。
)。
これは、変換ロジックを DataStore
構造から切り離し、異なるスキーマを処理するために異なる変換関数を使用できるようにすることを意味します。
インターフェイスを使用して、さまざまなスキーマ変換を実行し、Parameters
および DataStore
構造を変更できます。
リーリー
E とスキーマ タイプの
S という 2 つの型パラメータでパラメータ化されるようになりました。
パラメーターとデータ ストレージ構造も、同じ 2 つの型パラメーター
E と
S を使用してパラメーター化されます。
データストアのtransformEventメソッドは、
E型のイベントを受け入れ、
#S型のパターンを返すようになりました。
Transformer 関数シグネチャに準拠する新しい関数タイプまたはインスタンス、および対応するイベントおよびパターン構造を定義できます。
Transformer はインターフェイスではなく関数型であるため、
Transformer インターフェイスを実装する新しい構造体を定義する必要はありません。
したがって、既存の
DataStore 実装を変更せずに、新しい 変換関数とスキーマ構造を定義できます。
以上が1 つのことを期待し、多くのことを期待するオブジェクトをリファクタリングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。