Kurumsal Web Uygulamaları Geliştirme

Kurumsallık

Merhaba Arkadaşlar,

Sizlerle daha önce şurada, Asp.Net MVC 5 ile blog uygulaması geliştirmiştik. Bu uygulamamız, çok uzun süren bir seri olmasına rağmen, kurumsal bir projenin sahip olması gereken bazı şeylerden yoksun olmuştu.

Aslında buradan da anlaşılıyor ki, profesyonel bir uygulama geliştirme gerçekten yazı dizilerine sığdırılamayacak kadar, komplike bir mimari gerektiriyor.

İnşallah, bundan sonraki süreçlerde, ileri düzey pek çok uygulamalar, anlatımlar geliştirmeye çalışacağız. İstedim ki, bu anlatımlardan önce teorik olarak kurumsal bir uygulama nasıl olmalı, nelere sahip olmalı bir inceleyelim. Bunlarla beraber, günümüzdeki profesyonel uygulamalarda hangi teknikler, kütüphaneler kullanılıyor, bunların da üzerinde önemle duracağız. Dosya konumu, dil bağımsız tutmaya çalışacağım (Java,C#,Phyton vs.) .Konularımızı sorun, çözüm, yeterlilik gereksinimleri, kullanılabilecek kütüphaneler şeklinde inceleyeceğiz.

Katmanlı mimari

GENEL MİMARİ

Sorun

Öncelikle bir uygulamaya başladığımızda, uygulamamızın kontrolünün çok iyi yapılabiliyor olması gerekir. Biz kafamızda projeyi oturturuz ve hızlı bir şekilde kodlamaya başlarız. Ancak bir zaman sonra proje büyümeye başladığında, projenin yavaş yavaş kontrolümüzden çıkmaya başladığına şahit oluruz. Hangi dosyalar, hangi yapının altındaydı? Hangi metodum ne iş yapıyordu? Az önce saydığım sorularla karşılaşmaya başlarız. Birden çok geliştiricisi olan uygulamalarda ise, çok daha büyük sorunlar çıkması kaçınılmaz olacaktır. Birden çok kişi projenin belirli bölümlerinde çalışırken, sık sık çakışmalar yaşayacak, birbirlerine bağımlı olduklarından, zaman zaman A kişisinin yazdığı kod, B kişisinin yazdığı koda göre çalıştığında, eğer B kişisi yazdığı kodda değişiklik yaparsa, A kişisinin yazdığı kod işlevsiz ya da hatalı bir hale gelebilecektir.

Çözüm

İşte bu noktada projenin sürekli kontrol altında tutulabilmesi için, katmanlı mimariyi kullanmak zorundayız. Tüm yapımızı eğer parçalara bölersek, bu parçaları anlaşılır şekilde isimlendirirsek, klasör yerleşimlerini tutarlı bir şekilde sağlarsak, projemize olan hakimiyetimizin iyi bir şekilde korunabildiğini görebileceğiz. Mesela Asp.Net Mvc'de View klasörünün altında, yalnızca Html, View sayfalarımızın olduğunu bilirsek, düzeni korumuş, bir şey aradığımızda da nereye bakacağımızı biliyor oluruz. Birden çok geliştiricisi olan uygulamalarda, her geliştirici projenin belirli katmanlarında çalışacaklarından dolayı, çakışmalar yaşanmayacak, bununla birlikte diğer katmanda ne olduğu geliştiricileri ilgilendirmediğinden, kendi kodlarını rahatlıkla geliştirebiliyor olacaklar. Bu noktada katman içerisindeki değişiklikler, diğer katmandaki geliştiricileri etkilemeyecektir (katman yazımlarında, interface vs. yapılar düzgün bir şekilde kullanıldığında).

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Nesne yönelimli programlama (object oriented programming),
  • (tercihe bağlı) Bağımlılıkların dışarıdan enjekte edilmesi – tasarım deseni (dependency injection pattern)

​Kullanılabilecek Kütüphaneler

  • Autofac (.Net),
  • Ninject (.Net),
  • Google Guice (Java),
  • Pico Container (Java),
  • PHP-DI (PHP),
  • Pimple (PHP)

Veritabanı

VERİTABANI

Sorun

Genellikle performans amacıyla, saf Sql sorgularıyla ve Stored Procedure'lerle veritabanı safhası halledilmeye çalışılır. Bu yöntem, performans açısından gerçekten faydalı bir durum. Ancak bu veriye ulaşım noktasında kodların hazırlanmasında, gerçekten zahmetli bir yöntem. Düşünsenize Sql Management Studio'da (Mssql) tarafında yada Mysql Workbench (Mysql) tarafında, Stored Procedure'lerini yazıyorsunuz, bu sorgulardan gelen verileri, programınızda nesne yönelimine uygun bir şekilde almanız gerekiyor. Gelen veriyi tam olarak bilmeniz lazımki, sınıflarınızla eşleştirebilesiniz. Bu süreç, gerçekten oldukça zahmetli ve karışık olacaktır.

Çözüm

Veritabanımızdan gelen verileri, direkt olarak oluşturduğumuz sınıflar halinde alabilmek ne kadar mükemmel olur değil mi? Veritabanımızında, projemizin içerisinde olması ve direkt ulaşılabilir olması, müdahalelerinin çok rahat olması gerçekten mükemmel bir durum. Bu ihtiyacımıza cevap veren sistemlere Orm araçları diyoruz. Özellikle .Net tarafında geliştirmesi tam gaz süren Entity Framework'un bizlere sunduğu, Code First mimarisi gerçekten çok kullanışlı. Veritabanınızı tamamen C#, Vb.Net dilinde kodluyorsunuz. Bütün veritabanı sistemi elinizin altında oluyor. Sql hakkında çok az temel bilgi bile yeterli olmaktadır.

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Nesne yönelimli programlama (object oriented programming),
  • Temel veritabanı mantığı hakkında bilgi

​Kullanılabilecek Kütüphaneler

  • Entity Framework (.Net),
  • NHibernate (.Net),
  • Hibernate (Java),
  • SimpleORM (Java),
  • Propel (PHP),
  • php-activerecord (PHP)

Model

MODELLER

Sorun

Projede, veritabanını modellediğimizde, gelen verilerde, istemediğimiz veriler olabilecektir (veritabanındaki tablolara özel değerler,id vs.). Bu verileri olduğu gibi alıp, sistem içerisinde gezdirmek, web sayfasına geçirmek, aşırı bir band genişliği tüketimine, ağırlaşmaya sebebiyet verecektir. 

Çözüm

Bu sorunun çözümü için yapmamız gereken, ihtiyacımız olan veriler için sınıflar yazarak, veri kaynağından gelen veriyi bu sınıflarımıza doldurarak, gerekli yerlere iletmek olacaktır.

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Nesne yönelimli programlama (object oriented programming)

Servis

SERVİSLER

Sorun

Projemizin çeşitli alanlarından, veritabanımız ile irtibat kurmaktayız. Bu karışıklığa sebebiyet vermekte, kod tekrarı oluşturmuktadır. Veritabanı katmanımızda, değişiklikler olduğunda, veritabanı ile iletişime geçtiğimiz her yerde, değişiklikler yapmaya ihtiyaç duyacağız. Ciddi bir karışıklık ve iş gücü oluşacaktır.

Çözüm

Katmanlı bir mimaride, veritabanı ile iletişim kuran sınıflarımızı, metodlarımızı, yalıtmak ve tüm iletişimimizi bu sınıflar üzerinden yapmak, kesinlikle çok çok iyi bir yoldur. Services diye bir klasör açıp, veritabanı ile ilgili istenebilecek tüm iş akış metodlarını buraya toplayabiliriz. Örneğin, projenin her hangi bir yerinden GetCustomerById(5) şeklinde 5 numaralı id'ye sahip müşteriyi çağırabiliriz. Böylece veritabanındaki değişiklikler yalnızca servis katmanımızı etkileyecektir. Bu, kesinlikle iyi bir yöntem.

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Nesne yönelimli programlama (object oriented programming),
  • Servisleri Dependency Injection ile Controller'e enjekte etmek istersek, Dependency Injection

Metod

FONKSİYONLAR, METODLAR

Sorun

Projemizin çeşitli alanlarında çalıştırılması gereken işlemler var. Bu işlemleri hep Controller vs. içerisinde yazıyorsunuz. Ancak bir zaman sonra karmaşa ve kod tekrarı kaçınılmaz hale geliyor. 

Çözüm

Tüm iş yapan metodlarınızı, anlamlı bir şekilde, bir klasör altında sınıflar içerisine depolayabilirsiniz. Böylelikle, her metodu bir kere yazmış olursunuz. İstediğiniz her yerden istediğiniz kadar çağırmış olursunuz. Kod tekrarı olmamış, ayrıca metod içerisinde bir kere değişiklik yaptığınız zaman, otomatik olarak diğer katmanlarda bir değişiklik yapmamış olursunuz.

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Nesne yönelimli programlama (object oriented programming)

Kontrolcü

İŞ KATMANLARI, KONTROLCÜLER

Çözüm

Genelde bu kısım, Asp.Net Mvc'de Controller yapısı içerisinde kullanıldığından aslında çok fazla sorunla karşılaşmayacaksınız. Bu kısımda size tavsiyem, mümkün olduğunca, sadece servislerle ve metodlarla işlemler yapmanız. Asla veri kaynaklarınıza direkt erişimde bulunmayın. Mümkün olduğunca bu katmandaki kodları az ve öz tutmaya çalışın. 

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Kullandığı platformun, iş katmanı hakkında yeterli bilgi. (Örneğin Asp.Net Mvc'de Controller katmanı bilgisi.)

Html

ÖN YÜZLER, GÖRÜNÜMLER

Sorun

Katmanları doğru şekilde ayırmadınız ve görünüm katmanınız oldukça karmaşık görünüyor. View kısmınızda bir yığın, Server dili (C#, Php, Java vs.) kodunuz var. Html ve sunucu dilleri, iç içe hiç de hoş durmuyor. Ayrıca Css'leriniz ve JavaScript'leriniz de Html sayfası içerisinde. Sonuç tam bir karmaşa.

Çözüm

Bu katman, bir web sitesinde, bence en önemli katmanlardan birisi. Bu katman, ziyaretçinin etkileşimde bulunduğu katmandır. Bu katmandaki kodlar (sunucu tabanlı kısımlar hariç, onlar işlem sonucunda Html kodlarına çevrilir), ziyaretçi tarafından görülebilir. Ayrıca sayfa açılış performansı açısından burada okunacak veriler, çekilecek resimler de bir hayli önemli olacaktır.

Son yıllarda, web tabanlı programlamanın, fazlasıyla önem kazanmasından dolayı, JavaScript kütüphaneleri tarafında inanılmaz bir ilerleme yaşanmaktadır. Bu da bizlere, sanki masaüstü programı hazırlar gibi, web siteleri hazırlama imkanı sunmaktadır. Bunun için Microsoft'un Online Word, Excel'ine ya da Pixlr resim editorüne bakmanız yeterli olacaktır. Sayfa değişimi hiç yaşanmadan, tüm işlemler yapılabilmektedir. Bu kütüphanelerin arkasındaki teknolojiler hep Ajax tabanlı.

Jquery

JavaScript ile yapılan işlemler, genellikle sorun çıkarmaya meyillidir. Tarayıcılar arası uyum farklılıkları, JavaScript'in C# muadilleri gibi diller kadar gelişkin olmaması bizleri oldukça zorlamaktadır. Bu sorunu bizim için çözen muazzam çalışma, Jquery'dir. Jquery'siz bir web dünyası çok daha sıkıcı ve zor.

Knockout, Backbone

Öncelikle web sayfasındaki, iş akışı ile görsel kodlarınızı ayırmanız gerekmektedir. Bunun için en güzel kütüphane Knockout. Alternatif olarak Backbone'de denenebilir. Bu kütüphaneler ile Mvvm (sistemi Model-View-ViewModel olarak ayırmak, Mvc mimarisinin bir benzeri), katmanlı sayfalar tasarlayabiliyoruz. Böylelikle katmanları ayırmayı sağlamış olduk. İleriki derslerimde Knockout ile ilgili çalışmalar yapacağım.

Bootstrap

Son yılların bir diğer moda kavramı da, Responsive tasarım. Ölçeklenebilir bu tasarım ile, web sayfaları, cep telefonundan, tabletten, bilgisayardan girildiğinde, kendini otomatik olarak ölçeklendirerek, sayfanın güzel görünmesini sağlamaktadır. Bu zor işlemleri, bizim için bir nebze kolaylaştıran yapı ise, Bootstrap'tır. Eklediğimiz tüm Html elemanlarına class'lar atayarak, çok güzel tasarımlar yapmamıza imkan sağlamaktadır.

Geliştiricinin Sahip Olması Gereken Bilgiler

  • Html, JavaScript, Css bilgisi,
  • Ajax bilgisi,
  • Knockout, Backbone vs. bilgisi,
  • Responsive tasarım bilgisi,
  • BootStrap bilgisi

 

Evet, profesyonel uygulamaları nasıl inşa etmeliyiz? Bu konulara değinmeye çalıştık. Umarım yazı faydalı olur.

.Net platformu ağırlıkta uygulamalar geliştirdiğimden dolayı, anlatımım biraz .Net tabanlı oldu. Diğer platformlarda çalışan arkadaşlar, yorumlarıyla eklemeler yaparsa çok memnun oluruz.

Hepinize kolaylıklar diliyorum.