GoDasturchi
Keep Interfaces Small

Keep Interfaces Small

Interfeyslarni kichik saqlang

Go'ning eng mashhur maqollaridan biri: "interfeys qanchalik katta bo'lsa, abstraksiya shunchalik zaif". Kichik, bitta-ikkita metodli interfeyslar — ko'proq turlar tomonidan tabiiy ravishda amalga oshiriladi.

example.go
package main

import "fmt"

// Katta interfeys — kam tur amalga oshira oladi
type FileHandlerBig interface {
	Open() error
	Read() string
	Write(s string)
	Close() error
	Seek(offset int) error
	Truncate() error
}

// Kichik interfeys (io.Reader uslubida) — juda ko'p tur mos keladi
type Reader interface {
	Read() string
}

type StringSource struct{ data string }

func (s StringSource) Read() string { return s.data }

func printData(r Reader) {
	fmt.Println(r.Read())
}

func main() {
	printData(StringSource{data: "salom"})
}

Standart kutubxonaning io.Reader va io.Writer — bittagina metodli interfeyslar ("Reader and Writer Interfaces" darsida ko'rgan edingiz), va aynan shu sabab bilan yuzlab turli tur ularni amalga oshiradi: fayl, tarmoq, xotira buferi, hattoki matn. Agar bitta interfeysga 6-7 ta metod qo'shsangiz, uni amalga oshirish uchun har bir turdan barcha metodlarni yozish talab qilinadi — bu moslashuvchanlikni kamaytiradi.

>_ Exercise

Katta interfeysni kichik, bitta metodli interfeysga ajrating.

  • Closer interfeysini yozing: faqat Close() error metodi bilan
  • FileCloser struct'i (Close() metodi bilan) yozing
  • closeIt(c Closer) funksiyasi orqali chaqiring va natijani chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Kichik (1-2 metodli) interfeyslar ko'proq turlar tomonidan amalga oshirilishi mumkin va moslashuvchanroq bo'ladi — io.Reader/io.Writer bunga eng yaxshi misol.

NEXT UP

Define Interfaces Where Used

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Keep Interfaces Small

Interfeyslarni kichik saqlang

Go'ning eng mashhur maqollaridan biri: "interfeys qanchalik katta bo'lsa, abstraksiya shunchalik zaif". Kichik, bitta-ikkita metodli interfeyslar — ko'proq turlar tomonidan tabiiy ravishda amalga oshiriladi.

example.go
package main

import "fmt"

// Katta interfeys — kam tur amalga oshira oladi
type FileHandlerBig interface {
	Open() error
	Read() string
	Write(s string)
	Close() error
	Seek(offset int) error
	Truncate() error
}

// Kichik interfeys (io.Reader uslubida) — juda ko'p tur mos keladi
type Reader interface {
	Read() string
}

type StringSource struct{ data string }

func (s StringSource) Read() string { return s.data }

func printData(r Reader) {
	fmt.Println(r.Read())
}

func main() {
	printData(StringSource{data: "salom"})
}

Standart kutubxonaning io.Reader va io.Writer — bittagina metodli interfeyslar ("Reader and Writer Interfaces" darsida ko'rgan edingiz), va aynan shu sabab bilan yuzlab turli tur ularni amalga oshiradi: fayl, tarmoq, xotira buferi, hattoki matn. Agar bitta interfeysga 6-7 ta metod qo'shsangiz, uni amalga oshirish uchun har bir turdan barcha metodlarni yozish talab qilinadi — bu moslashuvchanlikni kamaytiradi.

>_ Exercise

Katta interfeysni kichik, bitta metodli interfeysga ajrating.

  • Closer interfeysini yozing: faqat Close() error metodi bilan
  • FileCloser struct'i (Close() metodi bilan) yozing
  • closeIt(c Closer) funksiyasi orqali chaqiring va natijani chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Kichik (1-2 metodli) interfeyslar ko'proq turlar tomonidan amalga oshirilishi mumkin va moslashuvchanroq bo'ladi — io.Reader/io.Writer bunga eng yaxshi misol.

NEXT UP

Define Interfaces Where Used