上記には、userService という名前の構造体があります。これには、リレーショナル データベースとの通信を担当する db と、RabbitMQ メッセージング サービスとの通信を可能にする amqpChannel の 2 つのプロパティがあります。
UserService は Create というメソッドを実装します。このメソッド内では、受信したユーザー情報をデータベースに保存し、そのデータを RabbitMQ に公開します。
userService の Create メソッドの役割は 1 つだけではなく、データベースに情報を保存することと、RabbitMQ キューにメッセージをパブリッシュすることの 2 つであることがわかります。
これにより、次のようないくつかの問題が発生する可能性があります:
次のコードでは、SRP を尊重するように構造を変更します。それをチェックしてください:
責任を 3 つの異なる部分に分割していることに注意してください。ユーザーをデータベースに永続化するリポジトリ UserRepository、RabbitMQ にメッセージを送信するパブリッシャー UserPublisher、これら 2 つの操作を調整するサービス UserService。
このようにして、各コンポーネントは特定の独立したタスクを担当し、コードのメンテナンスと進化を容易にするだけでなく、これらの各部分を他の部分に影響を与えることなく置き換えたり改善したりすることができます。たとえば、使用するデータベースを変更する必要がある場合は、リポジトリを置き換えるだけです。コミュニケーションの形式を変更する必要がある場合は、発行者を変更するだけです。
2 つの異なるタスクを実行することと、それらの実行を委任することの間には微妙な違いがあることに言及する価値があります。 userService.Create の元の例では、2 つの操作が 1 か所で実行され、単一責任の原則に違反していました。リファクタリング後、実行を別の構造体に委任し、Create メソッドはこのフローの調整のみを担当しました。
この例で SRP を適用するために、他の SOLID 原則のいくつかも実装することになりました。
このシリーズの次の記事では、具体的な例を示しながら、それぞれについてさらに詳しく説明します。
また会いましょう!
参考文献:
SOLID: オブジェクト指向設計の最初の 5 原則
Clean Coder ブログ - 単一責任の原則
ソフトウェア開発の世界では、SOLID 原則により、コードが次のように機能とデータを編成する方法がわかります。
SOLID という用語は、以下に説明する 5 つの設計公準の頭字語です。
(S) 単一責任原則: 「モジュールには、変更する理由が 1 つだけ必要です」
(O) オープン/クローズの原則: 「ソフトウェア アーティファクトは、拡張のためにオープンされなければなりませんが、変更のためにクローズされなければなりません」
(L) リスコフ置換原則: 「派生クラスはその基本クラスによって置換可能でなければなりません」
(I) インターフェイス分離原則: 「クラスは、使用しないインターフェイスやメソッドの実装を強制されるべきではありません」
(D) 依存関係逆転の原則: 「実装ではなく抽象化に依存する」
SOLID はオブジェクト指向プログラミング用に設計されており、GoLang がこのパラダイムを採用する言語ではないことが知られています。ただし、OOP 方法論を満たすために利用できるリソースを使用できます。たとえば、Go には継承サポートがありませんが、アイデアは合成サポートで補うことができます。同様に、インターフェースを使用して一種のポリモーフィズムを作成できます。
全 5 回シリーズの最初の記事であるこの記事では、私たちが日常的に遭遇する状況に近い例を示して、最初の原則を詳しく説明するつもりです。
この用語の意味はすでに理解しています。次は、それを GoLang で実装する方法を学びます。
この言語では、この原則を「関数または型は 1 つだけのジョブと 1 つだけの責任を持つ必要がある」と定義できます。次のコードを見てみましょう:
上記には、userService という名前の構造体があります。これには、リレーショナル データベースとの通信を担当する db と、RabbitMQ メッセージング サービスとの通信を可能にする amqpChannel の 2 つのプロパティがあります。
UserService は Create というメソッドを実装します。このメソッド内では、受信したユーザー情報をデータベースに保存し、そのデータを RabbitMQ に公開します。
userService の Create メソッドの役割は 1 つだけではなく、データベースに情報を保存することと、RabbitMQ キューにメッセージをパブリッシュすることの 2 つであることがわかります。
これにより、次のようないくつかの問題が発生する可能性があります:
次のコードでは、SRP を尊重するように構造を変更します。それをチェックしてください:
責任を 3 つの異なる部分に分割していることに注意してください。ユーザーをデータベースに永続化するリポジトリ UserRepository、RabbitMQ にメッセージを送信するパブリッシャー UserPublisher、これら 2 つの操作を調整するサービス UserService。
このようにして、各コンポーネントは特定の独立したタスクを担当し、コードのメンテナンスと進化を容易にするだけでなく、これらの各部分を他の部分に影響を与えることなく置き換えたり改善したりすることができます。たとえば、使用するデータベースを変更する必要がある場合は、リポジトリを置き換えるだけです。コミュニケーションの形式を変更する必要がある場合は、発行者を変更するだけです。
2 つの異なるタスクを実行することと、それらの実行を委任することの間には微妙な違いがあることに言及する価値があります。 userService.Create の元の例では、2 つの操作が 1 か所で実行され、単一責任の原則に違反していました。リファクタリング後、実行を別の構造体に委任し、Create メソッドはこのフローの調整のみを担当しました。
この例で SRP を適用するために、他の SOLID 原則のいくつかも実装することになりました。
このシリーズの次の記事では、具体的な例を示しながら、それぞれについてさらに詳しく説明します。
また会いましょう!
参考文献:
SOLID: オブジェクト指向設計の最初の 5 原則
Clean Coder ブログ - 単一責任の原則
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3