Data-Oriented Programming(DOP) — Ufak Bir Giriş 2

İbrahim Kürce
4 min readAug 16, 2023

--

Yazının birinci bölümünü buradan okuyabilirsiniz.

Bölüm 2: Kod ve Veri Arasındaki Ayrım

DOP ile beraber yapacağımız ilk şey, koddan veriyi ayırmak olacaktır. Bu sayede, sistemimiz 2 parçaya ayrılır: veri varlıkları(data entities) ve kod modülleri(code modules).

Daha önceki yazıda bahsettiğimiz Kütüphane Yönetim Sistemi’nde bu ayrımı yapacağız. Bu sayede sistemimiz,

  • Sistem basit bir hal alacaktır.
  • Esnek ve genişletilebilir olacaktır.

DOP Sisteminin İki Parçası

OOP’de veri ve kod içiçe girdiğinden, çokça data(veri) kapsüllemeden(encapsulation) yararlanırız. Bu daha fazla karmaşaya yol açtığı için DOP’da bu kullanılmaz.

Fonksiyonel Programlama’da(FP) da benzer yöntemler kullanılsa da DOP prensipleri dil-bağımsızdır. Hem nesne-yönelimli dillerde hem de fonksiyonel programlama dillerinde uygulanabilir.

Veri, veri varlıkları tarafından gösterilir ve sadece üye değişkenleri tutmak için kullanılır. Kod ise fonksiyonlar olarak modüller altında toplanır ve durumsuzdur(stateless). Yani kod, herhangi bir nesnenin state’ine(durumuna) bağlı olmaz, ihtiyacı olan tüm veri varlıklarını argüman olarak alır.

Basit bir diagramla şöyle gösterebiliriz.

Veri Varlıkları(Data Entities)

DOP’da tasarıma veri varlıklarını arayarak başlarız. Veri varlıkları, sistemin bilgi tutar parçalarıdır. Bunun için sistemde geçen isim ve isim tamlamalarını araştırırız.

1. Katalog verisi

  • Kitaplar(Books)
  • Yazarlar(Authors)
  • Kitap öğeleri(Book items)
  • Kitap ödünçleri(Book lendings)

2. Kullanıcı Yönetim verisi

  • Kullanıcılar(Users)
  • Üyeler(Members)
  • Kütüphaneciler(Librarians)

Bunu görselleştirmek istersek,

Kod Modülleri

DOP’da tasarım aşamasının ikinci adımı, kod modüllerini tanımlamaktır. Bu sefer, sistemdeki fiil cümlelerini arayacağız.

  • Kitap aramak,
  • Kitap öğesi eklemek,
  • Üyeyi bloklamak / bloğu kaldırmak,
  • Kullanıcının sisteme giriş yapması,
  • Ödünç verilen kitapları listelemek,
  • Ödünç vermek,
  • İade almak,
  • Kullanıcı, kütüphaneci mi diye kontrol etmek

Fonksiyonaliteleri belirledik, şimdi bunların hangisini dış dünyaya açacağız buna karar verelim. Örneğin, API olarak HTTP üzerinden dışarı servis vermek isteseydik hangileri olurdu? Kullanıcının, kütüphaneci olup olmadığını kontrol etmek haricinde hepsi olurdu herhalde. Bunları Library modülü altında gruplarsak, şöyle olur.

OOP’de modül içinde sınıflar olması beklenirken, DOP’da modüller, durumsuz(stateless) fonksiyonların bir araya gelmesiyle oluşur. Mesela, Java’da bunun için statik metodlardan yararlanırız. Durumsuz metod/fonksiyon, hangi bilgi üzerinde çalışacaksa, onu ilk argüman olarak alır.

OOP’de kütüphanecinin bir üyeye ait ödünç veren kitapları listeleme metodunu ele alalım.

Bunu DOP’da şu şekilde yazarız.

Library modülünü tasarımını şu şekilde güncelleriz.

Sistemdeki high-level modüllerimizin genel görünümü de şöyle olur.

libraryData değişkeni Library modülüne argüman olarak verilir. libraryData.catalog ve libraryData.userManagement ise alt-modüllere argüman olarak geçilir.

DOP Sistemlerinin Anlaşılması Kolaydır

Veri, kendi yaşam döngüsünde yaşadığı için, sistemin anlaşılması daha kolay olur. Sistemin genel veri diagramı şöyledir.

Modüllerin de aynı şekilde anlaşılması kolaydır.

Modüller arası dikkat edilirse, tek bir ilişki biçimi vardır: kullanım(usage) ilişkisi. Bir modül, diğer modülün kodunu kullanır. Association, composition(bileşim), inheritance(kalıtım) gibi daha karmaşık ilişkiler yoktur. DOP kalıtıma karşı değildir ama farklı bir yolla bunu sağlarız.

DOP Sistemleri Esnektir

Hatırlarsanız daha önceki yazımızda, sonraki bir geliştirme olarak iş birimi tarafından, VIPMember ve SuperMember kullanıcılarının eklenmesi istenmişti. OOP sisteminde bunları adapte edebilmek için biraz zorlanmıştık. Birkaç üst sınıf tanımlamamız gerekmişti ve sınıf hiyerarşisi daha karmaşık bir hale gelmişti. DOP ile bunların geliştirilmesine bakalım.

  • Süper üyeler, diğer üyelere ödünç verilen kitapları listeyebilecekti
  • VIP üyeler ise, kütüphaneye yeni bir kitap ekleyebilecekti.

getBookLendings metodu 2 şeyi yapar: isLibrarian ile kontrol eder ve getBookLendings e catalog verisini pas eder. Koda bakalım.

isSuperMember fonksiyonunu kodumuza entegre etmek istersek, şöyle bir hal alır.

Süper üye özelliğini kolayca entegre edebildik. Şimdi VIPMember özelliğine bakalım. Library::addBookItem fonksiyonunda değişiklik yapmamız gerekecek.

Bunu da kolayca ekledik. Özet olarak:

  • DOP prensipleri dil-bağımsızdır.
  • DOP prensiplerinden birincisi kod ve verinin ayrıştırılmasıdır.
  • Kod ve verinin ayrıştırılması sistemlerin anlaşılmasını kolaylaştırır.
  • Veri varlıkları(data entities) sistemin bilgi tutan kısımlarıdır.
  • DOP, veri kapsüllemeye karşıdır.
  • Sistemin esnekliği sayesinde, değişiklikleri daha kolay adapte edebiliriz.
  • DOP’da, kod modülleri, durumsuz(stateless) fonksiyonlardan oluşur.
  • Durumsuz fonksiyonlar, manipüle edeceği tüm verileri argümanlar olarak alırlar.

Bölüm 3: Temel Veri Manipülasyonu

Yazının devamı için tıklayınız.

--

--