JavaScript’te Side Effects, Pure ve Impure Functions

Mehmet Mutlu
Sahibinden Technology
3 min readJul 17, 2024

JavaScript ekosisteminde temel olarak bilinmesi gereken Side Effects, Pure ve Impure Functions kavramlarından bahsetmek istiyorum. Pure ve Impure Functions kavramları sürdürülebilirliği, yeniden kullanılabilirliği ve kod güvenirliğini sağlama konusunda önemli rol oynar. Bu yazımda da kavramların anlamlarını, farklarını ve oluşturabileceği etkileri örneklerle açıklamayı planlamaktayım. Öncelikle Side Effects kavramına değinip sonrasında Pure ve Impure Functions’tan bahsedeceğim.

JS’te Side Effects, Pure ve Impure Functions

Side Effects

Yazmış olduğunuz fonksiyonun kendi kapsamı dışındaki kodlara dokunması veya etki etmesi “Side Effects (yan etki)” doğurabilir. Bu nedenle de kodunuzun işlevini yerine getirme görevi etkilenebilir veya beklenmedik sonuçlara neden olabilir. Bir örnek ile açıklamak gerekirse:

let baseNumber = 5;

function addNumber(newNumber) {
return baseNumber += newNumber;
}

Örnekte olduğu gibi addNumber fonksiyonu içerisinde baseNumber değişkeninin kullanılması side effect’e neden olabilir. Olası side effect’leri ise şu şekilde değerlendirebiliriz:

Dependency issue (Bağımlılık sorunu):

Yukarıdaki örnekte addNumber fonksiyonu baseNumber’a bağımlıdır. Örneğin baseNumber gibi bir değişken olmadığı veya silindiği zaman addNumber fonksiyonu hata fırlatacaktır.

Modifying external code (Harici kod değiştirme):

addNumber fonksiyonu, kapsamı içerisinde tanımlanmayan baseNumber değişkenini değiştirdiği için side effect oluşturmaktadır. Bu değişim addNumber fonksiyonu dışındaki kodlarda beklenmeyen etkiler yaratabilir ve kodun takibi zor olabilir.

Becoming non-deterministic function (Deterministik olmayan fonksiyon haline gelme):

addNumber fonksiyonunun kendi kapsamı dışındaki bir değişkeni kullanması, onu deterministik olmayan bir fonksiyon haline getirir. Yani addNumber’ın çıktısı sadece o fonksiyonu okuyarak belirlenemez. Kullanmış olduğu kapsam dışı değişkene dışarıdan nasıl müdahaleler olduğunu kontrol etme zorunluluğu doğurur.

Pure Functions

Basitçe side effect’i olmayan fonksiyonlara “Pure Functions (saf fonksiyonlar)” diyebiliriz. Yani girdi olarak aldığı değerler ile öngörülebilir çıktı üreten ve dış kapsamda bulunan değişkenlere müdahale etmeyerek side effect üretmeyen fonksiyonlara verilen bir isimdir. Başka bir deyişle de her zaman aynı girdiler için aynı sonucu veren bir fonksiyondur diyebiliriz.

function addNumberPureFunc(baseNumber, newNumber) {
return baseNumber + newNumber;
}

addNumberPureFunc(1, 2); // 3

Örnekten de anlaşılacağı üzere addNumberPureFunc aldığı argümanlar ile side effect’e neden olmadan çıktı üretmektedir. Yani 1 ve 2 değerlerini argüman olarak alıp kapsam dışında bulunan herhangi bir koda müdahale etmeden 3 çıktısını vermektedir.

Pure Function’lar,

  1. Öngörülebilir davranışa sahiptirler. Başka bir deyişle her zaman aynı girdiler için aynı çıktıyı verirler.
  2. Kendi kapsamları dışındaki kodlara müdahalede bulunmazlar. Yani side effect oluşturmazlar. Bunun sayesinde de okunmaları, test ve debug edilmeleri kolaydır.
  3. Dış kapsamda bulunan değişkenin pure function içerisinde klonlanması, pure function’ı impure function yapmaz. Alttaki örnek bu madde içindir.
const baseArray = ["base", "array"];

function changeFirstItemOfArray(item, array) {
const clonedArray = [...array];
clonedArray[0] = item;
return clonedArray;
}

changeFirstItemOfArray("cloned", baseArray); // ["cloned", "array"]

Impure Functions

Bir veya birden fazla side effect içeren fonksiyonlara “Impure Functions (saf olmayan fonksiyon)” denir. Yani kendi kapsamları dışındaki kodlara müdahalede bulunup aynı girdiler için öngörülemeyen farklı çıktılar üretirler.

let baseNumber = 5;

function addNumberImpureFunc(firstNewNumber, secondNewNumber) {
baseNumber = 10;
return firstNewNumber + secondNewNumber + baseNumber;
}

Yukarıda da gözüktüğü gibi baseNumber değişkeni addNumberImpureFunc fonksiyonu dışında tanımlanmış bir değişken olmasına rağmen addNumberImpureFunc içerisinde değiştirilmekte ve bu durum da bir side effect’e neden olmaktadır.

Impure Function’lar

  1. Kendi kapsamları dışındaki değişkenlere müdahalede bulunup beklenmeyen etkiler yaratırlar.
  2. Kapsamları dışında tanımlanmış değişkenleri kullandıkları için aynı girdilerin sonucu olarak beklenmeyen farklı çıktılar üretirler.
  3. Kodu daha karmaşık hale getirerek anlaşılmasını, test ve debug edilmesini zorlaştırırlar.

JavaScript’in bazı build-in fonksiyonları da yapıları gereği impure function’dır. Bunlar:

  • Math.random(): Math.random fonksiyonu her çağrıldığında Math objesi içerisindeki internal state’i değiştirdiği ve her zaman farklı sonuçlar vereceği için impure bir function’dır.
  • console.log(): console.log fonksiyonu kullanıldığında console nesnesini state’ini değiştirdiğinden ve bir fonksiyon içerisinde kullanıldığında console nesnesine bağımlılık oluşturacağından dolayı impure function’dir.
  • alert()
  • Date.now()
  • Array.splice()
  • Array.push()
  • Array.sort()

Sonuç

Pure ve impure function’ların anlamlarını ve farklarını bilmek verimli ve sürdürülebilir kod yazmak için önemlidir. Genel olarak side effect üretip üretmediğine dikkat etmek bu ayrımı yapabilmek adına belirleyici olacaktır.

Genellikle pure function’ları kullanmak kodumuzu daha okunabilir kılmak adına önemlidir fakat sadece pure function’lardan oluşan kodlar yazmak pek mümkün değildir. Bu nedenle gerektiği (api calls, dom manipulation vs.) durumlarda impure function’lardan da faydalanmamız gerekir.

--

--