Go Academy · Ders

Yapıcı Örüntüleri

Go'ya özgü yapıcılar oluşturma

3. ders / 413 adım

Yapıcı Örüntüleri, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. 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.

Kurucular Neden Kullanılır

Go'da türler için new anahtar sözcüğü veya sınıf kurucuları yoktur. Gelenek, girdileri doğrulayan ve başlatılmış bir değer ya da işaretçi döndüren New... adlı bir işlev kullanmaktır.

Basit New İşlevi

Çağıranın paylaşılan bir örnekle çalışmasını sağlamak için bir işaretçi döndürünüz:

package main
import "fmt"

type Server struct {
    Host string
    Port int
}

func NewServer(host string, port int) *Server {
    return &Server{Host: host, Port: port}
}

func main() {
    s := NewServer("localhost", 8080)
    fmt.Println(s.Host, s.Port)
}

Kurucularda Doğrulama

Kurucular, girdileri doğrulamak ve bir hata döndürmek için uygun bir yerdir:

package main
import ("errors"; "fmt")

type Config struct{ Workers int }

func NewConfig(workers int) (*Config, error) {
    if workers < 1 {
        return nil, errors.New("workers must be >= 1")
    }
    return &Config{Workers: workers}, nil
}

func main() {
    c, err := NewConfig(4)
    fmt.Println(c, err)
}

İşlevsel Seçenekler Kalıbı

İşlevsel seçenekler kalıbı, API'yi bozmadan isteğe bağlı yapılandırmaya olanak tanır:

package main
import "fmt"

type Server struct{ host string; port int; timeout int }
type Option func(*Server)

func WithPort(p int) Option    { return func(s *Server) { s.port = p } }
func WithTimeout(t int) Option { return func(s *Server) { s.timeout = t } }

func NewServer(host string, opts ...Option) *Server {
    s := &Server{host: host, port: 8080, timeout: 30}
    for _, o := range opts { o(s) }
    return s
}

func main() {
    s := NewServer("localhost", WithPort(9090), WithTimeout(60))
    fmt.Println(s.port, s.timeout)
}

Oluşturucu Kalıbı

Karmaşık nesneler için oluşturucu kalıbı, ayarlayıcı yöntemleri zincirler ve sonucu döndürür:

package main
import "fmt"

type QueryBuilder struct{ table, where string; limit int }

func (q *QueryBuilder) Table(t string) *QueryBuilder { q.table = t; return q }
func (q *QueryBuilder) Where(w string) *QueryBuilder { q.where = w; return q }
func (q *QueryBuilder) Limit(n int)   *QueryBuilder { q.limit = n; return q }
func (q *QueryBuilder) Build() string {
    return fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT %d", q.table, q.where, q.limit)
}

func main() {
    sql := (&QueryBuilder{}).Table("users").Where("age>18").Limit(10).Build()
    fmt.Println(sql)
}

Değer mi İşaretçi mi Döndürmeli

Yapı küçük ve değişmez olduğunda değer; yapı büyük veya değiştirilebilir olduğunda ya da arayüzler uyguladığında işaretçi döndürünüz:

  • Küçük yapılandırma yapıları → değer
  • Durum taşıyan nesneler (sunucu, istemci, havuz) → işaretçi
  • İşaretçi alıcılarıyla bir arayüz uygulanıyorsa → işaretçi

Varsayılan Değerler Kalıbı

Seçenekleri uygulamadan önce uygun varsayılanları ayarlamak için bir varsayılanlar işlevi veya yapı değişmezi kullanınız:

package main
import "fmt"

type Cache struct{ maxSize int; ttlSecs int }

func defaultCache() Cache { return Cache{maxSize: 100, ttlSecs: 300} }

func NewCache(opts ...func(*Cache)) *Cache {
    c := defaultCache()
    for _, o := range opts { o(&c) }
    return &c
}

func main() {
    c := NewCache(func(c *Cache) { c.maxSize = 500 })
    fmt.Println(c.maxSize, c.ttlSecs) // 500 300
}

Tekil Örnek Kalıbı

Paylaşılan bir kaynağı tam olarak bir kez başlatmak için sync.Once kullanınız:

package main
import ("fmt"; "sync")

type DB struct{ DSN string }

var (
    instance *DB
    once     sync.Once
)

func GetDB(dsn string) *DB {
    once.Do(func() { instance = &DB{DSN: dsn} })
    return instance
}

func main() {
    db1 := GetDB("postgres://...")
    db2 := GetDB("ignored")
    fmt.Println(db1 == db2) // true
}

Kurucuları Sınama

Hata döndüren kurucuları sınamak kolaydır:

package main
import ("errors"; "fmt")

type Pool struct{ size int }

func NewPool(size int) (*Pool, error) {
    if size <= 0 { return nil, errors.New("size must be positive") }
    return &Pool{size: size}, nil
}

func main() {
    _, err := NewPool(-1)
    fmt.Println(err) // size must be positive
    p, _ := NewPool(5)
    fmt.Println(p.size) // 5
}

init() Kullanımından Kaçınınız

init() işlevleri otomatik olarak çalışır ve sınanmaları zordur. init() içinde örtük başlatma yapmak yerine hata döndüren açık kurucuları tercih ediniz.

Kısa Kontrol

İşlevsel seçenekler kalıbı ne sağlar?

Özet: Kurucu Kalıpları

Temel çıkarımlar:

  • Kurucu olarak New... işlevlerini kullanınız
  • Doğrulama başarısızlıklarında hatalar döndürünüz
  • Esnek isteğe bağlı yapılandırma için işlevsel seçenekleri kullanınız
  • Karmaşık sorgu ve yapılandırma nesneleri için oluşturucu kalıbını kullanınız
  • init() yerine açık kurucuları tercih ediniz

Alıştırma Görevi

İşlevsel seçenekleri kullanarak bir NewHTTPClient kurucusu uygulayınız. WithTimeout, WithBaseURL ve WithMaxRetries seçeneklerini destekleyiniz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Go öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Yapıcı Örüntüleri” dersi ücretsiz mi?

Evet — “Yapıcı Örüntüleri” 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.

“Yapıcı Örüntüleri” dersinde ne öğreneceğim?

Go'ya özgü yapıcılar oluşturma 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 3. dersidir.

“Yapıcı Örüntüleri” 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. Yapı Tanımlama ve Kullanma
  2. Yapılar Üzerinde Yöntemler
  3. Yapıcı Örüntüleri
  4. Anonim Yapılar ve Birleştirme
← Go Academy Sayfasına Dön