Konu Başlıkları
Yükleniyor...

Modüler Tasarım: Neyi Modüle Ayırmalı, Neyi Ayırmamalı

Modülerliğin Ölçütü ve Bedeli: Bilgi Saklama, Arayüz, Tekrar

Modüler tasarım denince akla önce parçalara bölmek gelir, oysa bölmek işin kolay kısmı. Bir sistemi hangi çizgilerden ayırdığın, kaç parçaya ayırdığından çok daha belirleyici. Yanlış yerden çekilen sınır, tek bir değişikliği üç ayrı modülü birden ilgilendiren bir işe çevirir.

Modül, parça demek değil

Bir dosyayı ikiye bölünce iki dosyan olur, iki modülün olmaz. Modülden söz edebilmek için parçanın iki özelliği gerekir: dışarıya verdiği bir söz, yani arayüz, ve o arayüzün arkasında sakladığı bir iç yapı. Arayüz, başkalarının bilmek zorunda olduğu her şeydir. İç yapı ise başkalarının bilmemesi gereken her şey.

Ölçüsü basit. Bir modülün içini baştan aşağı değiştirdiğinde onu kullanan kodda tek satır değişmiyorsa gerçekten modüldür. Değişiyorsa elinde yalnızca daha küçük dosyalar var, daha az karmaşıklık değil.

Ayırma ölçütü: ne değişecek?

Yaygın refleks, sistemi işlem adımlarına göre bölmektir: önce veriyi oku, sonra hesapla, sonra yazdır. Bu bölünme akış şemasına benzediği için doğru görünür ama değişikliğe karşı kırılgandır, çünkü tek bir kararın izi bütün adımlara yayılmıştır. Parnas'ın 1972 tarihli On the Criteria To Be Used in Decomposing Systems into Modules yazısındaki öneri bugün de geçerli: sınırları adımlara göre değil, değişmesi muhtemel tasarım kararlarına göre çiz.

Somut hali şu. Bir e-ticaret sayfasında fiyat gösterimi düşün. KDV oranını, yuvarlama kuralını ve para birimi biçimini bilen tek bir yer varsa, oran değiştiğinde tek dosyaya dokunursun. Bu bilgi listeleme, sepet ve fatura şablonuna dağılmışsa aynı değişiklik üç yerde tekrar eder ve biri mutlaka unutulur. Modül sınırını belirleyen şey burada işlevin adı değil, değişen kararın kendisi.

Modülerliğin faturası

Bölmenin bedeli genelde konuşulmaz. Her sınır bir arayüz demektir, her arayüz de tanımlanması, belgelenmesi ve sürdürülmesi gereken bir sözleşme. Birbirini serbestçe çağırabilen 5 modülde olası bağ sayısı 5·4/2 = 10, 10 modülde 45'tir. Yani modül sayısını artırmak tek başına sadeleştirmez, tam tersini yapabilir. Sadeleşme, hangi bağların yasak olduğunu söylediğinde başlar: katmanları belirlemek, bağımlılığı tek yöne çevirmek, üst katmanın alt katmanı çağırmasına izin verip tersini yasaklamak.

İkinci kalem genelleştirme. Bir parçayı yeniden kullanılabilir hale getirmek, onu tek seferlik yazmaktan pahalıdır; parametreleri, uç durumları ve dokümantasyonu da beraberinde gelir. Bir yapıyı modüle çıkarmayı genelde üçüncü tekrarda yaparım, ilk iki kopyayı olduğu gibi bırakırım. İki örnek, neyin gerçekten değişken olduğunu göstermeye yetmiyor; erken çıkarılan ortak parça çoğu zaman yanlış yerinden ortaklaştırılmış oluyor ve sonradan ayırmak, hiç birleştirmemekten daha zahmetli.

Nerede kazandırır, nerede yük olur

Modülerlik, aynı bileşenin çok sayıda yerde farklı ayarlarla göründüğü sistemlerde kazandırır. İçerik yönetimi bunun tipik örneğidir: yüzlerce sayfa, aynı galeri veya form bileşeninin farklı yapılandırmalarını kullanır, bileşen bir kez düzelince hepsi düzelir. Aynı mantık fiziksel ürünlerde de çalışır, tekrar eden bir birim varsa.

Buna karşılık beş sayfalık tanıtım sitesini modüler mimariye oturtmak, çözdüğünden fazla iş çıkarır. Orada tekrar yoktur, dolayısıyla yeniden kullanım da yoktur; geriye sadece arayüz bakımı kalır. Kaba bir ayrım olarak: tekrar görünmeden modül çıkarma, tekrar üçüncü kez göründüğünde de artık erteleme.

Modülerliğin karmaşıklığı yok etmediğini kabul etmek işi kolaylaştırır. Karmaşıklık yer değiştirir, parçaların içinden aralarındaki sınırlara taşınır. Kazanç, o sınırların doğru yerlere çekilmiş olmasından gelir.

Konunun tasarım tarafındaki geniş bir özeti için: Modular Design for Rapid Advances, Interaction Design Foundation.