Pragmatik Programcı — 5
Dikeylik(Orthogonality) Kavramı
- Bu yazı The Pragmatic Programmer kitabından anladığımın özetidir. Orjinal halini buradan alabilirsiniz.
- Önceki yazıyı buradan okuyabilirsiniz.
Kolay tasarlanabilir, oluşturulabilir, test edilebilir ve genişletilebilir bir sistem üretmek istiyorsan Dikeylik çok önemli bir kavramdır. Bir kere dikeylik prensiplerini doğrudan öğrendiğiniz vakit, ürettiğiniz sistemlerin kalitesinde derhal bir iyileşme görmeye başlarsınız.
Dikeylik Nedir
Dikeylik geometriden alınan bir kavramdır. Dik açıyla birbirini kesen çizgiler, yukarıdaki grafikteki eksenler gibi, birbirine dikeydir. Vektör deyimiyle, iki çizgi birbirinden bağımsızdır. Bir çizginin üzerinde ilerlemek, diğerinin üzerinde oluşturduğu yansımayı değiştirmez.
Bilgisayar biliminde ise, dikeylik kavramını, bağımsızlığın ve ayrıştırmanın önemini göstermede kullanırız. İki şey birbirine dikey ise, birinde yaptığın değişiklik diğerini etkilemez. Mesela, iyi tasarlanmış bir sistemde, veritabanı kodları kullanıcı arayüzüne dikey olmalıdır.
Dikeyliğin Faydaları
Eğer bir sistemin bileşenleri yüksek oranda birbirine bağlı ise, yerel olarak bileşeni düzeltmekten söz edemeyiz.
13. Tavsiye: Alakasız şeyler arasındaki etkileşimleri gider
Biz kendi kendine yeten, bağımsız, tek ve iyi-tanımlanmış amacı olan bileşenler tasarlamak istiyoruz.
Bileşenler birbirinden izole edilirse, birinde yaptığın değişikliğin diğerine etki etmeyeceğini bilirsin. Bileşenin dışa açtığı arabirimini değiştirmediğin sürece, bütün sistem boyunca herhangi bir sıkıntıya girmeyeceğin hakkında emin olabilirsin.
Dikey sistemler geliştirirsen, iki tane başlıca kazanç elde edersin: artırılmış verim ve azaltılmış risk.
Artırılmış Verim
- Değişiklikler yerelde kalacağı için, geliştirme zamanı ve test süresi azalır. Büyük bir bloktan ziyade küçük bileşenleri yazmak daha kolaydır.
- Dikeylik yaklaşımı tekrar kullanılmayı da teşvik eder. Bir bileşen ne kadar özelse ve iyi tanımlanmış görevi var ise, kendi tasarımcısının bile öngöremeyeceği ölçüde yeni bileşenlerle bir bütün oluşturabilir. Sistemin ne kadar esnekçe birbirine bağlı ise, tekrar ayarlanması ve düzenlemesi o kadar kolay olur.
- Dikey bileşenleri birleştirdiğin zaman verimde çok muazzam bir kazanç elde edersin. Birbirine dikey olan, M farklı şeyi yapan bir bileşen ile N farklı şeyi yapan bir bileşeni birleştirdiğinde M x N şey ortaya çıkar.
Azaltılmış Risk
Dikey yaklaşım riskleri azaltır.
- Hastalıklı kod bölümleri izole edilmiştir. Bir modül bozulursa, semptomları geri kalan sisteme bulaşmaz. Onu kesip atmak ve yeni bir modül nakli yapmak daha kolay olur.
- Dikey bir sistem daha iyi test edilecektir. Bileşenler üzerinde testleri çalıştırmak daha kolay olacaktır.
- Belirli bir satıcı, ürün veya platforma sıkıca bağlı kalmayacaksınız, çünkü 3.parti bileşenlere olan arabiriminiz sistemin geri kalanından izole edilecektir.
İşyerinizde uygulayabileceğiz dikeylik prensiplerine bakalım.
Proje Takımları
Bazı proje takımları çok etkiliyken ve ne yapacağını çok iyi biliyorken, neden bazı takımlar çekişme içinde ve birbirinin işine müdahale eder.
Takımlar organize edilirken, çok fazla çakışma meydana geldiyse, takım üyelerinin sorumluluklar konusunda kafaları karışır. Böyle takımlarda herhangi bir değişiklikte tüm takımın toplanmasına ihtiyaç duyar, çünkü içlerinden birisi bu değişilikten etkilenebilir.
Takımları görevi iyi tanımlanmış ve en az çakışma ile gruplara nasıl böleriz? Bunun kolay bir yolu yok. Sahip olduğun insanlara veya projeye göre değişebilir. Bizim tercihimiz ilk olarak altyapının uygulamadan ayrılmasıdır. Her başlıca altyapı bileşeninin(veritabanı, iletişim arayüzü, orta katman vb.) kendi takımının olması gerekir.
Tasarım
Sistemler, beraber çalışabilen modül kümelerinden oluşmalıdır, her biri diğerinden farklı şekilde bir fonksiyona sahip olmalıdır. Bazen bu bileşenler katmanlara ayrılır ve her biri kendi soyutlama seviyesini sağlar. Bu katmanlı yapı, dikey sistemleri tasarlamak için çok etkili bir yoldur. Çünkü her bir katmana sadece altındaki katmanlar tarafından soyutlama sağlanır, bu da altındaki uygulamaları değiştirmeden kodunuzu değiştirmenizi sağlar.
Örnek bir katmanlı yapı şöyle gösterebiliriz. En temelde işletim sistemi, onun üzerine yardımcı sistem elemanları, onun üzerine kullanıcı arayüz yönetim, doğrulama ve yetkilendirme adımlarını görürüz. En üstte ise bunları kullanan kullanıcı arayüzünün kendisi olur.
Dikey tasarımı test etmek için kolay bir yol var. Bileşenlerin oluştuğunda kendine şunu sor: belirli bir fonksiyonun altındaki gereksinimleri değiştirdiğimde kaç tane modül etkilenir? Dikey sistemde cevap, “Bir” olmalıdır. Grafik tarafında değiştirdiğiniz bir buton, veritabanında bir değişikliğe neden olmamalıdır.
Ayrıca kendinize şunu sorun: tasarımınız gerçek dünyadan ne kadar ayrıştırılmış? Müşteri tanımlayıcı olarak telefon numarasını mı kullanıyorsunuz? Telefon şirketi alan kodları değiştirse, projenize ne olur?
Kontrol edemediğin şeylerin özellikleri üzerine tasarımını bina edemezsin.
Araç Setleri ve Kütüphaneler
Üçüncü-parti araç setlerini ve kütüphaneleri kullanırken, sisteminizin dikeylik özelliğini bozulmamasına dikkat edin. Bunun için teknolojinizi akıllıca seçin.
Bir araç setini kullanmak istediğinizde, kodunuzu olmadık şekillerde değiştirmenize yol açıyorsa ondan uzak durun. Bu ilerde farklı satıcılarla çalışmak istediğinizde işinizi kolaylaştıracaktır.
Enterprise Java Beans(EJB) sistemi dikeylik kavramının güzel örneklerindendir. Birçok transaction-yönelimli sistemlerde, uygulama kodunda işlemin başında ve sonunda transaction açma-kapama işlemi yapılır. EJB ile bu işlem, metadata olarak kodun dışında yapılır. Aynı uygulama kodu farklı EJB ortamlarında aynı şekilde çalışır.
Diğer ilginç bir örnek ise Aspect Oriented Programming(AOP, Cephe Yönelimli Programala)’dir. AOP size tek bir yerde kod yazma davranışı sağlar, diğer türlü kodunuzun her yerine eklemeniz gerekir. Log mesajları buna örnektir, bazı log fonksiyonlarını kendi kodunuzun birçok yerinde çağırmanız gerekir. AOP ile dikey bir şekilde loglama yapabilirsiniz. Örnek bir Java AOP kod örneğinde, Fred sınıfının her bir metoduna girdiğinde loglama yapar.
Siz bunu eklemek veya çıkarmak istediğinizde kendi kodunuzda bir değişiklik yapmanıza gerek kalmaz.
Kodlama
Her kod yazdığında, uygulamanın dikeylik özelliğini azaltma riskin olur. Sadece kendi yaptığın işi değil uygulamanın daha büyük bir kapsamında yapılan işleri izlemen gerekir, diğer türlü başka modüllerle yapılan işi bilmeyerek çoklayabilirsin.
Dikeyliğin devamını sağlaman için birkaç teknikten bahsedebiliriz:
Kodunu ayrılmış tut: Utangaç kodlar yaz, modülün alakasız hiçbir şeyi diğer modüllere açmasın ve diğer modüllerin uygulamaları üzerine kendi geliştirmesini bina etmesin. Eğer nesnenin durumunda bir değişiklik ihtiyacın varsa, bunu nesnenin kendisi senin yerine yapsın. Bu izolasyon sağlar.
Global değişkenlerden sakın: Global veriye referans verdiğin her kodunda, bu veriyi paylaşan diğer bileşenlerle kendini bağlamış olursun. Modülünde ihtiyacın olduğu bağlam verisini dışarıdan verilecek şekilde geliştirme yaparsan, kodun daha anlaşılır olur. Nesne yönelimli programlamada(OOP) bağlam, yapılandırıcılar aracılığıyla nesneye pas edilir.
Tekil(Singleton) modelinde, belirli bir sınıfın sadece bir tane nesne örneğinin oluşturulmasına izin verilir. Bazıları bunu global nesne değişkeni olarak kullanırlar. Bunu kullanırken dikkatli olun, çünkü gereksiz bağlantılara yol açabilir.
Benzer fonksiyonlardan kaçının: Bazen benzer işleri yapan fonksiyonlara rast gelirsin. Kodu çoklama, yapısal problemlerin bir belirtisidir. Daha iyi kod gerçeklemeleri için Strateji modelini inceleyebilirsiniz.
Kodunuzla ilgili sürekli eleştirel bir tutum takının. Yapısallığı ve dikeyliğini geliştirmek için tekrar düzenleme fırsatlarını kaçırmayın. Buna yeniden düzenleme(refactor) denir.
Test Etme
Dikey olarak tasarlanmış ve gerçeklenmiş sistemler daha kolay test edilir. Bu iyi bir şeydir, çünkü modül seviyesinde test yazmak, entegrasyon testleri yazmaktan daha kolaydır. Her modülün kendi birim testlerinin olması gerekir ve bunu belirli bir süreç ile otomatikleştirilmesi gerekir.
Modülün birim testlerini yaparken çok sayıda diğer sistemlerden bağlantı var ise, modülünüz iyi bir şekilde diğer sistemlerden ayrılmış olmaz.
Hata ayıklamada sistemin dikeyliğini belirlemek için iyi bir fırsattır. Bir şeyi düzeltmek için sadece bir modülü mü değiştiriyorsunuz, yoksa tüm sistemi mi?
Dikeylik İle Yaşama
Dikeylik özelliği, DRY(Kendini tekrar etme) prensibi ile yakından alakalıdır. DRY ile sistemdeki çoklamaları en aza indirgersin. İnsanların değişiklik yapmak için çaresizce uğraştığı bir sistem geliştirdiyseniz, dikeylik özelliğini yeniden ele alma ve yeniden düzenleme zamanı gelmiştir.