Contents
Each class (struct + methods) should work independently. (各クラス(構造体+メソッド)は独立して動作するようにする)
解説
クラスが他のクラスやグローバル状態に暗黙的に依存していると、テストが困難になり、再利用性が低下します。各クラスは、必要な依存関係を明示的に受け取り、独立して動作すべきです。これにより、単体テストでモックやスタブを容易に注入でき、クラスの振る舞いを分離して検証できます。独立性の高いクラスは、異なるコンテキストでの再利用も容易です。
具体例
// 悪い例(グローバル状態に依存)
var globalDB *Database // グローバル変数
type UserService struct{}
func (s *UserService) GetUser(id string) (User, error) {
return globalDB.Query(id) // 暗黙的な依存
}
// 良い例(依存関係を明示的に注入)
type UserService struct {
db Database
}
func NewUserService(db Database) *UserService {
return &UserService{db: db}
}
func (s *UserService) GetUser(id string) (User, error) {
return s.db.Query(id) // 明示的な依存
}
// テストでのモック使用
type MockDatabase struct{}
func (m *MockDatabase) Query(id string) (User, error) {
return User{ID: id, Name: "Test User"}, nil
}
func TestGetUser(t *testing.T) {
mockDB := &MockDatabase{}
service := NewUserService(mockDB)
user, err := service.GetUser("123")
if err != nil {
t.Fatal(err)
}
if user.Name != "Test User" {
t.Errorf("unexpected user name: %s", user.Name)
}
}
