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