woman holding mirror

Inversion of Control (IoC)

Yazılım çerçevelerinin (framework) gelen isteği karşılarken bizim kodlarımızı çalıştırıp sonrasında tekrar kontrolü ele almasıdır.

Bir web uygulamasından örnek verecek olursak; HTTP isteğinin karşılanması esnasında routing, middleware gibi işlevler yazılım çerçeveleri (framework) tarafında yapılır ve istek günün sonunda bir middleware/controller seviyesine düşer. Ardından bizim kodlarımız çalıştırır ve gerekiyorsa oluşturduğumuz çıktıyı alıp yoluna devam eder. Yani ana akış kontrolü framework tarafından sağlanır.

Bu prensip ile kontrol tersine çevrilmektedir. Buna bağlı şekilde Dependency Inversion (Bağımlılıkları Tersine Çevirme) prensibi uygulanarak bağımlılıklarında tersine çevrilmesi mümkün olur. Yani birazdan bahsedeceğimiz bu prensipin faydalarına ek olarak bağımlılıkların tersine çevrilmesi ile edindiğimiz faydalar ile karşımıza çıkar.

Peki sorun neydi?

Soruna yine web tarafından (bu prensibin framework kullanılabilen tüm koşullarda geçerli olduğunu aklımızdan çıkartmadan) yaklaşacak olursak; her geliştirici HTTP isteğini karşılamak için kendi kodlarını yazıyor, aynı sorunları binlerce geliştirici kendi dünyasında çözmekle uğraşıyordu. Bu sorun isteğin yanıtlanması, işlenmesi vs. gibi tüm yerlerde mevcuttu. Aslında bu sorun her işlevde mevcuttu bu nedenle çözüm olarak; uygulamamıza dahil edebileceğimiz paket yazılımlar ve uygulamamızı üzerine inşa edeceğimiz frameworkler ortaya çıktı.

Yazılım çerçeveleri (framework) ile artık giderek standartlara uygun ve hatta kendi standartları olacak şekilde geliştirilmiş bir altyapıya sahip olduk. Bu sayede artık proje geliştirmek istediğimizde isteğin karşılanması vs. süreçleri yürütmesi için framework kullanmaya başladık. Artık herkesin kendi kodlarını yazması yerine ortak bir çatı altında toplanarak onu geliştirmek ve kullanmak herkes için çok daha iyi oldu. (Tam burada açık kaynak (open source) için yüzlerce övgü dolu cümle kurmak isterdim ama konuyu dağıtmamak adına yapmıyorum :))

Artık frameworleri kullanmaya başladık ve frameworkler gelen isteği karşılayıp bizim belirlediğimiz bir metod’a isteği gönderir oldular. Bizde controller adı verilen bu isteği karşılayan sınıflar/metodlar içerisinde ana işimize odaklanıp isteği nasıl karşılayacağız, yanıtını nasıl vereceğiz vs. sorularından kurtulmuş olduk.

İşte bu prensip frameworkun gelen isteği anlamlandırıp, tanımladığımız routelar ile eşleştirmesi sonucunda bizim kodlarımızı çalıştırıp, sonrasında yoluna varsa sunduğumuz çıktılar ile devam ettiği bu süreçte uygulanmaktadır.

Faydaları Neler?

Aslında bu konu hakkında söylenecek çok fazla şey var fakat özet geçmek gerekirse;

  • Uygulama katmanlarının birbirine bağımlılıklarını azaltır. (bu sayede başka bir framework geçmek vs. istediğimizde bu prensibin uygulanmadığı bir altyapıya göre çok daha az efor harcarız.)
  • Entegrasyon (integration) testleri yazmamıza imkan sunar. (Test yazılım geliştirmede ciddiye alınması gereken çok önemli bir konudur.)

Yaşasın frameworkler, yaşasın açık kaynak yazılımlar! Yalnızca tüketen değil, aynı zamanda üretip katkı sağlayan yazılım geliştirme kültürüne sahip günlere uyanmak dileğiyle…