ホームページ  >  記事  >  バックエンド開発  >  共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?

共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-27 02:21:30347ブラウズ

How to Avoid Code Duplication When Implementing Identical Methods on Structs with Shared Fields?

同じフィールドを持つ構造体全体で共通関数を利用するためのベスト プラクティス

2 つの構造体が同じフィールドを持つシナリオでは、次のことを防ぐことが望ましいです。これらのフィールドで動作するメソッドを定義するときのコードの重複。

メソッド レシーバーとしてのカスタム タイプ

推奨されるアプローチは、サービスを提供するカスタム タイプ (バージョンなど) を導入することです。メソッドレシーバーとして。すべてのカスタム型をメソッド レシーバーとして利用できるため、この手法を使用すると、複数の構造体に適用できる単一のメソッドを作成できます。

Composition

カスタム型が定義されている場合は、合成を使用して構造体に組み込むことができます。これには、構造体内にカスタム タイプを埋め込むことが含まれ、基本的にネストされた構造を作成します。

次のコード スニペットを考えてみましょう:

<code class="go">type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}</code>

ここで、Version タイプはメソッド レシーバーとして機能し、その PrintVersion メソッドは、埋め込まれた Version フィールドにより、Game 構造体と ERP 構造体の両方からアクセスできます。

Usage

埋め込まれた Version フィールドは、他のフィールドと同様に使用および変更できます。

<code class="go">main() {
    g := Game{
        "Fear Effect",
        false,
        "Action-Adventure",
        "1.0.0",
    }

    g.PrintVersion() // Version is 1.0.0

    e := ERP{
        "Logo",
        true,
        []string{"ms-sql"},
        "2.0.0",
    }

    e.PrintVersion() // Version is 2.0.0
}</code>

このアプローチを採用することで、柔軟性と型安全性を維持しながら、重複メソッドに関連するコードの繰り返しが排除されます。

以上が共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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