Menu
Coddy logo textTech

Go'da Duck Typing

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

ördek tiplemesi terimi şu deyişten gelir: "Bir ördek gibi yürüyorsa ve bir ördek gibi vaklıyorsa, o bir ördektir." Go'da bu, bir türün bir interface uyguladığını açıkça belirtmesine gerek olmadığı anlamına gelir. Yalnızca doğru metotlara sahip olması yeterlidir.

Bu arayüzü ve tamamen ilgisiz iki türü düşünün:

type Quacker interface {
    Quack() string
}

type Duck struct{}
func (d Duck) Quack() string { return "Quack!" }

type Robot struct{}
func (r Robot) Quack() string { return "Beep-quack!" }

Ne Duck ne de Robot tanımlamalarında herhangi bir yerde Quacker'dan bahseder. Buna rağmen ikisi de, doğru imzaya sahip bir Quack() metoduna sahip oldukları için arayüzü karşılar:

func MakeItQuack(q Quacker) {
    fmt.Println(q.Quack())
}

func main() {
    MakeItQuack(Duck{})   // Vak!
    MakeItQuack(Robot{})  // Bip-vak!
}

Bu örtük uyumluluk güçlüdür, çünkü türler zaten var olduktan sonra arayüzler tanımlamanıza olanak tanır. Kaynak kodlarını değiştirmeden harici paketlerdeki türlerle eşleşen bir arayüz oluşturabilirsiniz. Türlerin arayüzünüzü bilmesi gerekmez. Yalnızca doğru şekilde davranmaları gerekir.

Go'da ördek tipleme, derleme zamanı tür güvenliğini korurken dinamik dillerin esnekliğini sunar. Derleyici, türlerin arayüz değerleri olarak kullanılmasına izin vermeden önce gerekli yöntemlere gerçekten sahip olduklarını doğrular.

challenge icon

Görev

Kolay

Ördek tiplemesinin işleyişini gösteren bir mesajlaşma sistemi oluşturalım. Hiçbiri uyguladığını açıkça bildirmeden, ortak bir arayüz üzerinden mesaj gönderebilen tamamen ilgisiz türler oluşturacaksın.

Kodunu üç dosyaya ayıracaksın:

  • messengers.go: Aynı davranışı tesadüfen paylaşan, birbiriyle ilgisiz üç yapı oluştur:
    • Phone, bir Number alanına sahip olacak. SendMessage(text string) string metodu SMS to [Number]: [text] döndürecek.
    • Computer, bir Email alanına sahip olacak. SendMessage(text string) string metodu Email to [Email]: [text] döndürecek.
    • Pigeon, bir Name alanına sahip olacak. SendMessage(text string) string metodu [Name] carries: [text] döndürecek.
    Bu türlerin hiçbirinin herhangi bir arayüzden söz etmediğine dikkat et. Sadece aynı metot imzasına sahipler.
  • sender.go: Bir Messenger metodu gerektiren bir SendMessage(text string) string arayüzü tanımla. Bir Broadcast dilimi ve bir mesaj dizesi alan, ardından her messenger üzerinde Messenger çağrısının sonucunu içeren bir dize dilimi döndüren SendMessage adlı bir işlev oluştur.
  • main.go: Ayrıntıları girdiden oku, her messenger türünden bir tane oluştur, bunları bir Messenger diliminde topla ve tüm messenger'lar üzerinden bir mesaj göndermek için Broadcast işlevini kullan. Her sonucu kendi satırında yazdır.

Aşağıdaki girdiler sağlanacak:

  • 1. satır: Telefon numarası
  • 2. satır: E-posta adresi
  • 3. satır: Güvercin adı
  • 4. satır: Yayınlanacak mesaj

Örneğin 555-1234, alice@mail.com, Winston ve Hello World verildiğinde çıktın şöyle olmalı:

SMS to 555-1234: Hello World
Email to alice@mail.com: Hello World
Winston carries: Hello World

Buradaki temel fikir, Phone, Computer ve Pigeon'ın hiçbir ortak yönünün olmamasıdır. Ortak bir temel türü paylaşmazlar ve Messenger'ı açıkça uygulamazlar. Yine de hepsi aynı şekilde "vakladığı" için (eşleşen metoda sahip oldukları için) Go, hepsinin Messenger değerleri olarak kullanılmasına izin verir. İşte ördek tiplemesi budur.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Telefon numarasını oku
	scanner.Scan()
	phoneNumber := scanner.Text()
	
	// Read email address
	scanner.Scan()
	email := scanner.Text()
	
	// Güvercin adını oku
	scanner.Scan()
	pigeonName := scanner.Text()
	
	// Yayınlanacak mesajı oku
	scanner.Scan()
	message := scanner.Text()
	
	// TODO: Her bir haberci türünden bir tane oluştur (Phone, Computer, Pigeon)
	
	// TODO: Tüm habercileri bir Messenger diliminde topla
	
	// TODO: Mesajı tüm haberciler aracılığıyla göndermek için Broadcast kullan
	
	// TODO: Her sonucu kendi satırına yazdır
	
	// Değişkenleri kullanmak için yer tutucu (uygularken kaldır)
	_ = phoneNumber
	_ = email
	_ = pigeonName
	_ = message
}
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