Professional Documents
Culture Documents
How-To Fix
How-To Fix
Go
with Corey Scott
corey.scott@ovo.id
@CoreySScott
https://coreyscott.dev
About me
Why does it even
matter?
What is coupling?
Example - PersonLoader
Example - PersonLoader
The Dependency
Inversion
Principle
High level modules should not depend on low level
modules.
_ = req.ParseForm()
userID, _ := strconv.Atoi(req.Form.Get("userID"))
user, _ := l.logic.LoadUser(userID)
payload, _ := json.Marshal(user)
resp.Write(payload)
}
Example - Extension == WHOOPS
Original: After the Login feature was added.
user, _ := l.logic.LoadUser(userID)
payload, _ := json.Marshal(&loadUserResponse{
ID: user.ID,
Name: user.Name,
Email: user.Email,
})
resp.Write(payload)
}
return &LoadUserHandler{
logger: logger,
stats: stats,
auth: auth,
loader: loader,
store: store,
}
}
Strategy 1 - Config Injection
func NewHandler(logger Logger, stats StatsD, auth Authenticator, loader
UserLoader) *LoadUserHandler {
return &LoadUserHandler{
logger: logger,
stats: stats,
auth: auth,
loader: loader,
}
}
Strategy 1 - Config Injection
func NewHandler(cfg Config, auth Authenticator, loader UserLoader)
*LoadUserHandler {
return &LoadUserHandler{
logger: cfg.Logger(),
stats: cfg.Stats(),
auth: auth,
loader: loader,
}
}
return &LoadUserHandler{
logger: cfg.Logger(),
stats: cfg.Stats(),
auth: auth,
loader: loader,
}
}
Strategy 2 - Double Constructors
func NewHandler(cfg Config, loader UserLoader) *LoadUserHandler {
return newHandler(cfg, &MyAuthenticator{}, loader)
}
return &LoadUserHandler{
logger: cfg.Logger(),
stats: cfg.Stats(),
auth: auth,
loader: loader,
}
}
Thank YOu!
corey.scott@ovo.id
@CoreySScott
https://coreyscott.dev