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.
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.
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
$ go run main.go
Kodingizni ishga tushiring