Kodlamaya Yaklaşımını Seç: DRY mi? WET mi?
S.A. Arkadaşlar,
Uzunca bir süredir üzerinde düşündüğüm bir konu olan bazı kodlama yöntemlerinden bahsetmek ve bu konuda hem kendi fikirlerimi, hem de konu üzerinde tartıştığımız arkadaşlarımın fikirlerini toparlayıp paylaşmak istedim. Kıvılcımı ilk çakan Osman Yavuz’ a bu konuda özel bir teşekkür geçmeliyim. Birlikte bilgilerimizi paylaştığımız discord kanalımızda kendisi güzel bir soru ile geldi. Konu bu şekilde ortaya çıktı. Soruyu/konuyu genelleştirmek gerekirse eğer, bir yazılım geliştirirken, yazılımı hangi 'ölçüde' parçalara bölmek doğru bir yaklaşım olurdu? Aşağıda belittiklerim tamamen kendi düşüncelerimdir. Bu konuda her türlü fikre açık olduğumu tekrar anımsatmak isterim. Hazırsak başlayalım. :)
Aslına bakıldığında soru her ne kadar React teknolojisi özeli ile ilgili de olsa da genel bir yazılıma yaklaşım sorusuydu aslında. Şöyle ki, elimizde birbirine benzeyen 2 metodumuz var. Bu iki birbirine benzeyen metodu tek bir metod haline getirmeli miyim? Bu şekilde yapılınca de metodun öngörülemeyen bir şekilde yönetilmesi zorlaşıyor. Bu durumu sizler nasıl yönetiyorsunuz?
Bu konuyla ilgili fikrini belirten ve benim de cevabıyla yazı yazmama vesile olan Önder Bakırtaş’a teşekkür ederim. DRY ve WET kavramlarını yazının derinliklerine girmeden verebiliriz.
DRY — Don’t repeat yourself — Çok bilinen kendini tekrar etme yönteminin asıl amacı kod tekrarını azaltmaktır.
WET — Write everything twice — DRY’a karşı ortaya çıkmış gibi gözükse de gerçekte sıkı sıkıya DRY yöntemine bağlı kalmanın gereksiz olduğunu savunmaktadır.
Açıkçasını söylemek gerekirse WET yönteminin insanlar tarafından net anlaşılmadığını düşünüyorum. Bunun sebebi bu yöntemi tamamen yanlış olarak görmeleridir, fakat dikkatli incelediğimizde burada söylenmek istenen şey genel metodları parçalamak ve bunları birer kez kullanmanın mantıklı, fakat daha özel noktalarda bunları illa soyutlamaya gerek olmadığını savunmaktadır. Başka bir yerde kullanılacaksa oraya da “copy-paste” ile koyup gerekli değişiklikleri yapmamız gerektiğini, eğer ki bu 3.defa tekrarlanırsa işte o zaman DRY yöntemini kullanmaya başlamamızı önermektedir.
Öncelikle konuya kendimi fikrimi belirterek gireyim. Aynı kodu kopyalamak mı yoksa metoda bir parametre daha geçerek ona bir şekilde (if veya başka bir şekilde) 2 iş yaptırmak mı? 2 yaklaşımın avantaj ve dezavantajları muhakkak vardır. 1.yöntemde her ne kadar “copy-paste” olayına düşme ihtimali bulunsa da 2.yöntem de SOLID’ın Single Responsibility prensibine ters düşmektedir. Öncelikle bunu net bir şekilde ifade etmek faydalı olacaktır.
Farklı bir çözüm olarak da, belki yukarıdaki 2 yöntemden daha mantıklı, 3.bir private metod yapıp her iki metod içerisinde benzer olan kodları buraya taşıyabilir ve bu şekilde hem “copy-paste” yönteminden kurtulmuş oluruz, hem de Single Responsibility prensibine de uygun şekilde kod yazmış oluruz. Bu en makul çözüm gibi gözükse de metodları çok küçük parçalara bölmenin de yönetebilme maliyeti muhakkak olacaktır.
Benim bu konuda naçizane söyleyebileceğim bu işin net bir doğrusu olmadığıdır. Bunu da bir örnekle açıklamak gerekirse, matematikte bir konuyla ilgili 3 formül bildiğimizi varsayalım fakat hangisini nerede kullanacağımız bizim o konudaki bilgi, becerimiz ve egzersiz alışkanlığımıza bağlıdır. İşte tam da bu noktada bu tarz bir problem ile karşılaştığımızda bunu bu şekilde yönetmek en makul yöntem olacağı kanısındayım.
Burada üzerinde durmamız gereken başka bir konu da: “Attığımız taş ürküttüğün kuşa değecek mi”. Bu da başlı başına önemli bir konu olarak karşımıza çıkmaktadır. Bir işi çözebilmenin birçok yöntemi elbette mevcuttur, fakat içinde bulunduğumuz şartları en iyi kendimiz biliriz ve buna uygun bir yöntemi seçmek de çok önemlidir. Bu konu, kendisinden çok şey öğrendiğim, Uygar Manduz ile sık sık üzerinde konuştuğumuz bir konudur. Her zaman en iyi yöntem o an için en doğru yöntem olan olmayabilir. Neden mi? Biraz uç bir örnek olacak ama bir yazıda okumuştum, yanlış hatırlamıyorsam Hepsi Burada ekibinden bir arkadaştı, canlı ortamda patlayan bir kod var ve o kod için, o an bir koşul ifadesi yazılması gerekip hemen kodun canlıya alınması gerekiyordu, fakat kodu düzeltecek arkadaş bunun doğru bir yöntem olmadığını belirtiyor, takım lideri ise bu işi en hızlı şekilde çözüp tekrar bu konuya eğilebileceklerini söylüyordu. Bir de konuya bu açıdan bakmanın da çok önemli bir nokta olduğunu düşünüyorum.
Buralarda naçizane kendi fikirlerimi belirtirken bu konuyu farklı şekillerde ele alan ve fikirlerini de belirtip yazının olgunlaşmasında emeği geçen Ömer Faruk Şahin, Aras Yağmur ve İlter Köse’ye de teşekkürlerimi iletmeyi bir borç bilirim.
Ayrıca buradaki yazıya da göz atmanızı özellikle altındaki yorumları da okumanızı tavsiye ederim. Sizin de bu konudaki düşüncelerinizi okumaktan büyük bir keyif alacağımı da belirtmek isterim.
Yaptığımız işleri yapıp geçmekten ziyade onlara derinlemesine, durup düşünerek, kafa yormak, çabalamak dileğiyle.