Menu
Coddy logo textTech

Tasarım Kalıplarına Giriş

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 85 / 107.

Tasarım kalıpları, yazılım tasarımında ortaya çıkan yaygın sorunlara yönelik yeniden kullanılabilir çözümlerdir. Doğrudan kopyaladığın kodlar değil, belirli zorlukları çözmek için türlerini ve bunların etkileşimlerini nasıl yapılandıracağına rehberlik eden şablonlardır.

Tasarım kalıpları genellikle üç kategoriye ayrılır:

KategoriAmaçÖrnekler
ÜretimselNesne oluşturma mekanizmalarıSingleton, Factory, Builder
YapısalTürleri daha büyük yapılar hâlinde birleştirmeAdapter, Decorator, Composite
DavranışsalNesneler arasındaki iletişimObserver, Strategy, Command

Go'da tasarım kalıpları, geleneksel OOP dillerindekinden farklı görünür.

Sınıflar veya kalıtım olmadan Go, kalıpları arayüzler, struct gömme ve bileşim kullanarak uygular. Örneğin, Java'nın soyut bir sınıf kullanabileceği yerde Go bir arayüz kullanır. C++'ın kalıtım kullanabileceği yerde Go gömme kullanır.

Desenleri öğrenmek, yaygın sorunları tanımanıza ve çözümleri diğer geliştiricilerle etkili bir şekilde paylaşmanıza yardımcı olur. Birisi “burada Strateji desenini kullan” dediğinde, tüm ekip uzun açıklamalara gerek kalmadan yaklaşımı anlar.

Sonraki derslerde, Singleton ve Factory gibi yaratıcı tasarım kalıplarıyla başlayıp Observer ve Strategy gibi davranışsal tasarım kalıplarına geçerek Go'da birkaç temel kalıbı uygulayacaksın.

challenge icon

Görev

Kolay

Tasarım kalıplarının kodu düzenlemeye nasıl yardımcı olduğunu gösteren basit bir bildirim sistemi oluşturalım! Gelecek derslerde Observer veya Strategy gibi kalıplarla kolayca genişletilebilecek bir yapı oluşturacaksın; ancak şimdilik iyi OOP ilkelerini izleyen temiz arayüzler ve türler kurmaya odaklan.

Kodunu üç dosyaya ayıracaksın:

  • notifier.go: Bildirim sistemin için temel arayüzü ve türleri tanımla.

    Notifier adında, doğrulama mesajı döndüren tek bir Send(message string) string metoduna sahip bir arayüz oluştur.

    İki somut bildirim türü uygula:

    • EmailNotifier; bir Address alanına sahip olmalıdır. Send metodu Email to [address]: [message] döndürür.
    • SMSNotifier; bir PhoneNumber alanına sahip olmalıdır. Send metodu SMS to [phone]: [message] döndürür.
  • dispatcher.go: Arayüz üzerinden herhangi bir bildirim türüyle çalışabilen bir dağıtıcı oluştur.

    Bir NotificationDispatcher arayüzleri dilimi tutan Notifier yapısını oluştur. Aşağıdaki metotları ekle:

    • Bir bildirimi kaydetmek için AddNotifier(n Notifier)
    • Mesajı kayıtlı tüm bildirim türleri üzerinden gönderen ve tüm doğrulama dizelerinden oluşan bir dilim döndüren Broadcast(message string) []string

    Ayrıca başlatılmış bir dağıtıcı döndüren bir NewNotificationDispatcher() oluşturucusu da oluştur.

  • main.go: Bildirim türlerini ayarla ve mesajları yayınla.

    Oluşturulacak bildirim türlerinin sayısını oku. Her bildirim türü için türünü (email veya sms) ve hedefini (adres veya telefon numarası) oku. Her birini bir dağıtıcıya ekle.

    Ardından yayınlanacak bir mesaj oku. Bu mesajı tüm bildirim türleri üzerinden gönder ve her doğrulamayı kendi satırında yazdır.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Bildirim türlerinin sayısı
  • Her bildirim türü için: tür (email veya sms), ardından hedef
  • Son satır: Yayınlanacak mesaj

Örneğin, aşağıdaki girdiler verildiğinde:

3
email
alice@example.com
sms
555-1234
email
bob@example.com
Server maintenance at midnight

Çıktın şöyle olmalıdır:

Email to alice@example.com: Server maintenance at midnight
SMS to 555-1234: Server maintenance at midnight
Email to bob@example.com: Server maintenance at midnight

Ve aşağıdaki girdiler verildiğinde:

2
sms
555-9999
sms
555-0000
Meeting canceled

Çıktın şöyle olmalıdır:

SMS to 555-9999: Meeting canceled
SMS to 555-0000: Meeting canceled

Bu yapı, arayüzlerin esnek ve genişletilebilir tasarımları nasıl mümkün kıldığını gösterir. Dağıtıcı, belirli bildirim türlerini bilmez. Yalnızca onların Send işlemini gerçekleştirebildiğini bilir. Bu, Observer ve Strategy gibi kalıpların üzerine inşa edildiği temeldir!

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Notifier sayısını oku
	countStr, _ := reader.ReadString('\n')
	count, _ := strconv.Atoi(strings.TrimSpace(countStr))

	// Yeni bir dispatcher oluştur
	dispatcher := NewNotificationDispatcher()

	// Her notifier'ı oku ve dispatcher'a ekle
	for i := 0; i < count; i++ {
		notifierType, _ := reader.ReadString('\n')
		notifierType = strings.TrimSpace(notifierType)

		destination, _ := reader.ReadString('\n')
		destination = strings.TrimSpace(destination)

		// TODO: Türe göre uygun notifier'ı oluştur
		// ve dispatcher'a ekle
		// İpucu: notifierType değerinin "email" veya "sms" olup olmadığını kontrol et

	}

	// Yayınlanacak mesajı oku
	message, _ := reader.ReadString('\n')
	message = strings.TrimSpace(message)

	// TODO: Mesajı yayınla ve her onayı yazdır

}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi