0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Go言語で説明する「ハリウッドの法則」

Last updated at Posted at 2023-03-04

はじめに

技術書を読んでいて気になった言葉を調べてみたシリーズ。

説明

「ハリウッドの法則」は、コンピューターサイエンスにおいて、特定のソフトウェアデザインの原則の1つです。この原則は、次のように言い表されます。「Don't call us, we'll call you.」つまり、あるソフトウェアコンポーネントが他のコンポーネントを直接呼び出すのではなく、必要に応じて情報を提供し、必要なタスクを外部のコンポーネントに依頼し、結果を受け取ることにより、コンポーネント間の依存関係を減らすことができるというものです。

この原則は、コンポーネントの疎結合を実現し、システム全体の柔軟性、拡張性、保守性を向上させることができます。例えば、あるシステム内である機能の変更が必要になった場合、ハリウッドの法則に従って設計されたシステムでは、その機能だけを変更することができ、他の機能に影響を与えることなく、システムを修正できるためです。

映画産業において、俳優が映画スタジオに自ら出向くのではなく、スタジオが必要な時に俳優に連絡することから名前がついたとされています。これは、ソフトウェア設計においても同様であり、コンポーネントが自らの責任を果たすことが期待されています。

多くのプログラミング言語で広く採用されており、例えば、オブジェクト指向プログラミングにおいて、インタフェースを使用することで、実現されることがあります。また、マイクロサービスアーキテクチャの設計にもハリウッドの法則が適用されることがあります。

この原則を実現するために、Go言語では、インタフェースを使用して、モジュール間の結合を疎にすることが一般的です。
例えば、以下のようなサンプルコードを考えてみましょう。ここでは、サーバーとデータベースの接続を行うためのパッケージを実装しています。この場合、ハリウッドの法則に従って、サーバー側はデータベースパッケージに依存していますが、逆にデータベースパッケージはサーバー側に依存していません。

// server package
package server

import "myapp/database"

type Server struct {
  DB *database.DB
}

func (s *Server) Start() {
  // データベースとの接続処理
  s.DB.Connect()
  // サーバーの起動処理
}

// database package
package database

type DB struct {
  Host     string
  Port     int
  User     string
  Password string
}

func (db *DB) Connect() {
  // データベースとの接続処理
}

このように、サーバー側はデータベースパッケージに依存していますが、逆にデータベースパッケージはサーバー側に依存していません。この設計により、サーバー側は自身でデータベースにアクセスする必要がなく、必要な情報を提供して外部のモジュールであるデータベースパッケージが処理を行ってくれます。その結果、サーバー側は疎結合になり、変更や修正が容易になります。また、データベースパッケージの単体テストも容易になります。

Go言語においても、ハリウッドの法則は、柔軟性や拡張性を高めるための重要な設計原則として、多くの場面で採用されています。特に、インタフェースを利用した設計によると、インタフェースを利用した設計により、疎結合なコードを書くことができます。このため、単体テストが容易になり、コードの修正や変更に対する影響範囲を最小限に抑えることができます。

また、Go言語では、依存性注入(Dependency Injection)という手法を用いることもできます。これは、あるモジュールが依存する別のモジュールを、モジュール自身ではなく外部から渡すことで、疎結合な設計を実現する手法です。例えば、以下のようなコードを考えてみましょう。

package main

import (
  "fmt"
  "myapp/database"
  "myapp/server"
)

func main() {
  db := &database.DB{Host: "localhost", Port: 3306, User: "user", Password: "password"}
  s := &server.Server{DB: db}
  s.Start()
}

ここでは、mainパッケージ内でサーバーとデータベースパッケージをインスタンス化しています。この場合、依存性注入を使用して、サーバー側は外部からデータベースパッケージを受け取っています。このため、サーバー側はデータベースパッケージに直接依存していないため、疎結合な設計となっています。

このように、Go言語では、ハリウッドの法則に従った設計を行うことで、柔軟性や拡張性を高めることができます。また、依存性注入を利用することで、疎結合な設計を実現することもできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?