GoDasturchi
Avoid Interface Pollution

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.

example.go
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.

Hints (0/3)

Key Takeaway

Key Takeaway:

Yagona, almashtirilmaydigan implementatsiya uchun "ehtiyot chorasi" sifatida interfeys yaratmang — bu foydasiz murakkablik ("interfeys ifloslanishi").

NEXT UP

Compose Interfaces

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

Key Takeaway

Key Takeaway:

Yagona, almashtirilmaydigan implementatsiya uchun "ehtiyot chorasi" sifatida interfeys yaratmang — bu foydasiz murakkablik ("interfeys ifloslanishi").

NEXT UP

Compose Interfaces