Golang Interface

Golang Interface kavramı

Merhabalar,

Golang’a yeni başlayanların anlamakta güclük çektikleri bir konudan bahsedeceğim oda interface kavramı.

Eğer başka bir dilde programlama ile uğraşmışsanız interface kavramına yabancı değilsinizdir.

Programlama için Interface nedir sorusuna türkçe cevap verecek olursak.

“Kendisini kullanacak sınıflar için yerine getirmeleri gereken metodları belirten bir kontrat gibidir” Cihat Altuntaş kaynak

Bir Cache objesi yazdığınızı düşünün bu objenin 2 adet fonksiyonu var Set ve Get tahmin edeceğiniz üzere Set data kaydetmek Get ise data almak için kullanılacak. Cache bilgileride memory’de tutulacak.Sınıfın adı da MemoryCache yapalım ve kodlamaya başlayalım.

Kodun çalışan haline buradan ulaşabilirsiniz.

Kodu yazdıktan sonra projenize dahil ettiniz tüm cache gereken yerlerde ilgili kodu çağırıp ayarladınız çokta güzel çalıştı fakat belirli bir zaman sonra cache’teki dataları redis’te saklamayı düşündünüz tekrar bir sınıf yazdınız.Bu kez adınıda RedisCache yaptınız şimdi yapmanız gereken tüm kodları revize etmek bulup değiştirmek.

Aradan zaman geçti memcache ve database içinde implementasyon yazdınız.Fakat bunun sonu yok ve kod taşınabilir değil her cache provider’ını değiştiğinizde kodunuzu revize etmeniz gerekiyor ve kodunuz taşınabilir değil . Projeden örnek bir kod.

Bu kodu yeni provider’e uyarlamak için editör de “find and replace” ile MemoryCache ile RedisCache kelimelerini değiştirebilirsiniz yada interface kullanabilirsiniz.

Örnek verecek olursak.

Bir tane sanal sınıf oluşturalım bilmeniz gereken interface’ler herhangi bir değer döndürmüyorlar sadece fonksiyon adlarını ve girdi,çıktı parametrelerini belirtiyorsunuz.

Şimdi MemoryCache sınıfını interface kullanarak yeniden yazalım.

Kodun çalışan haline buradan ulaşabilirsiniz.

Gördüğünüz gibi artık NewMemoryCache fonksiyonu artık Cache tipinde değer dönderiyor.Şimdi yazdığımız kodu kullanalım.

Şimdi tek yapmanız gereken projedeki kodunuzu Cache interface göre ayarlamak. Projede kodu kullandığınızda provider’e bakılmaksızın cache objesinin get ve set methodları kullanılabilinecek.Herhangi yeni bir provider eklemek istediğinizde Name,Set,Get fonksiyonlarını ve döndürecekleri parametreleri ayarlamanız yeterli.

Yazı interface kavramını anlatmakta ne kadar başarılı oldu bilmiyorum fakat özellikle golang’te uygulama yazarken girdi ve çıktılar için io.Reader,io.Writer kullanınca interface kullanımının kodunuzun ne kadar taşınabilir ve okunabilir yaptığını görünce çok seveceksiniz.

Yukarıdaki GetirOnu fonksiyonunun yeni hali şu şekilde olur

Gördüğünüz gibi GetirOnu fonksiyonu artık parametre olarak Cache interface alıyor ve cache providerin ne olduğu artık GetirOnu fonksiyonunu ilgilendirmiyor tek bildiği şey 2. parametre ile gönderilen cache objesinin Get methodunun olduğu ve bu methodun 2 parametre dönderdiği ilk parametre value ikinci parametrede error dönderiyor.

Gelecek Yazı İçin Not:

Bir sonraki yazıda golang’in temel kütüphaneleriyle interface kullanımından bahsedeceğim.Aşağıdaki kod örneğinde fmt.Println fonksiyonun BaseModel objesinin String fonksiyonunu nasıl çağırdığına bakabilirsiniz.

package main
import (
"fmt"
)
//BaseModel base model
type BaseModel struct {
name string
}
//String : php class'taki toString fmt.Println bu fonksiyon varsa çağırır !!! interface !!
func (m *BaseModel) String() string {
return "Name: " + m.name
}
func main() {
base := &BaseModel{name: "Base Model Object"}
fmt.Println(base)
}

Kodun Çalışan haline buradan ulaşabilirsiniz: https://play.golang.org/p/FeYBAnVxt0

Show your support

Clapping shows how much you appreciated A.Kadir Mutlu’s story.