Yazılım Geliştirme Trendleri 2017/14: Nesne Temelli Programlamada Event Driven Design

Mustafa Ekim
3 min readAug 20, 2017

--

Nesne temelli programlamada, bir nesne temel olarak 2 bölümden oluşur. Nesnenin değişkenleri (variables) ve nesnenin metodları.

  • Nesnenin değişkenleri, nesnenin durumunu (state) saklamak için kullanılır. Ancak, nesne değişkenlerinin başka nesneler olması durumunda, nesnemizin becerileri de zenginleşebilir.
  • Nesnenin metodları ise, o nesneye beceriler ekler. (Tavşana kaçmayı, tazıya tutmayı öğretiriz)

Ancak bu tasarım süreci tamamen bir öngörü üzerine inşa edilir. Öngörülerimiz ile zaman içinde ortaya çıkan ihtiyaçlarımız örtüşmemeye başladığı zaman da, tasarımımız çatlamaya başlar. Bir süre yamalar ile süreci götürmeye çalışırız. Sonunda hazin son bizi bulur. Ortaya çıkan yeni gerçekler çerçevesinde, nesnemizi yeniden tasarlarız ve bu da tüm projemizde bir domino etkisi ile yönetilmesi zor ve sancılı değişimlere sebep olur.

Bu yüzden, en başından, esnek nesneler tasarlamalıyız. Bugüne kadar bunu başarmak için neler yaptığımıza bir bakalım:

  1. Polymorphism, interface, abstraction kullanımı: Nesnelerimiz kesinlikle daha esnek oldu. Birçok design pattern, interface kullanarak daha esnek nesneler tasarlayabilme amacıyla yol gösterici olarak ortaya çıktı. (Örnek: strategy pattern)
  2. Dependency Injection: Nesnelerimize dışardan başka nesneler enjekte ederek, enjekte ettiğimiz nesneler üzerinden, bizim nesnemizin nasıl davranacağını belirledik. Örneğin dışardan bir Logger nesnesini, nesnemize enjekte ettik. Nesnemiz de, bu logger objesinin tam olarak ne yaptığını bilmese de, onu gerekli hallerde çağırdı vb. (Bu madde de, 1. madde kapsamında değerlendirilebilirdi ancak Dependency Injection üzerinde ayrıca durmak istedim çünkü DI, modüler nesne temelli programlamada en başarılı tasarımlara imkan veriyor)
  3. Callbacks: Callback, nesnemizin bir metodunun, dışarıdan bir fonksiyonu parametre olarak alması şeklinde özetlenebilir. Callback üzerine bir tasarım gerçekleştirdiğimizde, nesnemizin birçok durumda ne yapacağını, dışarıdan alacağı bir fonksiyon aracılığıyla belirleyebildik. Örneğin “Araba” nesnemizin “hızlan” metodunu, hızını hangi fonksiyona göre ivmelendireceğini dışarıdan belirleyebildik.

Görüldüğü üzere, her 3 yöntemde ile de, daha esnek bir nesneye sahip olduk ancak yine de nesnemiz belli öngörüler üzerine inşa edildi.

  • Örneğin 2.maddede, nesnemize dışardan bir Logger objesi enjekte edileceğini öngördük ve buna göre bu objenin belli metodlarını, nesnemizin içinde kullandık. Nesnemiz, kendisine enjekte edilen Logger objesinin becerileri ile zenginleşmiş olsa da, nesnemizin iç tasarımı ile Logger objesi arasında sert bir bağ kurmuş olduk. (coupling)
  • Örneğin 3.maddede, nesnemize yeni metodlar tanımlarken, callback’leri de öngörmemiz ve bu callback fonksiyonlarını metodun içinde nerelerde çağıracağımızı programlamalamız gerekti.

Event Driven Design

Event Driven Design, nesne temelli programlamadan ayrı bir paradigma olsa da, her iki paradigmayı birleştirerek çok daha esnek nesneler tasarlanabiliyor. Bunu yapabilmek için,

  • nesnemiz bazı durumlarda “event” ler fırlatacak.
  • nesnemizin dışında, bu “event” ler fırlatıldığı zaman ne yapacağımızı programlayacağız.
NodeJS, OOP + Event Driven Design

Örnekteki WithLog nesnemizin tek bir metodu var: execute. Ve bu metod, kendini gerçekleştirirken bazı “event”’ler fırlatıyor: “begin”, “end” ..

Objemizin dışında ise, bu event’ler gerçekleştiriğinde ne yapacağımızı programlıyoruz.

Bu yöntem ile, nesnemiz ve dış dünya arasında bir abstraction layer üzerinden bağlantı kuruyoruz. Nesnemiz kendi içinde neler olduğunu söylüyor. Ancak ne yapacağımıza ilişkin hiçbir şey söylemiyor. Birşey yapmak, birşey yapacak isek ne yapacağımız veya birşey yapmamak tamamen nesnenin kontrolünün dışında kaldı.

Daha önce Asyn programlama trendine ilişkin bir yazı kaleme almıştım. Şimdi bu iki tasarımın nasıl iç-içe geceğini düşünelim:

Async programlama, bir fonksiyonu çağırmak ve sonrasında o fonksiyonun bizi geri çağırdığında ne yapacağını belirlemek üzerine kuruluydu. Şimdi ise aynı yöntemi, bu sefer “event” ler fırlatarak elde edebiliyoruz.

NodeJS, OOP, Event Driven Programming, Async

Yukarıdaki örnekte 3 paradigma birlikte kullanılmış:

  • Object Oriented Programming
  • Async
  • Event Driven Programming

Sağladığı esneklik, Async oluşu ve kodun algılanmasındaki kolaylık açısından, önümüzdeki dönemde bu tür yaklaşımların çok daha yaygınlaşacağını tahmin ediyorum.

**

Eğer sıfırdan yazılım kariyerine başlamak istiyorsanız, 3 aylık yoğun programlar düzenliyorum. Bilgi için: https://www.yenikodyazilimkursu.com/

Test Invite online sınav sistemi ile tanışın: İşe alım sınavları, Genel Yetenek Testleri ve İngilizce Seviye Tespit Testleri

Video kayıtlı ve zorunlu tam ekran ile güvenli online sınavlar yapmak için: https://www.testinvite.com/lang/tr/online-sinav-sistemi.html

--

--

Mustafa Ekim

Software Developer & Trainer. Entrepreneur & Founder of TestInvite Exam Software — https://www.testinvite.com