← Tüm yazılar

Fonksiyonel programlama nedir ve neden önemlidir?

Burncode Team 3 dk okuma

Fonksiyonel programlamadan çoğu zaman dil teorisyenlerine yönelik akademik bir egzersizmiş gibi bahsedilir. Bu üzücü, çünkü arkasındaki temel fikir son derece pratiktir: Kodunuzda beklenmedik şekilde değişebilecek şeyler ne kadar azsa, peşinden koşacağınız hatalar da o kadar az olur. Hepsi bu. Gerisi ayrıntı.

Temel fikir: saf fonksiyonlar

Saf fonksiyon, aynı girdi verildiğinde her zaman aynı çıktıyı döndüren ve bunu yaparken kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyondur. Global bir değişkeni değiştirmek yok, veritabanına yazmak yok, günün saatine bağlı olmak yok. Sadece girdi girer, çıktı çıkar, başka hiçbir şey olmaz.

Bunu nesne yönelimli bir kod tabanındaki tipik bir fonksiyonla karşılaştırın: Veritabanından okuyabilir, paylaşılan bir nesneyi değiştirebilir, bir şeyleri loglayabilir ve bir değer döndürebilir. Aynı anda dört farklı iş; her biri ters gidebilir ve hiçbiri fonksiyonun çağrıldığı yere bakarak anlaşılmaz.

Değişmezlik: değişmeyen veriler

Fonksiyonel programlama ayrıca büyük ölçüde değişmez verilere dayanır: Bir değeri oluşturduktan sonra onu yerinde değiştirmezsiniz. Değiştirilmiş bir sürümüne mi ihtiyacınız var? Bunun yerine yeni bir tane oluşturursunuz. Alternatifi düşünene kadar bu israf gibi görünebilir: Verilerin on farklı yerden değiştirilebildiği bir kod tabanında, bir hataya hangisinin yol açtığını bulmak onunu da kontrol etmek demektir. Verilerin oluşturulduktan sonra değiştirilemediği bir kod tabanında ise bu hata kategorisi basitçe var olmaz.

Bunun günlük işlerde gerçek önemi

  • Test etmesi daha kolay. Saf bir fonksiyon, girdilerinin ötesinde hiçbir hazırlık gerektirmez: Veritabanını mock'lamak yok, şimdiki zamanı taklit etmek yok. Fonksiyonu çağırır, çıktıyı kontrol edersiniz.
  • Anlaması daha kolay. Bir fonksiyonun ne yaptığını, verilerine başka nelerin dokunduğunu görmek için kod tabanının geri kalanını takip etmeden, sadece okuyarak anlayabilirsiniz.
  • Daha güvenli eşzamanlılık. Eşzamanlılık hatalarının büyük bir kısmı, iki farklı şeyin aynı veriyi aynı anda değiştirmesinden kaynaklanır. Değişmez veriler bu hata sınıfını yapısal olarak imkânsız kılar.
  • Daha öngörülebilir hata ayıklama. Durum beklenmedik şekilde değişemediğinde, “Bu değer neden değişti?” sorusunun olası cevap listesi çok daha kısalır.

Fayda görmek için “fonksiyonel bir dile” ihtiyacınız yok

Haskell ve Clojure gibi diller baştan sona fonksiyonel programlama üzerine kuruludur, ancak bu fikirlerden gerçek değer elde etmek için dil değiştirmeniz gerekmez. JavaScript, Python, Java ve modern dillerin çoğu saf fonksiyonlar yazmayı ve mantıklı olduğu yerlerde verileri değişmez olarak ele almayı destekler. map, filter ve reduce gibi dizi metotları kılık değiştirmiş fonksiyonel programlamadır ve geliştiricilerin çoğu bunları böyle düşünmeden sürekli kullanır.

Buradan çıkarılacak pratik sonuç “Her şeyi fonksiyonel olarak yeniden yazın” değil. Sonuç şu: Tasarımı zorlamadan bir fonksiyonu saf, verilerini değişmez yapabildiğiniz her yerde bunu yapın. Beklemediğiniz bir yerde değişen durumların hatalarını ayıklamaya ölçülebilir şekilde daha az zaman harcarsınız.

Geliştirdiğimiz özel yazılımlarda bu ilkeleri özellikle uyguluyoruz, çünkü test etmesi ve anlaması daha kolay olan kod, canlı ortamda daha az bozulan koddur. Bu da bir müşteri için yayından altı ay sonra, ilk güne göre çok daha fazla önem taşır.