Avoid Interface Pollution
Interfeys ifloslanishidan saqlaning
"Avoid Premature Abstraction" darsida ko'rgan g'oyaning interfeysga oid ko'rinishi: har bir struct uchun "ehtiyot chorasi" sifatida interfeys yaratish — "interfeys ifloslanishi" deyiladi. Bu kerakmas murakkablik qo'shadi.
package main
import "fmt"
// Ifloslanish: faqat bitta implementatsiya bor, hech qachon almashtirilmaydi,
// lekin baribir interfeys orqali yashiringan
type UserStore interface {
GetUser(id int) string
}
type dbUserStore struct{}
func (d dbUserStore) GetUser(id int) string { return fmt.Sprintf("user-%d", id) }
// Sodda: interfeyssiz, to'g'ridan-to'g'ri struct
type UserRepo struct{}
func (r UserRepo) GetUser(id int) string {
return fmt.Sprintf("user-%d", id)
}
func main() {
repo := UserRepo{}
fmt.Println(repo.GetUser(7))
}Agar dbUserStore — yagona implementatsiya bo'lsa va uni almashtirish rejasi yo'q bo'lsa (masalan testda soxtalashtirish ham kerak bo'lmasa), UserStore interfeysi hech qanday amaliy foyda bermaydi — u faqat qo'shimcha qatlam, "qaysi struct qaysi interfeysni amalga oshiradi" deb kuzatishni qiyinlashtiradi. Qoidani eslang: interfeys ikki yoki undan ko'p implementatsiya, testda almashtirish, yoki implementatsiyani yashirish kerak bo'lgandagina yarating ("When to Abstract" darsida ko'rgan).
>_ Exercise
Keraksiz interfeysni olib tashlab, to'g'ridan-to'g'ri struct ishlating.
- •Calculator struct'ini (interfeyssiz) yozing
- •Add(a, b int) int metodini qo'shing
- •to'g'ridan-to'g'ri chaqirib natijani chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Yagona, almashtirilmaydigan implementatsiya uchun "ehtiyot chorasi" sifatida interfeys yaratmang — bu foydasiz murakkablik ("interfeys ifloslanishi").
NEXT UP
Compose Interfaces
$ go run main.go
Kodingizni ishga tushiring