Entering Protocol Oriented Programming with Swift

Bahadır Seyfi
4 min readMay 13, 2021

Yazımda Protocol Oriented Programming mantığına geçmeden önce Swift dilinde protokollerin genel amaç, kullanım ve faydalarından bahsedeceğim. Tabi protokol odaklı programlanın bize sunduğu faydaları görebilmek ve anlayabilmek için nesne yönelimli programlama mantığını özümsemiş olmanız gerekir.

Protokol nedir diye başlayan ilk soruya; Java veya başka dillerden aşina olduğumuz Interface(Arayüz) cevabı verilebilir. Inheritance(kalıtım) kavramı, senaryolar oluştururken ve yazdığımız kodları düzenlerken güçlü bir rol oynar. Swift dilinde ise bu kalıtımı ve daha fazlasını protokollerin avantajlarını kullanarak yaparız.

Bir oyun tasarladığımızı düşünelim, burada oyuncunun bilgilerini tutuyoruz. Oyunumuzdaki silah özelliğini aktifleştirdik ve kurşun, silah ismi bilgileri ekledik.

Şimdilik bir sıkıntı yok gibi gözüküyor ancak oyunumuza çok talep geldi ve ekibimiz büyüdü. Araba eklentisini de koymak istiyoruz, buradaki yığılma gittikçe artar. Bizim, kod tasarımlarımızı bir uzay aracı gibi düşünerek kod karmaşıklığının önüne geçmek için modüllere ayırmamız gerekir.

Kodlara baktığımızda, oluşturduğumuz struct yapısına eklediğimiz protokollerimiz sayesinde daha modüler bir yapı oluştu. İleride oyuncumuzun arabası için renk değiştirme özelliği gelirse ilgili protokole ulaşıp bu müdahaleyi yapmak da bir o kadar kolaylaştı.

Swift’in güçlü bir özelliği protokolleri extend edebilmektir. Protokollerin kullanımının projemizde güçlendirilebilmesi ve protokol odaklı bir yazım için her bir birimi ufak ufak protokollere bölerek modülerliği arttırmamız gerekir. Yukarıdaki örnekte gördüğümüz gibi, her bir modülümüzü yapıya ekleriz. Eğer bir fonksiyon veya sabiti unuttuysanız merak etmenize gerek yok, Xcode size hemen kırmızı ışığı yakarak eksiklikleri tamamlar.

Protokollerimizi extend ettik, artık Player’ımıza sadece Person protokolümüzü extend etmemiz yeterlidir. Böylece birden çok protokolü de tek bir protokol çatısı altında toplayarak daha düzenli bir yapı kurduk. Tabi bu her senaryo için tavsiye edilen yazım şekli değildir. Yazımın konusu protokoller olmadığı için alt konulara ve protokol kullanımları hakkında detaya inmeyeceğim.

Kodlar üzerinden konuşmanın bu soyut konuyu biraz daha somut hale getirmeye yardımcı olacağını düşündüğüm için bir yapı kurguladım. Gelin yazdığım basit kodları biraz inceleyelim.

Şirketleri içeren bir yapı kurmak istedik ve birçok farklı firmanın bu yazılımdan faydalanacağını düşünelim. Bu yazılımı kullanacak şirketlerin içerisinde kuyumculardan tutun yazılım firmalarına kadar farklı özellik ve dinamiklere sahip firmalar var. Peki bizim kurduğumuz bu yapıda kuyumcu dükkanının IT ekibi olması durumu da var mı? Evet, sadece ilgili değişkene “true” yazmanız yeterli bunun için. Kurduğumuz bu yapı, yazılımımızın en temel hali. Gün geçtikçe dallanıp budaklanan ve içinden çıkılması zor olan bir hal alacak ve birçok farklı hatalarla karşılaşacağız. Aynı senaryonun benzerini ise protokoller yardımı ile simüle edelim.

Buradaki yapıya bakınca bir subclass yerine protokolleri kullanarak daha sade bir yazıma ulaştık ve henüz extensionların ve protokollerin bizlere sunduğu birçok güçten faydalanmadan anlaşılır bir kod yazmış olduk. Böylelikle her yapı kendisini ilgilendiren değişken ve özelliklere erişebilir hale geldi. Şirket yapısının en temel halini bir katman olarak aldık ve genişleterek devam ettik. İstediğimiz değişken veya fonksiyonu ulaşılmaz hale getirip hatalarla karşılaşma olasılığımızı minimuma indirdik.

ÖZET

Protokol yönelimli programlama ile nesne yönelimli programlamayı kıyaslama hatasına düşmemeliyiz. Lazım olduğu durumlara göre case’lere ayırıp ihtiyaç belirlenmesi ve o ihtiyaca göre hareket edilmesi en güzel yoldur. Bu iki yönelim bir sürü şart, koşul ve duruma göre birbirileri arasında avantaj ve dezavantaj doğuruyor. Örnek olarak biz bir protokolün içerisinde stored variable tutamazken ihtiyacımız olduğu bu anda sadece pattern uygulamak adına farklı yollara başvurmamalıyız. Bu durumda inatlaşmadan inheritance kullanarak belki sorunumuzun kolayca üstesinden geleceğiz.

Son olarak, kod yazmaya başladığımızda direkt bir protokol yazmaya çalışmamalıyız. Bu bir yaklaşımdır ve her yaklaşım her sorun için doğru çözüm yolu değildir. Nesne yönelimli, fonksiyonel programlama gibi birçok farklı yaklaşımlar bizlerin sorunlarımıza yaklaşma biçimini belirler ve hepsi tek bir amaca hizmet eder: bizlere…

Bana ulaşmanız ve çalışmalarımı görmeniz için adreslerim:

LinkedIn : https://www.linkedin.com/in/bahadirseyfi/

GitHub: https://github.com/bahadirseyfi

Twitter: https://twitter.com/bahadirseyfi

Faydalı bulduğum protokol yönelimli programlama hakkında kaynakların linklerini bırakıyorum.

https://medium.com/geekculture/swift-5-how-protocol-oriented-programming-saves-your-apps-part-1-714db7d41b98

https://medium.com/geekculture/swift-5-use-protocols-to-take-your-code-to-the-next-level-a671972f2f2

https://www.raywenderlich.com/6742901-protocol-oriented-programming-tutorial-in-swift-5-1-getting-started

--

--