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 desenleri, yazılım tasarımında ortaya çıkan yaygın sorunlara yönelik yeniden kullanılabilir çözümlerdir. Bunlar doğrudan kopyaladığınız kodlar değil, aksine belirli zorlukları çözmek için türlerinizi ve bunların etkileşimlerini nasıl yapılandıracağınız konusunda rehberlik eden şablonlardır.

Tasarım desenleri genellikle üç kategoriye ayrılır:

KategoriAmaçÖrnekler
Creational (Yaratımsal)Nesne oluşturma mekanizmalarıSingleton, Factory, Builder
Structural (Yapısal)Türleri daha büyük yapılar halinde birleştirmeAdapter, Decorator, Composite
Behavioral (Davranışsal)Nesneler arası iletişimObserver, Strategy, Command

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

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

Tasarım kalıplarını öğ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 Strategy kalıbını kullan" dediğinde, tüm ekip uzun açıklamalara gerek kalmadan yaklaşımı anlar.

Gelecek derslerde, Singleton ve Factory gibi oluşturucu (creational) desenlerle başlayıp ardından Observer ve Strategy gibi davranışsal (behavioral) desenlere geçerek Go'da birkaç temel deseni uygulayacaksınız.

challenge icon

Görev

Kolay

Tasarım desenlerinin kodu düzenlemeye nasıl yardımcı olduğunu gösteren basit bir bildirim sistemi kuralım! Gelecekteki derslerde Observer veya Strategy gibi desenlerle kolayca genişletilebilecek bir yapı oluşturacaksınız; ancak şimdilik, iyi OOP prensiplerini takip eden temiz arayüzler ve türler kurmaya odaklanın.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • notifier.go: Bildirim sisteminiz için temel arayüzü ve türleri tanımlayın.

    Bir onay mesajı döndüren tek bir Send(message string) string metoduna sahip bir Notifier arayüzü oluşturun.

    İki somut bildirim türü uygulayın:

    • Address alanına sahip EmailNotifierSend metodu Email to [address]: [message] döndürür
    • PhoneNumber alanına sahip SMSNotifierSend metodu SMS to [phone]: [message] döndürür
  • dispatcher.go: Arayüz aracılığıyla herhangi bir bildirimci ile çalışan bir dağıtıcı (dispatcher) oluşturun.

    Notifier arayüzlerinden oluşan bir dilim (slice) tutan bir NotificationDispatcher yapısı oluşturun. Şu metodları ekleyin:

    • Bir bildirimciyi kaydetmek için AddNotifier(n Notifier)
    • Mesajı tüm kayıtlı bildirimciler aracılığıyla gönderen ve tüm onay dizilerinin bir dilimini döndüren Broadcast(message string) []string

    Ayrıca, başlatılmış bir dağıtıcı döndüren bir NewNotificationDispatcher() yapıcı (constructor) fonksiyonu oluşturun.

  • main.go: Bildirimcileri ayarlayın ve mesajları yayınlayın.

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

    Ardından yayınlanacak bir mesaj okuyun. Bu mesajı tüm bildirimciler aracılığıyla gönderin ve her bir onayı kendi satırında yazdırın.

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

  • Satır 1: Bildirimci sayısı
  • Her bildirimci için: tür (email veya sms), ardından hedef
  • Son satır: Yayınlanacak mesaj

Örneğin, şu girdi verildiğinde:

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

Çıktınız şu 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 şu girdi verildiğinde:

2
sms
555-9999
sms
555-0000
Meeting canceled

Çıktınız şu olmalıdır:

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

Bu yapı, arayüzlerin nasıl esnek ve genişletilebilir tasarımlar sağladığını gösterir. Dağıtıcı, belirli bildirimci türlerini bilmez; sadece onların Send yapabildiğini bilir. Bu, Observer ve Strategy gibi desenlerin üzerine inşa edildiği temeldir!

Kopya kağıdı

Tasarım desenleri, yazılım tasarımındaki yaygın sorunlara yönelik yeniden kullanılabilir çözümlerdir. Türlerin nasıl yapılandırılacağı ve etkileşimleri konusunda rehberlik eden şablonlardır.

Tasarım desenleri üç kategoriye ayrılır:

KategoriAmaçÖrnekler
Creational (Oluşturucu)Nesne oluşturma mekanizmalarıSingleton, Factory, Builder
Structural (Yapısal)Türleri daha büyük yapılar halinde birleştirmeAdapter, Decorator, Composite
Behavioral (Davranışsal)Nesneler arası iletişimObserver, Strategy, Command

Go'da tasarım desenleri, sınıflar ve kalıtım yerine arayüzler (interfaces), yapı gömme (struct embedding) ve bileşim (composition) kullanılarak uygulanır. Geleneksel OOP dillerinin soyut sınıflar (abstract classes) kullandığı yerlerde Go arayüzleri kullanır. Kalıtım kullandıkları yerlerde ise Go gömmeyi kullanır.

Kendin dene

package main

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

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

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

	// Yeni bir dağıtıcı (dispatcher) oluştur
	dispatcher := NewNotificationDispatcher()

	// Her bir bildirimciyi oku ve dağıtıcıya 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 bildirimciyi oluştur
		// ve onu dağıtıcıya ekle
		// İpucu: notifierType'ın "email" mi yoksa "sms" mi olduğunu kontrol et

	}

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

	// TODO: Mesajı yayınla ve her bir 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