Go でデカップリングを処理する最善の方法は、2 つの異なるパッケージで同様の構造を使用することですが、構造内の子がそれを困難にしています。

王林
リリース: 2024-02-09 13:00:11
転載
1181 人が閲覧しました

在 Go 中处理解耦的最佳方法是在两个不同的包中使用类似的结构,但结构中的子项使其变得困难?

Go で分離を処理する最良の方法は、構造は似ているがサブキーが異なる 2 つの異なるパッケージを使用することです。このアプローチによりコードが効果的に分離され、保守性とモジュール性が向上します。ただし、構造内のサブアイテムが複雑になると、この分離アプローチが困難になる可能性があります。この場合、インターフェイスとポリモーフィズムの概念を使用して問題を解決することを検討してください。共通のインターフェイス タイプを定義することにより、異なる構造タイプを均一に処理できるため、より柔軟なデカップリング方法が実現します。このアプローチは、コードの拡張性と再利用性を高めるために Go で広く使用されています。

質問の内容

私はこれに比較的慣れたばかりで、依存関係グラフをできる限り減らすために大規模な書き直しを行っています。購入したところには非常に満足していますが、どのように扱うのが最善かわからない部分が 1 つあります。答えが「両者の間には依存関係があるだろう」というものであれば、それも問題ありません。私は奇跡を期待するのではなく、ただ良いアプローチを探しているだけです。

したがって、以下には ab という 2 つのパッケージがあり、どちらも同じ構造を持っています。通常、 main で一方を他方に変換できますが、それぞれには構造体でもある子があり、子が同じ署名を持っている場合でも、 go はそれを許可できません。

1 つの方法は、b の構造内で a.tzconfig を参照し、依存関係を持たせることですが、それを削除したいと考えています。

別の方法は、インターフェイスを作成してから、メソッドを介して loc の値を取得することだと思います。これは機能すると思いますが、単なるものに対してメソッドを作成することになるため、まだ試していません。データ構造 (実際の構造には多くの項目が含まれていますが、ここではわかりやすくするために項目を最小限に抑えています)、これはやりすぎのように思えます。

tzconfig を 3 番目のモジュールに移動して、一方が他方を参照するのではなく、両方がそのモジュールを参照するようにすることができます。それが私が考えたものです。

そこで私の質問は、実際の経験を持つ人からの質問ですが、Go でこの状況に対処する最善の方法は何ですか?

構造体を複製する理由は、それらの間の依存関係を解消しようとしているだけであることを述べておく必要があります。元のコードでは、一方のパッケージに構造体があり、もう一方のパッケージがそれを参照しているだけです。

リーリー リーリー
package a

type cfg struct {
    addr                 string
    loc                  tzconfig
}

type tzconfig struct {
    string string
    tz     *time.location `validate:"nodescent"`
}

func getcfg() cfg {
    t, _ := time.loadlocation(`mst`)
    return cfg{
        addr: "abc",
        host: "a.bc.d",
        loc:  config.tzconfig{
            string: "mst",
            tz:     t,
        },
    }
}
ログイン後にコピー

Solution

私見ですが、@burakserdar が提供するアドバイスは非常に優れており、あなたのシナリオに非常に適しています。コードをこのように書き直しました。

パッケージ共通

リーリー

一般的に使用される構造体、関数、メソッドなどをここに配置します。

パッケージ# リーリー

これは、

import セクションで示されているように、common パッケージから共有コードを継承する a パッケージに関連する特定のコードです。

パッケージに定義されている

common 共有フィールドを取得するために構造体埋め込み機能を使用していることに注意してください。

パッケージb リーリー

ここでは特に言及する価値のあるものは何もありません。

パッケージメイン リーリー

ここで、コードは非常に単純である必要があります。

a および b パッケージをインポートして、その機能を利用しました。

これは主観的なトピックであるため、特効薬はないことをもう一度明確にしたいと思います。私にとって、それはきちんとしていて明確に見えます。私なら間違いなくこのアプローチを選択します。ぜひお知らせください、ありがとうございます!

以上がGo でデカップリングを処理する最善の方法は、2 つの異なるパッケージで同様の構造を使用することですが、構造内の子がそれを困難にしています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!