RAII (Resource Acquisition Is Initialization idiom) - 1

Aşağıda gördüğümüz kod geleneksel kaynak erişim ve kaynakların iade edilmesine ilişkin bir örnek senaryodur. Burda 1 numaralı alanda kaynaklar ediniliyor sonra bu kaynaklarla belirli işlemler gerçekleştiriliyor ve ardından 2 numaralı alanda kaynaklar iade ediliyor.  Burada 2 tane senaryoya dikkat çekmek gerekiyor. Birincisi yazılım geliştiricisinin kaynaklarının iadesini UNUTMASI, ikincisi ise kaynakları iade etmeden exceptiona neden olunacak bir işlemin gerçekleşmesi ya da return edilmesi gibi durumlar. İşte bu noktada RAII devreye giriyor ve bu problemlerin çözümüne ilişkin bir senaryoyla karşımıza çıkıyor.


RAII idiyomu diğer bir değişle Resource Acquisition Is Initialization C++' ta popüler bir kaynak yönetim şekli. C++'ta sınıflara ilişkin nesneler yaratılırken constructor ile hayata gelir ve objenin ömrü bittiğinde destructor çağrılarak alınan kaynaklar teslim edilir. Çoğunlukla nesneler local scope içerisinde yaratılırlar ve scope'tan çıkıldığında (normal akışında, return veya exception) ömürleri de biter. Fakat bazı nesneler ise new anahtar kelimesi  ile oluşturulur ki heap'de dinamik hafıza alanında yer tahsis edilerek oluşturulur. Ve delete anahtar kelimesi ile destructor çağrısı yapılarak kaynaklar iade edilir. Bu yaşam döngüsü RAII idiyomunun dışındadır. RAII ismi aslında idiyoma doğru bir karşılık gelen ifade değildir. Aslında idiyomun anlatmak istediği aşağıdaki gibi bir isimlendirme ile daha doğru olarak karşılanacaktır.


Artık isimlendirme bu şekilde yapıldığı için RAII'yi kullanmaya devam edeceğiz ama idiyomu doğru anlamak içinse yukarıdaki isimlendirmeleri de bir kenara not edelim.

RAII'nin faydaları:

  • Exception Safety: exception safe bir kaynak yönetimi sağlamaya olanak sağlayacaktır.
  • Clean Code: kaynakların tahsis edilmesi ile iade edilmesi aynı sınıf içerisinde gerçekleşeceği için temiz bir kod yazımına olanak sağlayacaktır. 
  • Encapsulation: kaynakların yönetimi her sınıfın kendi içerisinde ve dışarıdan erişimi mümkün olmadan sağlandığı için bir encapsulation sağlayacaktır.


Yukarıdaki sınıfa bakarsak artık dosya kaynağına erişim constructor ile gerçekleşiyor, destructorda dosyanın kapatılarak kaynakların iadesini gerçekleştiriyor.


Bu sayede kaynağa erişim sağlayan kodun kaynak yönetimi encapsulation edilmiş oluyor ve kullanıcı tarafta temiz bir kod yazılmasını, dışarıdan kaynak yönetilmesine ihtiyaç kalmadan gerçekleştirilmiş oluyor. Bu konuya ilişkin bir sonraki yazımızda ise exception ve RAII ilişkine değinen yazımızı yazacağız.