Ö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.
Görev
KolayGo'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 birMessengeryöntemine sahip birSend(message string) stringarayüzü tanımla. Ardından bu arayüzü örtük olarak karşılayacak iki struct oluştur:EmailMessenger— birAddressalanı (string) ileSMSMessenger— birPhoneNumberalanı (string) ile
Sendyöntemine sahip olmalıdır. Struct'ların hiçbiriMessengerarayüzünü uyguladığını açıkça bildirmemelidir: Go, yöntem imzalarına göre bunu otomatik olarak anlayacaktır.main.go: Herhangi birDeliverMessageve bir mesaj string'i kabul eden, ardındanMessengerçağrısının sonucunu döndürenSendadlı 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
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi