ホームページ  >  記事  >  バックエンド開発  >  Go における継承よりも構成

Go における継承よりも構成

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 12:24:02360ブラウズ

Composition Over Inheritance in Go

ソフトウェアを設計する場合、「継承よりも合成」の原則により、より柔軟で保守しやすいコードが得られることがよくあります。 Go は、オブジェクト指向設計に対する独自のアプローチを採用しており、継承ではなく合成に重点を置いています。その理由を見てみましょう。

Go がコンポジションを好む理由

従来の OOP 言語では、継承により、あるクラスが別のクラスから動作やプロパティを継承できますが、これにより、厳格で変更が難しい階層が生じる可能性があります。 Go は継承を完全に回避し、代わりに合成を奨励します。つまり、より小さく焦点を絞ったコンポーネントを組み合わせて型を構築します。

動作中の構成

さまざまなタイプの従業員がいる会社をモデル化していると想像してください。エンジニア、マネージャー、インターンなどの従業員もいます。複雑なクラス階層を作成する代わりに、特定の動作を独立したタイプとして定義し、それらを構成します。

例: Go におけるワーカーの動作

package main

import "fmt"

type Worker interface {
    Work()
}

type Payable struct {
    Salary int
}

func (p Payable) GetSalary() int {
    return p.Salary
}

type Manageable struct{}

func (m Manageable) Manage() {
    fmt.Println("Managing team")
}

type Engineer struct {
    Payable
}

func (e Engineer) Work() {
    fmt.Println("Engineering work being done")
}

type Manager struct {
    Payable
    Manageable
}

func (m Manager) Work() {
    fmt.Println("Managerial work being done")
}

こちら:

  • エンジニアとマネージャーは Payable を埋め込み、給与を与えます。
  • Manager には Manageable も組み込まれており、チーム管理機能が提供されます。
  • 各型は Work() を個別に実装し、Worker インターフェイスを満たします。

合成の利点

  • シンプルさ: 各動作は構造体にカプセル化されているため、簡単に拡張できます。
  • 柔軟性: 既存のコードを壊すことなく、新しい型や動作を追加できます。
  • 再利用性: 動作はモジュール化されているため、さまざまな方法で簡単に組み合わせることができます。

コンポジションでのインターフェイスの使用

Go では、インターフェースと構成が連携して、継承なしのポリモーフィズムを可能にします。単一の関数で複数のワーカー タイプを処理する方法は次のとおりです。

func DescribeWorker(w Worker) {
    w.Work()
}

func main() {
    engineer := Engineer{Payable{Salary: 80000}}
    manager := Manager{Payable{Salary: 100000}, Manageable{}}
    DescribeWorker(engineer)
    DescribeWorker(manager)
}

Go が継承よりも合成を好むのは、単なる言語の癖ではありません。これにより、変更に適応できる、よりクリーンでモジュール化されたコードが奨励されます。厳格な階層の代わりに、柔軟で再利用可能なコンポーネントが得られ、コードベースを機敏に保ち、保守が容易になります。

以上がGo における継承よりも構成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。