DIPを意識してgoを書いてみる
背景 go言語を触っていて、DuckTypingによるインターフェースとDIPとの相性がかなり良いものだなぁ感じ試して見た記事です。
以前のアーキテクチャについての記事にも書きましたが、ソフトウェアの詳細にビジネスロジックが依存しない方が好ましく、
できれば実装の詳細についての判断をできるだけ遅くすることがアーキテクトの腕の見せ所と言えます。
そこで今回は以下のユースケースをDBに依存することなく実装を進めて見たいと思います。
ユーザー一覧の表示 ユーザーの登録 ソースコードはこちら(http://github.com/foresta/go-dip-sample)
DIPとは SOLIDの原則と言われるクラス設計の原則の中の一つで、日本語だと依存関係逆転の原則と言います。
ソースコード 全体のファイル構成はこんな感じです。
src/ ├── memory │ └── user_repository.go ├── mysql │ └── user_repository.go ├── server.go └── user ├── user.go └── user_repository.go パッケージは user, memory, mysql の三つで user がソフトウェアドメインに関するパッケージ、 memory, mysqlはデータストア (インフラ) に関するパッケージです。 今回はmysqlを準備することなくメモリ上にユーザーデータを保存をできるようにします。
ユーザーは以下のようなデータ構造とします。
// user.go package main type User struct { ID int Name string Email string } 保存にはUserRepositoryというインターフェースを使用することにします.
// user_repository.go package user type Repository interface { Store(u *User) error FindAll() []*User } 以下にmainパッケージの処理全てを載せます。\