Menu
Coddy logo textTech

Örtük Uygulama

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

Java veya C# gibi birçok nesne yönelimli dilde, bir türün bir arayüzü uyguladığını implements gibi anahtar kelimeleri kullanarak açıkça bildirmeniz gerekir. Go farklı bir yaklaşım benimser: arayüz uygulaması örtüktür.

Bir tür, tüm yöntemlerini uygulayarak bir arayüzü karşılar. İlişkiyi herhangi bir yerde bildirmenize gerek yoktur. Derleyici bunu otomatik olarak belirler.

type Writer interface {
    Write(data string) int
}

type FileWriter struct {
    Filename string
}

// FileWriter örtük olarak Writer'ı uygular
func (f FileWriter) Write(data string) int {
    fmt.Println("Writing to", f.Filename)
    return len(data)
}

FileWriter üzerinde implements Writer bildirimi olmadığını fark et. FileWriter, arayüz imzasıyla eşleşen bir Write(data string) int yöntemine sahip olduğu için Writer arayüzünü otomatik olarak karşılar.

Bu tasarımın güçlü bir sonucu vardır: türler zaten mevcut olduktan sonra arayüzler tanımlayabilirsiniz. Üçüncü taraf bir kitaplık ihtiyacınız olan metotlara sahip bir tür içeriyorsa, özgün kodu değiştirmeden bu türün zaten karşıladığı bir arayüz oluşturabilirsiniz.

func Save(w Writer, content string) {
    w.Write(content)
}

func main() {
    fw := FileWriter{Filename: "data.txt"}
    Save(fw, "Hello!")  // FileWriter, Writer'ı karşıladığı için çalışır
}

Örtük uygulama, Go kodunu bağımlılığı azaltılmış ve esnek tutar. Türlerin arayüzleri önceden bilmeleri gerekmez; bu da bağımsız parçalardan sistemler oluşturmayı kolaylaştırır.

challenge icon

Görev

Kolay

Go'da türlerin arayüzleri örtük olarak nasıl karşıladığını gösteren bir mesaj teslim sistemi oluşturalım. Bu ilişkiyi hiçbir zaman açıkça bildirmeden, aynı arayüzü karşılayan farklı messenger türleri oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • messengers.go: Tek bir Messenger yöntemine sahip bir Send(message string) string arayüzü tanımla. Ardından bu arayüzü örtük olarak karşılayacak iki struct oluştur:
    • EmailMessenger — bir Address alanı (string) ile
    • SMSMessenger — bir PhoneNumber alanı (string) ile
    Her struct, teslimatı açıklayan bir string döndüren bir Send yöntemine sahip olmalıdır. Struct'ların hiçbiri Messenger arayüzünü uyguladığını açıkça bildirmemelidir: Go, yöntem imzalarına göre bunu otomatik olarak anlayacaktır.
  • main.go: Herhangi bir DeliverMessage ve bir mesaj string'i kabul eden, ardından Messenger çağrısının sonucunu döndüren Send adlı bir işlev oluştur. Girdi üzerinden iletişim bilgilerini oku, her iki messenger türünü oluştur ve mesajları her biri aracılığıyla teslim etmek için işlevini kullan.

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

  • 1. satır: E-posta adresi
  • 2. satır: Telefon numarası
  • 3. satır: Gönderilecek mesaj

Send yöntemlerin şu biçimlerde string'ler döndürmelidir:

  • EmailMessenger: Email to [Address]: [message]
  • SMSMessenger: SMS to [PhoneNumber]: [message]

Örneğin alice@example.com, 555-1234 ve Hello! verildiğinde çıktın şu şekilde olmalıdır:

Email to alice@example.com: Hello!
SMS to 555-1234: Hello!

Buradaki temel çıkarım, DeliverMessage işlevinin herhangi bir Messenger kabul etmesi ve hem EmailMessenger hem de SMSMessenger türlerinin eşleşen bir Send yöntemine sahip olarak bu arayüzü karşılamasıdır. Hiçbir yerde implements anahtar sözcüğü yoktur: Go'nun örtük uygulama mekanizması her şeyi kendisi halleder.

Kendin dene

package main

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

// TODO: Herhangi bir Messenger kabul eden bir DeliverMessage fonksiyonu oluştur
// ve bir mesaj string, ardından Send çağrısının sonucunu döndürür

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	// Read email address
	email, _ := reader.ReadString('\n')
	email = email[:len(email)-1]
	
	// Telefon numarasını oku
	phone, _ := reader.ReadString('\n')
	phone = phone[:len(phone)-1]
	
	// Mesajı oku
	message, _ := reader.ReadString('\n')
	if len(message) > 0 && message[len(message)-1] == '\n' {
		message = message[:len(message)-1]
	}
	
	// TODO: E-posta adresiyle bir EmailMessenger oluştur
	
	// TODO: Telefon numarasıyla bir SMSMessenger oluştur
	
	// TODO: Mesajı her messenger üzerinden göndermek için DeliverMessage kullan
	// ve sonuçları 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