0Pricing
Go Academy · Ders

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öntem
  • io.Writer — 1 yöntem
  • error — 1 yöntem
  • fmt.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

  1. Arayüz Tanımlama ve Uygulama
  2. Temel Standart Kitaplık Arayüzleri
  3. Tür Doğrulamaları ve Tür Switch'leri
  4. Arayüz Birleştirme ve En İyi Uygulamalar
← Go Academy Sayfasına Dön