Data-Oriented Programming(DOP) — Ufak Bir Giriş 2
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.