Menu
Coddy logo textTech

Arayüz Bileşimi

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

Go, daha küçük arayüzleri birleştirerek daha büyük arayüzler inşa etmenize olanak tanır. Birçok metoda sahip tek bir büyük arayüz tanımlamak yerine, mevcut arayüzleri yeni bir arayüz tanımının içine gömersiniz.

type Reader interface {
    Read() string
}

type Writer interface {
    Write(data string)
}

// ReadWriter her iki arayüzü birleştirir
type ReadWriter interface {
    Reader
    Writer
}

ReadWriter arayüzü artık hem Read() hem de Write() metotlarını gerektiriyor. Her iki metodu da uygulayan herhangi bir tür, ReadWriter arayüzünün yanı sıra ayrı ayrı Reader ve Writer arayüzlerini de karşılar.

type File struct {
    Name string
}

func (f File) Read() string       { return "file content" }
func (f File) Write(data string)  { fmt.Println("Writing:", data) }

func Process(rw ReadWriter) {
    content := rw.Read()
    rw.Write(content)
}

func main() {
    f := File{Name: "data.txt"}
    Process(f)  // File, ReadWriter arayüzünü sağlar
}

Bu bileşim yaklaşımı, arayüzleri küçük ve odaklanmış tutar. İhtiyaca göre bunları karıştırıp eşleştirebilir, fonksiyonlarınız için kesin sözleşmeler oluşturabilirsiniz. Go'nun standart kütüphanesi, io.Reader ve io.Writer'ı birleştiren io.ReadWriter gibi bu deseni yaygın olarak kullanır.

challenge icon

Görev

Kolay

Arayüz bileşimini gösteren bir medya oynatıcı sistemi oluşturalım. Küçük ve odaklanmış arayüzler oluşturacak, ardından bunları tek bir türün karşılayabileceği daha güçlü bir bileşik arayüzde birleştireceksin.

Kodunu iki dosyada düzenleyeceksin:

  • media.go: Üç arayüz ve bunların tümünü uygulayan bir yapı tanımla:
    • Player metoduna sahip bir Play() string arayüzü
    • Recorder metoduna sahip bir Record(content string) string arayüzü
    • Hem MediaDevice hem de Player arayüzlerini birleştiren bir Recorder arayüzü
    • Bir SmartDevice alanına sahip ve gerekli tüm metotları uygulayan bir Name yapısı
  • main.go: Aynı SmartDevice yapısının farklı arayüz türleri üzerinden nasıl kullanılabileceğini gösteren işlevler oluştur:
    • Bir UsePlayer kabul eden ve onun Player metodunu çağıran Play
    • Bir UseRecorder ve bir içerik dizesi kabul eden, ardından Recorder metodunu çağıran Record
    • Bir UseMediaDevice ve bir içerik dizesi kabul eden, ardından hem MediaDevice hem de Record metodunu çağıran Play
    Cihaz adını ve içeriği girdiden oku, bir SmartDevice oluştur ve bunu üç arayüz türünün tümü üzerinden kullanmayı göster.

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

  • 1. satır: Cihaz adı
  • 2. satır: Kaydedilecek içerik

Metotların şu biçimlerde dizeler döndürmesi gerekir:

  • Play(): [Name] is playing
  • Record(content): [Name] recorded: [content]

Örneğin, MyPhone ve voice memo verildiğinde çıktın şu şekilde olmalıdır:

MyPhone is playing
MyPhone recorded: voice memo
MyPhone recorded: voice memo
MyPhone is playing

İlk iki satır, cihazın ayrı arayüzler (Player ve Recorder) üzerinden kullanıldığını gösterir. Son iki satır ise cihazın her iki yeteneği de gerektiren bileşik MediaDevice arayüzü üzerinden kullanıldığını gösterir. Tek bir SmartDevice yapısının, gerekli her iki metoda sahip olduğu için üç arayüzün tümünü karşıladığına dikkat et.

Kendin dene

package main

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

// TODO: Bir Player kabul eden ve onun Play metodunu çağıran UsePlayer fonksiyonunu uygulayın
// Play() metodunun sonucunu yazdırmalıdır

// TODO: Bir Recorder ve bir içerik dizesi kabul eden UseRecorder fonksiyonunu uygulayın
// Record(content) metodunun sonucunu yazdırmalıdır

// TODO: Bir MediaDevice ve bir içerik dizesi kabul eden UseMediaDevice fonksiyonunu uygulayın
// Record(content) ve ardından Play() metodunun sonucunu yazdırmalıdır

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	deviceName := scanner.Text()
	
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Verilen isimle bir SmartDevice oluşturun
	
	// TODO: Cihazı Player arayüzü üzerinden kullanın
	
	// TODO: Cihazı Recorder arayüzü üzerinden kullanın
	
	// TODO: Cihazı MediaDevice arayüzü üzerinden kullanın
	
	_ = deviceName
	_ = content
	fmt.Println("Implement the solution")
}
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