Swift'te Protokol Yönelimli Programlama (POP) üzerine büyük bir vurgu yapılmaktadır. POP'nin ana fikri, mimariyi temel sınıflardan değil, protokollerden (arayüzler) başlayarak tasarlamaktır. Protokoller, davranışın birden fazla zincir aracılığıyla miras alınmasına esneklik sağlar ve kodun bağımlılığını azaltır.
Swift, protokollerin varsayılan uygulamalara (extensions aracılığıyla) sahip olmasına izin verir, bu da kod tekrar kullanımını sınıf hiyerarşilerine ihtiyaç duymadan teşvik eder. Klasik OOP, sınıflar arasındaki mirasa dayanır ve bu sadece tek bir miras zinciri ile sınırlıdır. POP, bu kısıtlamalardan kurtulmuş olup, kompozisyon ve genişletilebilirlik sunar.
Kod örneği:
protocol Drivable { func drive() } extension Drivable { func drive() { print("Öne doğru sürüş!") } } struct Car: Drivable {} let car = Car() car.drive() // Çıktı: Öne doğru sürüş!
Protokol uzantısına (extension) saklanan bir özellik (stored property) eklenebilir mi?
Cevap: Hayır, protokol uzantılarına saklanan (stored) özellikler eklenemez, sadece hesaplanan (computed) özellikler ve yöntemler eklenebilir. Örneğin,
// Hata! extension Drivable { var speed: Int = 0 // Derleme hatası: Uzantılar saklanan özellikler içeremez }
Hikaye
Büyük bir projede geliştiriciler, durum takibi için protokol uzantıları üzerinden saklanan özellikler eklemeye çalıştılar. Kod hata ile derlendi ve bu, sprint sırasında mimariyi yeniden tasarlama zorunluluğunu doğurdu; bu da kodun okunabilirliğini azalttı.
Hikaye
Projede çeşitli varlık türleri için bir temel sınıf oluşturuldu ve protokoller aracılığıyla çoklu miras kullanıldı. Bir geliştirici, uzantıdaki varsayılan uygulama davranışını karıştırdı ve bu yöntemi bir yapıda (struct) geçersiz kılmayı denedi. Sonuç olarak, yöntem çağrıları sırasını izlemek zorlaştı.
Hikaye
Modül ölçeklenirken, sorumlulukların ayrılması için protokoller kullanıldı, ancak POP konusunda deneyim eksikliği nedeniyle, geliştiriciler protokoller arasında açık bağımlılıklar sağlamadılar. Bu, kodun tekrarlanmasına ve büyük geliştirme ekiplerinde birden fazla uzantının birleştirilmesi sırasında arayüz çatışmalarına yol açtı.