GoDasturchi
Avoid Premature Abstraction

Avoid Premature Abstraction

Muddatidan oldingi abstraksiyadan saqlaning

"Ehtimol kelajakda kerak bo'lar" deb, hozir foydasi yo'q interfeys yoki abstraksiya yaratish — "muddatidan oldingi abstraksiya" deyiladi. Bu kodni murakkablashtiradi, lekin hech qanday real foyda bermaydi.

example.go
package main

import "fmt"

// Ortiqcha: faqat bitta implementatsiya bor, lekin "kelajakda kerak bo'lar" deb interfeys yaratilgan
type Greeter interface {
	Greet() string
}

type EnglishGreeter struct{}

func (g EnglishGreeter) Greet() string { return "Hello!" }

func printGreetingOld(g Greeter) {
	fmt.Println(g.Greet())
}

// Sodda: hozircha faqat bitta turi bor — interfeys kerak emas
func greet(name string) string {
	return "Salom, " + name + "!"
}

func main() {
	fmt.Println(greet("Dunyo"))
}

Agar hozircha faqat bitta implementatsiya bo'lsa va uni almashtirish rejasi ham yo'q bo'lsa — interfeys yaratish shart emas. Buni keyinroq, haqiqatan ikkinchi implementatsiya kerak bo'lganda qo'shish oson (Go'da bu — kichik refaktoring). Bu tamoyil "YAGNI" ("You Aren't Gonna Need It" — "bu sizga kerak bo'lmaydi") deb ham ataladi: kelajakdagi ehtimoliy ehtiyoj uchun emas, hozirgi haqiqiy ehtiyoj uchun kod yozing.

>_ Exercise

Ortiqcha interfeysni olib tashlab, oddiy funksiyaga soddalashtiring.

  • formatPrice(cents int) string oddiy funksiyasini yozing: natijani "X.XX so'm" ko'rinishida qaytarsin
  • hech qanday interfeys yoki struct yaratmasdan, to'g'ridan-to'g'ri chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Faqat haqiqiy, hozirgi ehtiyoj uchun abstraksiya yarating — "kelajakda kerak bo'lishi mumkin" degan taxmin uchun emas.

NEXT UP

When to Abstract

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Avoid Premature Abstraction

Muddatidan oldingi abstraksiyadan saqlaning

"Ehtimol kelajakda kerak bo'lar" deb, hozir foydasi yo'q interfeys yoki abstraksiya yaratish — "muddatidan oldingi abstraksiya" deyiladi. Bu kodni murakkablashtiradi, lekin hech qanday real foyda bermaydi.

example.go
package main

import "fmt"

// Ortiqcha: faqat bitta implementatsiya bor, lekin "kelajakda kerak bo'lar" deb interfeys yaratilgan
type Greeter interface {
	Greet() string
}

type EnglishGreeter struct{}

func (g EnglishGreeter) Greet() string { return "Hello!" }

func printGreetingOld(g Greeter) {
	fmt.Println(g.Greet())
}

// Sodda: hozircha faqat bitta turi bor — interfeys kerak emas
func greet(name string) string {
	return "Salom, " + name + "!"
}

func main() {
	fmt.Println(greet("Dunyo"))
}

Agar hozircha faqat bitta implementatsiya bo'lsa va uni almashtirish rejasi ham yo'q bo'lsa — interfeys yaratish shart emas. Buni keyinroq, haqiqatan ikkinchi implementatsiya kerak bo'lganda qo'shish oson (Go'da bu — kichik refaktoring). Bu tamoyil "YAGNI" ("You Aren't Gonna Need It" — "bu sizga kerak bo'lmaydi") deb ham ataladi: kelajakdagi ehtimoliy ehtiyoj uchun emas, hozirgi haqiqiy ehtiyoj uchun kod yozing.

>_ Exercise

Ortiqcha interfeysni olib tashlab, oddiy funksiyaga soddalashtiring.

  • formatPrice(cents int) string oddiy funksiyasini yozing: natijani "X.XX so'm" ko'rinishida qaytarsin
  • hech qanday interfeys yoki struct yaratmasdan, to'g'ridan-to'g'ri chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Faqat haqiqiy, hozirgi ehtiyoj uchun abstraksiya yarating — "kelajakda kerak bo'lishi mumkin" degan taxmin uchun emas.

NEXT UP

When to Abstract