Stack Overflow Blog’da yayımlanan bir makale, sistem gereksinimleri ile yazılım tasarımı arasına ayrım koyabilen ve ardından sistemi oluşturup bakımını yapmaya yardımcı olmak için modelin kendisini kullanabilen bir yaklaşım olarak modellerle yönlendirilen programlama (Model Oriented Programming) kavramının yeniden değerlendirilmesi çağrısında bulunuyor. Yazar, 13 yıl önce Mo+ adını verdiği bir dil ve geliştirme ortamı geliştirdiği önceki deneyimine dayanıyor. Yazar, bu araçları kurumsal projelerde kullandığını, ancak fikrin geniş ölçekte yaygınlaşmadığını belirtiyor.
Bu içerik, kullanıma sunulmuş bir dilin veya yeni bir araştırma projesinin duyurusu değil; özellikle yapay zekânın ve yazılım sistemlerinin karmaşıklığının giderek önem kazandığı bir dünyada, bu alanda daha fazla araştırma ve geliştirme yapılması çağrısı niteliğinde bir tezdir.
Yapı ve veri olarak model
Yazar, modeli iki unsur üzerinden tanımlamayı öneriyor: kuralları veya şemayı belirleyen bir yapı ve bu yapıya uyan veriler. Yapı hiyerarşiktir; bir kök düğümden başlar ve düğümlere ve özelliklere ayrılır. Gerektiğinde bir özellik başka bir düğüme başvurabilir. Bu bakış açısıyla ilişkisel bir veritabanı şeması, verilerin kendisi satırlara ve ilişkilere dağılmış olsa bile veritabanı, tablo, sütun ve anahtar gibi düğeleri içeren hiyerarşik bir biçimde temsil edilebilir.
Makale, fikri açıklamak için restoranlar, müşteriler, çalışanlar, menü öğeleri ve bunlar arasındaki ilişkileri içeren basitleştirilmiş bir restoran senaryosu kullanıyor. Aynı senaryoyu temsil etmek için birden fazla olası yapı sunuluyor ve yapı seçiminin model içinde gezinme kolaylığını ve modele dayanan programların yazılma biçimini etkilediği açıklanıyor.
Modellerle yönlendirilen geliştirmenin dört biçimi
- Gayriresmî modelleme: Zihinde veya kâğıt üzerinde bulunan ya da yazılım araçlarının doğrudan kullanmadığı diyagramlardaki modeller.
- Gömülü modelleme: Entity Framework ve NHibernate gibi ORM çerçevelerinde veya Angular ve React gibi kullanıcı arayüzü çerçevelerinde olduğu üzere kodun içindeki model.
- Bağlantılı modelleme: Genellikle UML kullanılarak oluşturulan ve kod öğeleriyle bunları yönetmeye yönelik araçlara güçlü biçimde bağlanan harici model.
- Ayrıştırılmış modelleme: Gereksinimlere, verilere ve iş akışına odaklanan; ayrıntılı kod tasarımını ise koda bırakan model. Bu yaklaşımda modeldeki her öğe belirli bir yazılım bileşenine bağlanmaz.
Yazar, en büyük potansiyelin bağlantılı ve ayrıştırılmış modellemede, özellikle de sonuncusunda bulunduğunu düşünüyor. Çünkü bu yaklaşım gereksinimleri modele, tasarımı ise koda yerleştiriyor. Yazar, kişisel deneyiminin modelleme ve programlama sürecini daha akıcı hâle getirdiğini belirtiyor.
Modelden sisteme
Makale, modellerle yönlendirilen programlamanın kullanımını üç alana ayırıyor. Geçiş biçiminde program model yorumlanıyor ve daha sonra geliştirilebilecek kaynak kod, yapılandırma dosyaları veya belgeler üretiliyor. Model modelleme biçiminde dil, modelin yapısının ve verilerinin oluşturulmasına ve bakımına yardımcı oluyor. Hedef biçiminde ise dil doğrudan sistem ortamını oluşturmak ve yönetmek için kullanılıyor; bu da daha eksiksiz bir dil gerektiriyor.
Önerilen dilin özellikleri
Öne çıkan önerilerden biri, model yapısını dil kurallarının bir parçası hâline getirmek. Böylece bunları temsil etmek için özel sınıflar ve nesneler oluşturmak yerine Entity, Property ve Relationship gibi düğümlerle doğrudan çalışılabiliyor. Yazar ayrıca programın veri ağacındaki konumuna dayanan bir model bağlamı öneriyor. Bu bağlam, üst düğümlere çıkmaya veya alt öğelere inmeye ve bunlar arasında arama yapmaya olanak tanıyan bir yığıt içeriyor.
Başka bir fikir de belirli bir düğüm türüyle ilişkilendirilen ve birden fazla örnek üzerinde değerlendirilebilen bağımsız kod parçaları olan “modellerle yönlendirilen özellikler”. Bu özellikler, örneğin bir sınıf tanımı veya sınıfın özelliklerini oluşturmak üzere birleştirilebilir ya da arama ve filtreleme işlemlerinde kullanılabilir. Geçiş biçiminde özellik, sonucu bir dosyaya veya hedef ortama kaydetmek için put işlemini içerebilir.
Yazar ayrıca yorumlayıcının bir programlama oturumu başladığında model düğümlerini ve özelliklerini dil kurallarına eklediği dinamik kurallar öneriyor. Bu, standart model yeterli bilgi içermediğinde veya model belirli bir kuruma ya da alana özgü olduğunda yararlı olabilir. Yazar ayrıca programın farklı bölümlerinde izin verilen işlemleri sınırlayan bağlamsal kurallar ortaya koyuyor. Bunun amacı yan etkileri azaltmak ve okuma ile yazma sorumluluklarını birbirinden ayırmak.
Bu öneri neden önemli?
Fikrin pratik değeri, modeli geliştirme döngüsünden ayrı bir tasarım belgesi olmaktan çıkarıp çalıştırılabilir hâle getirme çabasında yatıyor. Gereksinimler, veriler ve iş akışı yeniden kullanılabilir oluşturma ve bakım mekanizmalarıyla ilişkilendirilebilirse model ile kod arasındaki tekrarlar azalabilir. Ancak makale standart bir dil, kullanıma sunulmuş araçlar veya bu yaklaşımın mevcut modelleme ve kod oluşturma çerçevelerinden üstün olduğunu kanıtlayan karşılaştırmalı sonuçlar sunmuyor.
Önemli sorular ise açık kalıyor: Büyük ve değişken modeller nasıl yönetilecek? Oluşturulan kod nasıl test edilecek? Dinamik kuralların okunabilirlik, güvenlik ve geliştirme araçlarıyla entegrasyon açısından sınırları neler? Bu nedenle içerik, kullanıma hemen hazır bir çözümden çok dil geliştiricileri ve araştırmacılar için değerli bir araştırma çağrısı niteliğinde görünüyor.