MVC (Model — View — Controller) Nedir ?
Yazılım denince işin içerisinde olmayan insanlar için anlaşılması güç, karmaşık bir takım kavramlar ve nasıl okunup, anlamlandırıldığı çözümlenemeyen satırlar akla gelir. Öte yandan sektörün içerisinde olan insanların bu kıymetli bilimi yoğun terimlerle anlatmasından kaynaklı olarak bu bilime merak salan insanların ön yargıları artmaktadır. Eğer konumuza başlamadan önce bir eleştiri yapmak gerekirse, toplumun anlamadığı bir kavramın, bir konunun kimse için bir faydası yoktur çünkü her bilim toplum için vardır. Dolayısı ile bir konuyu veya bir kavramı ifade ederken en basit ve en anlaşılır yöntemi tercih etmek topluma olan bir sorumluluk gereğidir. Ben bu yazımda bu konuyu en basit hali ile ve en az teknik kavram ile ifade etmeye çalışacağım.
Soyut veya somut olsun hiçbir şey tesadüften, yoktan var etmekten ibaret değildir. Yazılımda da aynı kural geçerlidir. Bunu detaylandırmak gerekirse, duyduğunuz herhangi bir yazılım tekniği veya yazılım kavramı sadece o bilimden esinlenilerek ortaya atılmış bir şey değildir. Muhakkak gerçek hayattan, somut bir varlıktan, kabul görmüş sistematik bir eylemden esinlenilerek geliştirilmişlerdir.
Yazılım alanında standartlar büyük önem arz etmektedir. Standartlar takım halinde çalışmayı, projeleri başka teknik ekiplerle yürütmeyi, yeni ekip üyelerini projeye hızlı adapte etmeyi kolaylaştıran yöntemlerdir. MVC(Model, View, Controller)’de bu standartlardan bir tanesidir ve “mimari(stracture)” olarak isimlendirilir. Bu tekniğe bu ismin verilmesi tesadüfi değildir çünkü biraz önce bahsini ettiğimiz üzere gerçek bir mimariden esinlenilmiştir. Bir örnek üzerinden standart ve mimari kavramlarına açıklık getirelim:
Bir bina inşa edeceğimizi düşünelim ve bu binada oturacak insanların yabancılık çekmemeleri için bir evde var olması gereken standartları da inşa edeceğimiz bina projesine dahil edelim. Bunlar;
⁃ Elektrik
⁃ Su
⁃ Kapılar
⁃ Çatı
⁃ Depo
⁃ Yangın Çıkışı
Ve buna benzer beklentiler. İnşa edeceğiniz bina her ne şekilde olursa olsun temel anlamda hizmet edeceği konu bellidir. Dolayısı ile beklentiye uygun benzer çözümler üretmek gerekmektedir. Bu evlerde kalacak insanlar bir odaya girdiklerinde odayı aydınlatmak için bir düğmeye ihtiyaçları olduğunu bilirler ve aşağı yukarı bu düğmeyi nerede bulacaklarını da bilirler. Aynı şey bir mutfakta dolap için, duş almak istendiği buna hizmet eden bir bölümün ayrılmış olması ve bir evde var olan diğer fonksiyonlar içinde geçerlidir. Öte yandan siz üst katlardaki bir daireye çıkmak istediğinizde oraya nasıl ve hangi yöntemlerle ulaşacağınızı bilirsiniz. Bir merdiven veya asansör olduğunu zaten bilir ve siz sadece bunların nerede olduğunu bulursunuz. Standart bir evin nasıl olacağını bildiğiniz için hangi eve girseniz girin aşağı yukarı ulaşmak istediğiniz hedefe giden yolu bilir tahmin edersiniz.
Şimdi aynı örneği yazılım uygulaması üzerinden yapalım. Siz bir proje(bir önceki örnekte belirttiğimiz ev) inşa edeceksiniz. Her yazılım projesinde ihtiyaç olan standartlar bellidir. Bunlar:
⁃ Veritabanı bağlantıları
⁃ Sorgular
⁃ Görünüm sayfaları
⁃ Route
⁃ Fonksiyonlar
Ve bunlara benzer diğer ihtiyaçlar. Siz bir yazılım projesinde olması gereken şeyleri bilirsiniz ve daha önce üzerinde hiç çalışma yapmadığınız bir projede dahi kendi yolunuzu bulabilirsiniz. Yine bir önceki örnekle bağdaştıracak olursak, siz veritabanı bağlantısı ile ilgili bir değişikliğe ihtiyaç duyduğunuzda projede bazı standartlar ararsınız. Veritabanı konfigürasyonlarının yapıldığı bir dosya veya alternatif bir yöntem muhakkak vardır ve böyle bir dosya veya yapının projede var olduğunu bildiğimizden ötürü , sadece konumunu ararsınız. Bu bir binada olmazsa olmaz merdiven veya asansör gibidir. İşte bunu daha sistematik hale getiren bir şeyler Yapıya ihtiyaç duyulmuştur. Dolayısı ile tam burada MVC gibi bir mimari, bir standart tüm durumu değiştirebilir. Proje kabul görmüş bir sistematik üzerine inşa edildiğinde siz Mvc ile geliştirilmiş bir projede yolunuzu bulabilirsiniz çünkü Model’de , View’da, Controller’da neler olduğunu ve bunların kendi içlerinde işlerinin farklı olduğunu bilir ve neyi nerede bulacağınızı da bilirsiniz. Yani bir önceki örnekle ilişkilendirerek olursak, siz bir POST işleminde değişiklik yapmak istediğinizde (odanın ışığını yakmak istediğinizde) Controller klasörü altında ilgili Controller dosyasını bulur ve ilgili fonksiyonu ararsınız(odada ışığı açan bir düğme olduğunu bilir ve odada onu ararsınız). İşte tüm mesele kabul görmüş bir standart üzerinde daha sistematik ilerleyen, çözüme ve geliştirmeye daha uygun bir yazılım mimarisi tercih etmek.
Model Nedir ?
Siz bir emlakçı olduğunuzu düşünün ve müşterilerimize elinizde olan evleri göstermek istiyorsunuz. Ancak bu evler konum olarak birbirine uzak ve ulaşım fiziksel olarak karmaşık bir hal alıyor. Siz tüm evleri tek bir konumdan göstermek istiyorsunuz ve bununla ilgili bir çözüm arıyorsunuz. Yani müşterileriniz hangi evi görmek isterse istesin, evin fiziksel konumu yerine daha merkezi bir yerden evde var olan her şeyi görebilsin. İşte buna uygun bir çözüm olarak bu evin veya evlerin bir modelini çıkarmak, daha ulaşılabilir birer örneğini tasarlamak uygun bir çözüm olabilir. Yani müşteri bir evi görmek istiyor ve doğrudan eve gitmek yerine müşteri için tasarlanmış bir model görüyor ve ilgili soruları bu model üzerinden soruyor, ilgili cevapları bu model üzerinden alıyor.
İşte MVC mimarisi ile geliştirilmiş bir yazılım projesinde de MODEL kavramının bu örnekten bir farkı yoktur. Model, proje içerisinde veritabanı ile ilgili tüm eylemlerin gerçekleştirilebildiği, veritabanında var olan tabloların modellenerek birer object/class olarak kullanılmasına imkan dağlayan bir yöntemdir. Bir önceki örnekle ilişkilendirirsek siz bir tabloda var olan verileri görmek istiyorsunuz (bir ev görmek istiyorsunuz) ve doğrudan veritabanına istek atmak yerine veritabanındaki ilgili tabloyu temsil efen Model’e istekte bulunuyorsunuz (evi temsil eden nesnelere bakarak evde neler var olup olmadığını gör biliniyorsunuz) ve model size tabloda var olan tüm verileri sizin kriterlerinize göre gösteriyor.
Özetleyecek olursak, MVC mimarisi üzerinde veritabanı ile ilgili tüm süreçler yönetilmektedir.
Controller Nedir ?
Bir sitede oturduğunuzu düşünelim ve bu sitede bir güvenlik, bir denetleyicinin görevli olarak çalıştığını düşünelim. Bu güvenlik görevlisi binaya giriş çıkışları denetler, binaya girenlerin o binada oturup oturmadığını kontrol eden ve binaya gelen misafirlerin doğru daire ve bloklara yönlendirilmesini sağladığını da var sayalım. İşte MVC mimarisindeki Controller da tam olarak bu işi yapar. Controller dilimizdeki karşılığı ile “Denetleyici” isminde anılır ve isminin karşılığı olan denetleme eylemini gerçekleştirir. İstemciden yani kullanıcıdan gelen istekleri denetler, algoritmalara tabi tutar ve ilgili model ile ilişkili olarak veritabanına (Database) yönlendirilmesini sağlar. Siz bir kullanıcıdan istek aldığınızda (yani binaya bir daire sahini geldiğinde) bu isteğe dair tüm denetlemeleri, kontrolleri, değişiklikleri CONTROLLER kısmında gerçekleştirirsiniz. MVC (Model — View — Controller) üçgeni arasındaki temel ilişkiyi sağlayan önemli bir birimdir. Kullanıcı/istemci bu kısma müdahale edemez, nasıl kurgulandığına dair bilgisi yoktur. BackEnd diye nitelendirilen dil, yöntem ve teknolojiler (Php, .Net, C#, Python) yoğun olarak Controller’da uygulanır.
View Nedir ?
Yine bir emlakçı olduğunuzu ve bir müşterinize satmak için bir bir ev gösterdiğinizi düşünelim. Siz müşterinin ihtiyacına, beklentisine ve taleplerine uygun bir şekilde tasarlanmış olan bir eve götürüyorsunuz. Bu ev tam müşterinin istediğine hitap eden, beklentilerine uygun bir ev olmalıdır. Siz müşteriyi bu eve götürdüğünüzde müşteri onun için tasarlanmış, estetiği olan kısma odaklanır ancak elektrik tesisatının nasıl kurgulandığı (Controller’a benzetebilirsiniz), binada kimlerin oturduğu (Model — Veritabanı kısmı gibi düşünebilirsiniz) gibi durumları bilmez o sadece evin onun için görünen yanına odaklanır. İşte View tıpkı bu örnekteki gibi kullanıcının beklentisine uygun tasarlanmış, veritabanını yönetmesi ve diğer işlemlerini gerçekleştirebilmesi adına oluşturulmuş bir birimdir. Burada FrontEnd denilen dil ve teknolojiler (Html, Css, JavaScript…) kullanılır. Yani siz bir Web uygulamasına girdiğinizde gördüğünüz her şey View kısmında oluşturulmuş ve hazır hale getirilmiştir. Size sunulan HTML nesneleri ile (butonlar, Metin kutuları vb.) Controller’a bir istekte bulunursunuz ve Controller sizin için ilgili denetlemeleri yapar, bu isteği de ilgili veritabanı Model’ine (tablo modeli) yönlendirir. View kısmı son kullanıcının kullandığı ve görebildiği tüm uygulama özelliklerini kapsar.
MVC bir çok dilde uygulanabilen ve kullanılan bir mimari olduğu için uygulama hangi dilde kodlanmış olursa olsun bu mimariye hakim olan herhangi biri uygulama içerisinde kendi yolunu bulabilir. Eğer projede kullanıcının görebildiği bazı tasarım öğelerine müdahale etmek istediğinde VİEW, kullanıcıdan gelen isteklerin denetlenmesinde bir değişiklik yapmak istediğinde CONTROLLER, veritabanında oluşturularak projeye dahil edilmiş olan tablolara müdahale etmek veya yeni oluşturulmuş bir tablonun projeye dahil edilmesini istediğinde ise MODEL kısmına gideceğini bilir. İşte bu mimari aslında projenin daha sistematik yönetilmesine, geliştirilmesine ve FrontEnd — BackEnd teknoloji ve birimlerin birbirinden sistematik olarak ayrılmasına fırsat sağlarken bir çok dil ve projede kullanılmış olan bir mimari olması sebebi ile de projenin sürdürülebilirliği ve güncelliği açısından da önem arz etmektedir.
MVC mimarisini eğer bir sıralamaya koyacak olursak, Veri Tabanı(Database) / MODEL -> CONTROLLER -> VİEW şeklinde olacaktır. Yine aynı sıralama tersi yönde de mevcuttur, VİEW -> CONTROLLER -> MODEL / Veri Tabanı (Database) şeklindedir. Yani bunu bir süreç üzerinden anlatacak olursak, kullanıcı sisteme yeni bir bilgi yükleyecek olsun. Kullanıcı sisteme yüklemek istediği bilgileri VİEW biriminde tasarlanmış olan HTML inputları/elementleri aracılığı ile tamamlamış ve kayıt etmek için isteğini gerçekleştirebileceği butona basmış olsun. View’da alınmış olan bu veri — bilgiler (data) CONTROLLER birimine iletilir. Burada veritabanına kayıt etmek için oluşturulmuş olan algoritmalardan geçirilir ve hatta hata var ise buradan istek (request) geri döndürülür. Eğer bu request kayıt etmek için uygunsa veriler MODEL’e iletilir ve model aracılığı ile veritabanına kayıt edilir. MVC mimarisi ile geliştirilmiş bir proje de süreç bu şekildedir.
Bu yazımızda MVC mimarisini somutlaştırarak daha gerçekçi boyutu ile anlatmaya çalıştık ve umuyorum faydalı da olmuştur.
Bilginin paylaştıkça, ulaşabildikçe ve anlaşıldıkça çoğaldığını, fayda ürettiğini hepimiz biliriz. Bu açıdan hangi konu olursa olsun, bir bilginin paylaşımı toplumumuz açısından önemlidir çünkü bilgi temelinde insanlık için vardır ve hep daha iyisini inşa etmek, daha mutlu bireylere ulaşmak, refahı artırmak gibi amaçlara hizmet etme vardır. Bizlere düşen sorumluluk ise bu bilgiye ulaşımı ve anlaşılması kolay hale getirmektir.
Enjor Your Coding !
Enver ŞANLI
Web Developer, Social Thinker & Farmer