Menu
CoddyTech

Polimorfik Koleksiyonlar

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

Arayüzlerin en güçlü kullanım alanlarından biri, aynı koleksiyonda farklı türleri saklamaktır. Bir arayüz türünden dilim, o arayüzü karşılayan herhangi bir değeri tutabilir; böylece birbiriyle ilişkili ancak farklı türleri birlikte gruplayabilirsin.

Çeşitli şekilleri yönetmeniz gereken bir senaryo düşünün. Her tür için ayrı dilimler kullanmak yerine, arayüz türünden tek bir dilim kullanabilirsiniz:

type Shape interface {
    Area() float64
}

type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return 3.14159 * c.Radius * c.Radius }

type Rectangle struct{ Width, Height float64 }
func (r Rectangle) Area() float64 { return r.Width * r.Height }

func main() {
    shapes := []Shape{
        Circle{Radius: 5},
        Rectangle{Width: 4, Height: 3},
        Circle{Radius: 2},
    }
    
    for _, s := range shapes {
        fmt.Printf("Area: %.2f\n", s.Area())
    }
}

shapes dilimi hem daireleri hem de dikdörtgenleri içerir. Döngüde gezinirken her öğe, gerçek türüne göre Area() çağrısına yanıt verir. Bu, koleksiyonlara uygulanan çok biçimliliktir: aynı döngü tüm şekil türlerini tutarlı bir şekilde işler.

Polimorfik koleksiyonlar; e-postalar ve SMS mesajları gönderen bir bildirim sistemi, farklı düşman türlerini güncelleyen bir oyun veya birden çok dosya biçimini işleyen bir belge işlemcisi gibi çeşitli öğeleri işleyen sistemler oluştururken vazgeçilmezdir. Koleksiyon belirli türleri önemsemez; yalnızca her öğenin gerekli davranışı sağlaması gerekir.

challenge icon

Görev

Kolay

Farklı görev türlerini birleşik bir arayüz üzerinden yöneten bir görev yönetim sistemi oluşturalım. Çeşitli görev türleri oluşturacak ve bunların tümünü polimorfik bir koleksiyonda birlikte işleyeceksin.

Kodunu üç dosyaya dağıtacaksın:

  • task.go: Summary() string yöntemini gerektiren bir Task arayüzü tanımla. Bu arayüz, tüm görev türlerinin yerine getirmesi gereken ortak sözleşme olacak.
  • types.go: Her biri Task arayüzünü uygulayan üç farklı görev türü oluştur:
    • BugFix; ID (string) ve Severity (string) alanlarına sahip. Summary() yöntemi Bug #[ID] ([Severity]) döndürür.
    • Feature; Name (string) ve Points (int) alanlarına sahip. Summary() yöntemi Feature: [Name] - [Points] pts döndürür.
    • Documentation; Topic (string) alanına sahip. Summary() yöntemi Docs: [Topic] döndürür.
  • main.go: Bir Task dilimini kabul eden ve her görevin özetini ayrı bir satıra yazdıran PrintBacklog adlı bir işlev oluştur. Görev ayrıntılarını girdiden oku, her görev türünden bir tane oluştur, hepsini tek bir []Task diliminde topla ve bu dilimi PrintBacklog işlevine gönder.

Aşağıdaki girdiler sağlanacak:

  • 1. satır: Hata kimliği
  • 2. satır: Hatanın önem derecesi
  • 3. satır: Özellik adı
  • 4. satır: Özellik puanı (tam sayı)
  • 5. satır: Dokümantasyon konusu

Örneğin, 1042, critical, Themes, 8 ve API verildiğinde çıktın şöyle olmalı:

Bug #1042 (critical)
Feature: Themes - 8 pts
Docs: API

Buradaki güç, PrintBacklog işlevinin hatalar, özellikler veya dokümantasyon için ayrı bir mantığa ihtiyaç duymamasıdır. İşlev yalnızca dilim üzerinde yineleme yapar ve her öğenin Summary() yöntemini çağırır. Her görev türü kendine özgü bir biçimde yanıt vererek polimorfik koleksiyonların farklı türleri nasıl aynı şekilde işlemene olanak tanıdığını gösterir.

Kendin dene

package main

import (
	"fmt"
)

// TODO: Task türünden bir dilim kabul eden bir PrintBacklog fonksiyonu oluştur
// ve her görevin özetini ayrı bir satıra yazdır

func main() {
	// Girdiyi oku
	var bugID string
	var bugSeverity string
	var featureName string
	var featurePoints int
	var docTopic string

	fmt.Scanln(&bugID)
	fmt.Scanln(&bugSeverity)
	fmt.Scanln(&featureName)
	fmt.Scanln(&featurePoints)
	fmt.Scanln(&docTopic)

	// TODO: Her görev türünden (BugFix, Feature, Documentation) birer tane oluştur

	// TODO: Tüm görevleri tek bir []Task diliminde topla

	// TODO: PrintBacklog fonksiyonunu görevlerin bulunduğu dilimle çağı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