MVC Nedir?

Mvc (Model, View, Controller) yazılım geliştirirken kullanılan mimari desendir. Öncelikle şunu bilmemiz gerekiyor, bu bir tasarım desendir (design pattern) ve hiç bir platformun yada dilin babasının malı değildir. Bunu şundan söylüyorum; adam diyor ki ben asp.net mvc biliyorum, mvc nin bir desen olduğundan haberi yok, sanki Microsoft un bir icadı, mekanızmasıymış gibi ifade ediyor ve bu çok yanlış.

Php, javascript, python, java, asp.net yada her neyse hepsinde ki mvc deseni aynıdır. Bu yaklaşım aslında epey eski fakat web dünyasındaki gelişmeler daha doğrusu artık işin web sitesinden çıkıp web uygulaması haline gelmesi, klasik web geliştirme yöntemlerinin yetersiz kalmasına sebep oldu. Eskiden 1-2 kişi ile yapılan geliştirmeler şimdilerde koca koca ekiplerin geliştirdiği şeylere dönüştü, neylere? işlere.. Hal böyle olunca yeni birinin projeye dahil edilmesinden tutunda, yazılan kodun test edilebilmesine kadar bin türlü yeni hikaye çıktı ortaya.

Mvc bize aslında şunları sağlıyor; yazdığımız koda bir standart geliyor, tasarım ile arka tarafı birbirinden ayırıyoruz, tasarımın içine bolundan kod yazmadığımız için test edilebilirlilik inanılmaz artarken hata ayıklamada (debug) inanılmaz kolaylaşıyor, bu deseni bilen herkes rahatlıkla projelere entegre olabiliyor. Bu güzellikler web dünyasının mvc yi bağrına basması için yeterli sebepler aslında :)

Doğasında spagetti (karışık, aynı benim saçım başım gibi) olan dillerin başında JavaScript geliyor. Sırf bu sebepten dolayı yıllarca js yazmaya cesaret edemedik, en azından bende durum böyleydi. Günümüz web inin yüzde çokunu js oluşturuyor. Haliyle javascript’ inde artık spagettiden kurtulması gerekiyordu ki yine mvc ile bu işte çözüme kavuştu, kavuşuyor, kavuşacak. Ben size söyleyeyim asıl kaos ön tarafta, kimin eli kimin cebinde belli değil ama çok zevkli lan..

Dönelim Microsoft tarafına.. Web tarafında klasik asp den sonra ki aleti asp.net webform oldu. Webform olayı bence tam bir fiyaskoydu, çoğumuz 3-5 sene geriye gitti, tüm enerjimizi aldı olm :S Tekrar düşünüyorummmmm, evet ya tam bir fiyasko, webin felsefesine, kültürüne aykırı geliştirme yapmamızı sağlayan, kıçtan uydurulmuş bir ortam. (Eğer bunun eğitimini alıyorsanız bir an önce kaçmanın yollarını arayın. Bana kızmayın ama gerçekler maalesef acıdır.) Neyse ya kötü günler geride kaldı.. Mvc tarafında ki gelişmelerle birlikte Microsoft da asp.net mvc framework ünü duyurdu. Tabi o mal webform dan sonra mvc ye geçmek bir hayli zor oldu, klasik asp den yada php den yada her hangi bir dilden geçiş çok daha kolay olurdu, bundan adım gibi eminim. Şu anda da Microsoft’ un varsayılan web framework ü mvc ve gelişmeler hep bu yönde oluyor.

Evet inceden MVC ye giriş yapmış olduk, şimdi tanım olarak ne olduğuna bir bakalım.

  • Model
    • Bu kısım geleneksel yöntemlerle geliştirme yapanlar için farklı gelebilir. Bundan sonra geliştirme yaparken artık her şeyi nesne (object) olarak düşünüyoruz.(Bu cümleye başka bir yazıda uzun uzun değiniriz.) Haliyle ilgili veriye karşılık gelecek bir objeye ihtiyacımız olacak. Model dediğimiz yapının içinde veriye karşılık gelen obje ve obje ile ilgili aksiyonları içeren tanımlar yer alıyor. Örneğin; kategori adında bir objemiz olsa, ekle, güncelle, sil, listele (crud) işlemlerinin olduğu yer gibi düşünebilirsiniz.
  • View
    • Arkadan gelen verinin yani Controller dan gelen verinin gösterildiği katman, başka bir deyişle html kodlarının olduğu kısım.
  • Controller
    • Modelden aldığını View a, View dan aldığınıda Modele aktaran kısımdır. if lerimiz else lerimiz genellikle burada olur.

Mesela Asp.Net Mvc aslında temel olarak şunu yapıyor, View dan gelen veriyi (bu form ile post edilmiş bir bilgide olabilir url den gelen (queryString) bir veri de olabilir.) ilgili controller a iletiyor. Birde tersi, yani controller dan aldığını view a iletiyor. Sonra siz ne yapıyorsanız yapıyorsunuz.

Konunun özeti aslında aşağıda göreceğiniz karmaşıklığı gidermek. Kodu şuradan aldım.

<html>
<head>
	<title>Ben bir sayfayım</title>
</head>
<body>
	<table width="400" border="0" cellspacing="0" cellpadding="2">
	  <tr>
	    <td width="50"><strong>ID</strong></td>
	    <td width="132"><strong>İsim</strong></td>
	    <td width="206"><strong>Soyisim</strong></td>
	  </tr>
	  <?PHP
	  $calistir = mysql_query("select * from defter order by defter_id") or die("Hata Olustu!");
	  while($oku=mysql_fetch_assoc($calistir))
	  { 

	  	burada if ler else ler havada uçuşuyor.
	  	kim bilir belki yeniden bir sorgu çalışıyor falan
	  ?>
	  <tr>
	    <td><?PHP echo $oku['defter_id']; ?></td>
	    <td><?PHP echo $oku['defter_isim']; ?></td>
	    <td><?PHP echo $oku['defter_soyisim']; ?>

	    	<%
	    		burayada her an if else gelebilir.
	    	%>

	    </td>
	  </tr>

	  <%
	  	burayada switch case gelsin, yetmezse bir db bağlantısı daha gelsin.
	  %>

	  <?PHP } ?>
	</table>

</body>
</html>

Yukarı da ki gibi bir düzende neyin nerede olduğunu anlamak zaten başlı başına bir sorunken, aynı şeyi defalarca yazmak ve bir hata çıktığında tüm sayfalarda bunu düzeltmek işkenceden başka bir şey değil. İşte Mvc ile bu dağınık ve karışık geliştirme işini düzenli ve daha anlaşılır bir hale getiriyoruz. Şunu da belirtmekte fayda var, gerçek hayatta yukarıda ki kodun bin beterleriyle uğraşıyorduk. Yüzlerce satır html ve diğer kod parçaları iç içe geçmiş, tam bir keşmekeş..

Ne kadar yazarsam yazayım uygulama yapmadan, kod yazmadan bazı şeyleri anlatmak mümkün değil. Bu sebepten dolayı ilerleyen yazılarda tekrar tekrar değineceğiz buralara.

Konuyu çok dağıtmak istemiyorum aslında ama özellikle javascript tarafında görünce şaşırmayın diye MV* ifadesini de buraya iliştireyim. Yeri geldiğinde detayına gireriz.

Aşağıda çeşitli dillerin mvc framework lerinin adreslerini paylaşacağım, bu adresleri incelediğinizde söz dizimi (syntax) dışında bir farklılık olmadığını göreceksiniz. Unutmadan, bazı frameworkler içinde orm (bu konuyada zamanı geldiğinde kafa göz gireceğiz) araçlarını ve işleri kolaylaştıracak araçlarda içeriyorlar, bunlar kafanızı karıştırmasın.

Evet bu yazıyla birlikte modern web dünyasının en popüler konularından biri olan MVC konusuna bir başlangıç yaptık. Umarım faydalı olmuştur, bir sonraki yazıda görüşmek üzere, hoşçakalın..