Arayüz Birleştirme ve En İyi Uygulamalar
Küçük arayüzler ve bağımlılıkların tersine çevrilmesi
Arayüz Birleştirme ve En İyi Uygulamalar, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.
Arayüzlerin Birleştirilmesi
Go arayüzleri, daha büyük arayüzler oluşturmak için başka arayüzleri gömebilir:
package main
import "io"
// io.ReadWriter composes Reader and Writer
type ReadWriter interface {
io.Reader
io.Writer
}
// Your own composition:
type Processor interface {
io.Reader
Process() error
io.Closer
}
func main() { _ = (*Processor)(nil) }Küçük Arayüz İlkesi
En güçlü Go arayüzlerinde bir veya iki yöntem bulunur. Bu, onları karşılayabilecek türlerin sayısını en üst düzeye çıkarır:
io.Reader— 1 yöntemio.Writer— 1 yöntemerror— 1 yöntemfmt.Stringer— 1 yöntem
Büyük arayüzleri taklit etmek ve sınamak daha zordur.
Bağımlılıkların Tersine Çevrilmesi
İşlev parametrelerinde somut türler yerine arayüzleri kabul edin. Böylece kodunuz belirli uygulamalardan ayrıştırılır:
package main
import "fmt"
type Store interface {
Get(key string) (string, bool)
Set(key, val string)
}
func cache(s Store, key, value string) {
if _, ok := s.Get(key); !ok {
s.Set(key, value)
}
}
type MapStore struct{ m map[string]string }
func (ms *MapStore) Get(k string) (string, bool) { v, ok := ms.m[k]; return v, ok }
func (ms *MapStore) Set(k, v string) { ms.m[k] = v }
func main() {
s := &MapStore{m: map[string]string{}}
cache(s, "x", "hello")
v, _ := s.Get("x")
fmt.Println(v)
}Arayüzlerin Ayrıştırılması
Büyük arayüzleri daha küçük ve belirli amaçlara odaklanmış arayüzlere ayırın. İstemciler yalnızca kullandıkları yöntemlere bağımlı olur:
package main
// Bad: large interface forces all methods
type BigStorage interface {
Read(key string) string
Write(key, val string)
Delete(key string)
List() []string
Backup() error
}
// Good: small, focused interfaces
type Reader interface{ Read(key string) string }
type Writer interface{ Write(key, val string) }
type Lister interface{ List() []string }
func readAll(r Reader) {} // only needs Read
func main() { _ = readAll }Somut Türler Döndürme
Kurucular arayüz değil, somut türler döndürmelidir. Çağıranlar somut bir türü her zaman bir arayüz değişkenine atayabilir:
package main
type Logger interface{ Log(string) }
type ConsoleLogger struct{}
func (c *ConsoleLogger) Log(s string) {}
// Good: return concrete *ConsoleLogger
func NewConsoleLogger() *ConsoleLogger { return &ConsoleLogger{} }
// Avoid: return Logger (hides the concrete type)
// func NewConsoleLogger() Logger { return &ConsoleLogger{} }
func main() { _ = NewConsoleLogger() }Arayüz Kirliliği
"Her ihtimale karşı" her tür için bir arayüz oluşturmayın. Arayüzleri yalnızca şu durumlarda oluşturun:
- Şu anda veya yakında birden çok uygulamanız varsa
- Sınamalarda bağımlılığı taklit etmeniz gerekiyorsa
- Bir kitaplık oluşturuyor ve çağıranları ayrıştırmak istiyorsanız
Genişletme İçin Arayüz Gömme
Varsayılanlarla isteğe bağlı yöntemler eklemek için bir arayüz gömün:
package main
import "fmt"
type Handler interface{ Handle(msg string) }
type NamedHandler interface {
Handler
Name() string
}
func dispatch(h Handler) {
if nh, ok := h.(NamedHandler); ok {
fmt.Printf("[%s] ", nh.Name())
}
h.Handle("event")
}
type MyHandler struct{}
func (m MyHandler) Handle(msg string) { fmt.Println(msg) }
func (m MyHandler) Name() string { return "my" }
func main() { dispatch(MyHandler{}) }Arayüzlerle Taklit Oluşturma
Bağımlılıkları arayüz olarak tanımlayın; sınamalarda taklitleri içeri aktarın:
package main
import "fmt"
type Clock interface{ Now() int64 }
type MockClock struct{ T int64 }
func (m MockClock) Now() int64 { return m.T }
func isExpired(c Clock, expiresAt int64) bool {
return c.Now() > expiresAt
}
func main() {
mc := MockClock{T: 1000}
fmt.Println(isExpired(mc, 500)) // true
fmt.Println(isExpired(mc, 1500)) // false
}Yeniden Kullanım İçin Arayüz ve Yapı Gömme Karşılaştırması
API birleştirme için arayüz gömmeyi, kodu yeniden kullanmak için yapı gömmeyi kullanın. Farklı amaçlara hizmet ederler ve birbirine karıştırılmamalıdır.
Derleme Zamanında Arayüz Uyumluluğunu Saptama
Türünüzün bir arayüzü karşıladığını doğrulamak için boş tanımlayıcıyla derleme zamanı denetimi kullanın:
package main
type Doer interface{ Do() }
type MyType struct{}
func (m *MyType) Do() {}
// Compile-time check — no runtime cost
var _ Doer = (*MyType)(nil)
func main() {}Hızlı Kontrol
Go'da yeni bir arayüzü ne zaman tanımlamalısınız?
Özet: Arayüzler İçin En İyi Uygulamalar
Temel çıkarımlar:
- Arayüzleri küçük tutun — bir veya iki yöntem
- Arayüzleri daha küçük arayüzlerden oluşturun
- Arayüzleri kabul edin, somut türler döndürün
- Sınanabilirlik ve birden çok uygulama için arayüzler oluşturun
- Boş atamayla derleme zamanı denetimi kullanın
Alıştırma
Notify(msg string) error yöntemine sahip bir Notifier arayüzü tasarlayın. Bunu EmailNotifier ve SMSNotifier için uygulayın. Bir []Notifier değerine gönderim yapan broadcast işlevi yazın.
Sıkça Sorulan Sorular
“Arayüz Birleştirme ve En İyi Uygulamalar” dersi ücretsiz mi?
Evet — “Arayüz Birleştirme ve En İyi Uygulamalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.
“Arayüz Birleştirme ve En İyi Uygulamalar” dersinde ne öğreneceğim?
Küçük arayüzler ve bağımlılıkların tersine çevrilmesi Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Go Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Arayüz Birleştirme ve En İyi Uygulamalar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Arayüz Tanımlama ve Uygulama
- Temel Standart Kitaplık Arayüzleri
- Tür Doğrulamaları ve Tür Switch'leri
- Arayüz Birleştirme ve En İyi Uygulamalar