Swift ile Protokol Odaklı Programlama

Fatih Coskun
LCW Digital
Published in
4 min readJan 2, 2024

Giriş

Swift programlama dili, esnek, güçlü ve modern bir dil olmasıyla bilinir. Bu dilin sunduğu özelliklerden biri de Protokol Odaklı Programlama (POP) yaklaşımıdır. POP, nesne tabanlı programlamadan farklı bir paradigmaya işaret eder ve Swift dilindeki geliştiricilere daha temiz, daha esnek ve daha genişletilebilir kod yazma imkanı sunar. Bu makalede, POP’nin ne olduğunu, neden önemli olduğunu ve nasıl kullanıldığını keşfedeceğiz.

Nesne Tabanlı Programlama (OOP) ve Protokol Odaklı Programlama (POP) Arasındaki Fark

Nesne tabanlı programlamada, sınıflar ve nesneler temel yapı taşlarıdır. Oysa Protokol Odaklı Programlama, sınıfların yanı sıra protokollerin de öncelikli olduğu bir yaklaşımdır. Protokoller, belirli bir davranış setini tanımlayan ve sınıflar, yapılar ve enum’lar gibi Swift türleri tarafından uygulanan bir türdür.

Protokoller, birden fazla tür tarafından uygulanabilir olmaları ve varsayılan uygulamalar veya ilişkili türler gibi özellikleri desteklemeleriyle öne çıkar. Bu, kodunuzun daha esnek ve genişletilebilir olmasını sağlar. Ayrıca, birden fazla protokolü birleştirerek, farklı davranışları bir arada sunabilirsiniz. Bu, Swift’in çoklu miras eksikliğini giderebilen bir yaklaşımdır.

Protokollerde Varsayılan Uygulamalar

Protokol Odaklı Programlama’nın güçlü özelliklerinden biri, protokollerin varsayılan uygulamalara sahip olabilmesidir. Bu özellik, belirli bir protokolü uygulayan türlerin, protokolde tanımlanan metotları veya özellikleri özel bir uygulama yapmadıkları durumlarda otomatik olarak kullanılabilmesini sağlar.

protocol Logger {
func log(message: String)
}

extension Logger {
func log(message: String) {
print("Default Implementation: \(message)")
}
}

struct ConsoleLogger: Logger {
// Burada özel bir uygulama yapmamıza gerek yok!
}

let consoleLogger = ConsoleLogger()
consoleLogger.log(message: "Hello, POP!")

Bu örnekte, ConsoleLogger sadece Logger protokolünü uygular ve özel bir log metodu tanımlamaz. Ancak, varsayılan uygulama otomatik olarak çağrılır. Bu, kodunuzu daha az tekrar kullanılabilir ve daha temiz hale getirebilir.

Swift Standart Kütüphanesini Genişletme

Protokol odaklı programlama, Swift standart kütüphanesini genişletme ve mevcut tipleri güçlendirmek için güçlü bir araçtır. Var olan tipleri protokollerle genişleterek, bu tipleri yeni yeteneklerle donatabilir ve daha esnek bir kod yazabiliriz.

protocol AlertDisplayable {
func showAlert(title: String, message: String)
}

extension UIViewController: AlertDisplayable {
func showAlert(title: String, message: String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
}

class MyViewController: UIViewController {
func showCustomAlert() {
showAlert(title: "Success", message: "Operation completed!")
}
}

Bu örnekte, AlertDisplayable protokolü, showAlert adında bir metodu tanımlar. Bu protokolü UIViewController'ye genişleterek, tüm view controller'larımızda bu protokolü kullanabiliriz. Bu, tüm view controller'ların standart bir şekilde uyarı gösterme yeteneğine sahip olmasını sağlar.

Protokollerdeki Assoicate Types ve Generics Kullanımı

Protokoller ayrıca associated types ve generics kullanarak daha tip güvenli bir kodlama yaklaşımı sunar. Bu özellikler, belirli bir protokolü uygulayan türlerin, bu protokol tarafından tanımlanan ilişkili türleri (associated type) belirlemelerini sağlar.

protocol Container {
associatedtype Item
var items: [Item] { get set }
mutating func addItem(_ item: Item)
}
struct MyContainer<T>: Container {
typealias Item = T
var items: [T] = []

mutating func addItem(_ item: T) {
items.append(item)
}
}

var stringContainer = MyContainer<String>()
stringContainer.addItem("Hello")

var intContainer = MyContainer<Int>()
intContainer.addItem(42)

Bu örnekte, Container protokolü, Item adında bir ilişkili tür tanımlar. MyContainer yapısı bu protokolü uygular ve ilişkili türü T olarak belirler. Bu, farklı türlerdeki elemanları içeren genel bir konteyner oluşturabilmemize olanak tanır.

Protokol Odaklı Programlama’nın bu örnekleri, Swift dilinde daha temiz, daha esnek ve daha genişletilebilir kod yazmanın yollarını göstermektedir. Bu yaklaşım, özellikle büyük ve karmaşık projelerde, kodun daha sürdürülebilir olmasına olanak tanır.

Sonuç

Protokol odaklı programlama (POP), Swift dilindeki geliştiricilere nesne tabanlı programlamadan farklı bir bakış açısı sunar. Protokoller, kodunuzu daha esnek ve genişletilebilir hale getirir. Bu makalede, POP’nin önemini artıran özellikleri, kullanımını ve projelerinizde nasıl kullanabileceğinizi keşfettik.

Protokoller, tekrar kullanılabilirliği artırır ve projelerinizin genişlemesini kolaylaştırır. Varsayılan uygulamalar, belirli metotları veya özellikleri tanımlamayan türler için otomatik olarak devreye girebilir, bu da kodunuzu daha temiz ve anlaşılır hale getirir. Ayrıca, associated types ve generics gibi özellikler, protokollerin daha tip güvenli ve özelleştirilebilir olmasını sağlar.

Swift dilinde POP kullanmak, özellikle büyük ve karmaşık projelerde, kodunuzun daha bakımı kolay, genişletilebilir ve anlaşılır olmasını sağlayabilir. Bu yaklaşım, geliştiricilere daha fazla kontrol ve esneklik sunar, böylece yazılım projelerinizde daha başarılı olabilirsiniz.

Protokol odaklı programlamayı anlamak, sadece Swift dilinde değil, genel olarak yazılım geliştirmede daha iyi bir programcı olmanıza yardımcı olabilir. Bu konsepti öğrenmek ve projelerinizde uygulamak, kod kalitesini artırabilir ve gelecekteki geliştirmeler için sağlam bir temel oluşturabilir.

Makaleyi okuduğunuz için teşekkür ederim. Umarım, Protokol Odaklı Programlama’nın gücünü anlamanıza ve bu yaklaşıma uygun şekilde kullanarak daha etkili ve temiz Swift kodları yazmanıza yardımcı olacak bir paylaşım olmuştur.

Kaynak

--

--