Javascript ile immutable ve mutable Mimarisi

Hakan Özdaşçı
3 min readSep 25, 2019

--

Immutable ve Mutable nedir?

immutable: Değer oluşturulduğunda, değiştirilemez.

mutable: Değer oluşturulduğunda, değiştirilebilir.

Neden Immutable ve Mutable mimarisini iyi anlamalıyız?

Yazılım geliştirirken kodlara hükmetmek istiyorsanız, çok basit görünse de bu konuya düşündüğünüzden daha fazla vakit ayırmalısınız. Çünkü geliştirme boyunca değişkenler arasında sürekli atama işlemleri yaparsınız. Bu atamaların ana mantığını kavrayamazsanız, bazı yerlerde çözümleyemediğiniz sorunlarla karşılaşabilirsiniz. İyi bir yazılımcı, yazdığı kodları interpreter (yorumlayıcı) gibi yorumlayabilmelidir.

Bu konudan önce Javascript’de veri tiplerini kavramalısınız. Bunları kısaca hatırlatacak olursak aşağıdaki gibidir.

Primitive (İlkel Tipler): string, number, null, undefined, boolean
Objects (Nesneler): Array, Function, Object Literal, String, Number, Boolean

Primitive tipler immutable olmasına karşın, Objeler mutable olarak çalışırlar.

Immutable (Değişmez)

Bir veri oluşturulduğunda, bu veri bir daha değiştirilemez demektir. Yani değişkene bir değer atadığınızda veri ram’de oluşturulur ve her yeni atamada ramde yeni bir alana yazar veriyi.

Örneğin;

Immutable (Değişmez) Mimarisi Grafiksel Gösterim
Immutable (Değişmez) Mimarisi Grafiksel Gösterim

Yukarıdaki resimde a değişkenine 1 (var a = 1) atadık. Sonrasında a değişkeninini b değişkenine (var b = a) atadık. Normalde b değişkeni, a değişkenine referans (aynı adresi gösterme) olmalıydı ama burada öyle davranmayıp, hafızada b için yeni bir yer açtı. En sonunda a değişkenine 3 rakamını (a = 3) atadık. Burada da dikkat ederseniz hafızada yeni bir alan oluşturuldu. Çünkü primitive tipler her zaman için böyle davranmaktadır. Bu yapı tam olarak immutable mimarisini anlatmaktadır. Buna aşağıdaki kodlar üzerinden örnek verelim.

var a = 1 // Primitive bir Number ataması yapıldı
var b = a // Primitive bir Number değişken değeri ataması yapıldı
a = 3 // Primitive bir Number ataması yapıldı
console.log(a) // Çıktı: 3
console.log(b) // Çıktı: 1

İstisnalar:
Primitive tiplerin Wrapper (kapsayıcı) türleri (String, Number, Boolean) obje olmalarına karşın immutable davranırlar. Obje üzerindeki mevcut veri değiştirilemez ancak yeni metod veya değişken atanabilmektedir. Kendiniz deneyerek mantığı görebilirsiniz. Kafa karıştırmamak için bu konuya değinmeyeceğim.

Mutable (Değişir)

Bunlar referans bazlı çalışan veri tipleridir. Yani değişkene bir değer atadığınızda ramde oluşturulan veri, ilgili değişkene bağlanır. Değişkenle ilgili her yeni işlem yapıldığında, ram’de varolan verinin üzerine yazılır. Object türündeki bir değişkeni, başka bir değişkene atadığınızda, ilgili değişkenin adresine referans (ilgili adrese bağlı) olacaktır. İlk değişken içeriği değiştinde, ikinci atanan değişken içeriği de değişecektir.

Mutable (Değişir) Mimarisi Grafiksel Gösterim
Mutable (Değişir) Mimarisi Grafiksel Gösterim

Yukarıdaki grafikte a obje türünde bir değişkendir. b değişkenine a atanarak, b de objetüründe bir değişken olmuştur. Bu atama referans şeklindedir. Çünkü a nesne (object literal) bir yapıdadır. a değişkeni içeriği değiştiğinde, b içeriği de değişecektir.

Örneğin;

var a = {x:1} // Obje türünde bir atama
var b = a // Obje olduğu için referans türlü bir atama
console.log(a.x) // Çıktı:1
a.x = 2 // İçerik değişte, b değişkeni içeriği de değişti
console.log(b.x) // Çıktı: 2

İstisnalar:
a = {y:3} şeklinde atama yapsaydınız, bu yeni bir atama olacaktır ve a değişkeninin bağı {x:1} değeri ile kopacaktır ve artık a üzerinde yapılan değişiklikler b değişkenini etkilemeyecektir. Eşitlik ( = ) atamaları sadece obje türündeki bir değişkenin, başka bir değişkene atamasında referans olmaktadır. Yeni bir value olduğunda her zaman için hafızada yeni bir alan açarlar.

Immutable tipler, mutable tiplerden daha performanslıdır. Yani daha hızlı çalışırlar. Çünkü önceki değer ile ilgili bir kontrol yapmaz ve veriyi direk ram’de bulduğu boş alana yazar. Performans kaygınız olduğunda bu tür durumları dikkate alarak uygulamanızda iyileştirmeler yapabilirsiniz.

Yukarıdaki bilgiler internetten farklı kaynaklardan edinilen tecrübeler sonucunda spontane bir şekilde yazılmıştır. Tüm hakkı saklıdır.

--

--