MVC ile Java SE ortamında uygulama geliştirme

Model-View-Controller (MVC) nedir?

Grafiksel kullanıcı arayüzü (GUI – Graphical User Interface) kütüphanelerini (AWT, Swing, ..) kullanarak yazılım geliştirdiyseniz, MVC tasarım deseniyle karşılaşmış olmanız oldukça olasıdır. MVC ilk olarak 1979 yılında Xerox Palo Alto araştırma merkezinde Smalltalk geliştiricisi olan Trygve Reenskaug tarafından, veri erişimi, iş mantığını ve kullanıcıya gösterilen davranışları birbirinden ayırmak için ortaya atılmıştır. Daha kesin olarak açıklayacak olursak MVC üç parçaya bölünebilir:



Model: Model veriyi ve bu veriye erişim ile güncellemeyi yöneten kuralları temsil eder. Kurumsal yazılımlarda, model genellikle gerçek yaşam sürecinin yazılım karşılığı olarak hizmet eder.

Görünüm (View):Görünüm modelin içeriğini ortaya çıkarır. Model verisinin tam olarak nasıl gösterilmesi gerektiğini tanımlar. Eğer model verisi değiştiğinde, gerektiğinde görünümde temsili güncellemelidir. Bu itme (push) yaklaşımı kullanımıyla yapılabilir, bu yaklaşımda görünüm model üzerindeki değişiklikler için kendini kaydeder (değişiklik durumunda model katmanı görünümü tetikler). Bir diğer yaklaşım olan çekme (pull) yaklaşımında ise görünüm en güncel veriye ulaşmak için modeli çağırmakla yükümlüdür.

Denetleyici (Controller): Denetleyici kullanıcının görünümle olan etkileşimlerini, modelin gerçekleştireceği eylemlere çevirir. Standalone GUI istemcisinde kullanıcı etkileşimli düğme tıklamaları veya menü seçimleri olabilir, kurumsal web uygulamalarında ise GET ve POST HTTP istekleri olarak gözükürler. Kapsama bağlı olarak, denetleyici kullanıcıya göstermek için yeni bir görünüm üretebilir(sonuçların web sayfası gibi).


Her ne kadar farklı mimariler bu üç bileşenin farklı şekillerde etkileşmesini sağlasa da, Şekil 1'de MVC tasarım deseninin genel kabul görmüş bir gerçekleştirimini görebilirsiniz (Sun BluePrints Catalog'dan alınma):

Şekil 1. Genel kabul görmüş bir MVC gerçekleştirimi


MVC Bileşenleri Arasında Etkileşim


Bu bölümde Şekil 1'deki gerçekleştirime Java platformu (Java SE 6) bağlamında daha derinlemesine bakacağız. Model, görünüm ve denetleyici nesneleri ilklendiği anda aşağıdakiler oluşur:

  1. Görünüm kendisini model üzerinde dinleyici olarak kaydeder. Modelin altındaki verideki herhangi bir değişimde doğrudan değişim bildirimi yayını ortaya çıkar, bu görünüm tarafından alınır. Bu daha önce bahsettiğimiz itme yaklaşımının bir örneğidir. Bu yaklaşımda model ne görünüm, ne de denetleyicinin farkında değildir, sadece değişim bildirimlerini tüm ilgilenen dinleyiciler için yayınlar.

  2. Denetleyici, görünüme bağlanmıştır. Bu tipik olarak görünümde gerçekleştirilen herhangi bir kullanıcı eyleminin, denetleyici sınıfında kayıtlı bir dinleyici metodunu başlatması (invoke) anlamına gelmektedir.

  3. Denetleyici alttaki modele bir referans barındırır.


Kullanıcı görünümle etkileştiği anda, aşağıdaki eylemler oluşur:

  1. Görünüm bir oluşan GUI eylemini -örneğin bir düğmeye tıklamak veya kayan çubuğu hareket ettirmek- algılar. Bunu bu tip bir eylem oluştuğunda çağrılmak üzere kaydedilmiş bir dinleyici metodu kullanarak gerçekleştirir.

  2. Görünüm denetleyici üzerindeki uygun metodu çağırır.

  3. Denetleyici modele erişir, kullanıcının eylemine bağlı olarak uygun bir şekilde güncelleme yapma ihtimali vardır. Eğer model değişirse, ilgili dinleyicileri, görünüm gibi, değişim hakkında bilgilendirir. Bazı mimarilerde, denetleyici ayrıca görünümü güncellemekle de sorumlu olabilir. Bu Java tabanlı kurumsal uygulamalarda sık karşılaşılan bir durumdur.


Şekil 2 bu etkileşimi daha ayrıntılı olarak göstermektedir.

Şekil 2. MVC kullanan bir Java SE uygulaması

Daha öncede söylendiği gibi, model görünüme bir referans içermez, ancak eylem bildirme yaklaşımını değişimle ilgilenen taraflar için kullanır. Bu güçlü tasarımın bir sonucu birden fazla görünüm aynı alt modeli kullanabilir. Modelde bir değişim olduğunda, her bir görünüm bu özellik değişiminden haberdar olarak, kendisini gerektiği şekilde güncelleyebilir. Örneğin Şekil 3 aynı veri modelini kullanan iki farklı görünümü göstermektedir.



Şekil 3. Aynı modeli kullanan birden fazla sayıda görünüm

MVC Tasarımını Değiştirmek


Son zamanlarda daha fazla geçerli olan bir MVC tasarımı denetleyiciyi model ve görünüm arasına yerleştirmektedir. Bu tasarım, Apple Cocoa anaçatısında sıklıkla görülür, Şekil 4'te görülebilir.

Şekil 4.Denetleyicinin Model ve Görünüm arasında olduğu bir MVC tasarımı

Bu tasarımla, daha geleneksel sürüm arasındaki birincil fark, model nesnelerindeki durum değişimlerinin bildirimlerinin görünüme denetleyici aracılığıyla aktarılmasıdır. Böylece, denetleyici model ve görünüm arasındaki veri akışını iki yönlü olarak yönetmiş olur. Görünüm nesneleri, her zaman olduğu gibi, kullanıcı eylemlerini model üzerindeki özellik güncellemelerine dönüştürmek için denetleyiciyi kullanır. Ek olarak, model durumundaki değişiklikler görünüm nesnelerine uygulamanın denetleyici nesneleri üzerinden iletilir.


Böylece, bütün üç bileşende ilklendiğinde, görünüm ve modelin ikisi de denetleyiciye kaydedilir. Kullanıcı görünümle etkileştiğinde, olaylar neredeyse aynıdır:

  1. Görünüm bir oluşan GUI eylemini -örneğin bir düğmeye tıklamak veya kayan çubuğu hareket ettirmek- algılar. Bunu bu tip bir eylem oluştuğunda çağrılmak üzere kaydedilmiş bir dinleyici metodu kullanarak gerçekleştirir.

  2. Görünüm denetleyici üzerindeki uygun metodu çağırır.

  3. Denetleyici modele erişir, kullanıcının eylemine bağlı olarak uygun bir şekilde güncelleme yapma ihtimali vardır. Eğer model değişirse, ilgili dinleyicileri, görünüm gibi, değişim hakkında bilgilendirir. Ancak bu durumda değişim denetleyiciye gönderilir. Denetleyicide gerekli görünüm değişiklikleri için Görünüm katmanıyla haberleşir.


Bu tasarım neden kullanılmalıdır? Bu değiştirilmiş MVC, modeli görünümden tamamen ayırmak için yardımcı olur. Bu durumda, denetleyici kayıtlı olduğu bir veya daha fazla modelde bulmak istediği model özelliklerini zorlayabilir. Ek olarak, kayıtlı olan bir veya daha fazla görünüm için modelin özellik değişimlerini etkileyen metotları sağlayabilir.

Kaynak:Java SE Application Design With MVC

Hiç yorum yok: