koichi2426
@koichi2426 (koichi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

この図解は嘘をついている?

Goクリーンアーキテクチャ: AccountRepositoryの実装について

現在、Goのクリーンアーキテクチャ実装プロジェクトを読解中です。図解によると、AccountRepositoryのインターフェースはドメイン層で定義され、アダプタ層で実装されるとされています。しかし、アダプタ層でその実装が見つからず、図解が間違っているのではないかと疑問を持っています。

リポジトリ

(以下の容疑がかかっている図はgithubプロジェクトの中にあるものです。)
image.png

問題点

  • 図解: ドメイン層でAccountRepositoryを定義し、アダプタ層で実装と記載。
  • 実際: AccountRepositoryで検索しても、ドメイン層とユースケース層のみヒット。アダプタ層での実装が見つからない。この図が嘘をついているのか、それとも構成が変更されて図はそのままになっているだけか...

image.png

助けてほしいこと

この図解が間違っているのか、または私が見逃しているのかを判断してほしいです。もし見逃している部分があれば、具体的なファイルや場所を教えていただけると嬉しいです!

ご意見をお待ちしています!

0

1Answer

Goのインターフェース実装パターン

Goでは、インターフェースで定義されたメソッドを全て実装した構造体は、そのインターフェースを暗黙的に実装したと見なされます。以下は簡単な例です。

type Human interface { Greet() error }
type Samurai struct {}
func (s Samurai) Greet() error { return nil }

SamuraiGreetメソッドを実装しているため、Humanインターフェースを実装しています。


プロジェクトの検証

1. ドメイン層でのインターフェース定義

domain/account.goAccountRepositoryインターフェースが定義されています。

type AccountRepository interface {
    Create(ctx context.Context, account Account) (Account, error)
    UpdateBalance(ctx context.Context, id AccountID, balance Money) error
    FindAll(ctx context.Context) ([]Account, error)
    FindByID(ctx context.Context, id AccountID) (Account, error)
    FindBalance(ctx context.Context, id AccountID) (Account, error)
}

2. アダプタ層での実装

repository/account_mongodb.goAccountNoSQL構造体がAccountRepositoryを実装しています。

type AccountNoSQL struct { db NoSQL }

func (a AccountNoSQL) Create(ctx context.Context, account domain.Account) (domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) UpdateBalance(ctx context.Context, id domain.AccountID, balance domain.Money) error { /* 実装 */ }
func (a AccountNoSQL) FindAll(ctx context.Context) ([]domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) FindByID(ctx context.Context, id domain.AccountID) (domain.Account, error) { /* 実装 */ }
func (a AccountNoSQL) FindBalance(ctx context.Context, id domain.AccountID) (domain.Account, error) { /* 実装 */ }

AccountNoSQLAccountRepositoryの全メソッドを実装しているため、インターフェースを正しく実装しています。


結論

AccountRepositoryの実装はアダプタ層のAccountNoSQLで行われており、図解は正しいです。

参考記事

1Like

Your answer might help someone💌