Yeni Şeyler (3) - Trello, Bootstrap, OOP, Katmanlı Mimari, Dependency Inversion - Dependency Injection

{Kamil Kaplan} ®
7 min readJun 3, 2020

--

Merhaba,
Bu yazı bir önceki yazmaya başladığım serinin devamı niteliğindedir. Bu yazıda
Trello, Bootstrap, OOP, Katmanlı Mimari ve Dependency Inversion -Dependency Injection kavaramları incelenecektir.

Bu arada yazımı beğenmeyi ve paylaşmayı, bi de beni takip etmeyi unutmayın :)

🔰 Trello
Trello
hayatınızı ve işlerinizi organize edip takip etmenizi sağlayan genel anlamda bir proje yönetim aracıdır. Yapacağınız işleri, yaptıklarınızı ve hedeflerinizi aynı ekranda görerek işlerinizi organize etmenizi sağlıyor. Aynı zamanda ekip ile yürütülen projelerde de ekip elemanlarına görevler atayabilir, görevler için bir tarih atayabilirsiniz. Bu özelliklere ister web arayüzünden ulaşabilirsiniz ister ise kullandığınız mobil cihaz üzerindeki uygulaması sayesinde kullanmaya başlayabilirsiniz

Trello kullanmanın amacı tamamen proje yönetimi gerçekleştirmektir.

Proje yönetim sistemleri ile artık yapacaklarınızı aklınızda değil gözünüzün önünde tutacaksınız ve beyninizi sadece işi yapmaya odaklayacaksınız.

Trello 3 ana parametre üzerinde ilerleyen bir sistem. Panolar, Listeler, Kartlar
1. Panolar
aslında Trello açısından projeler anlamına da geliyor. Her bir pano kendi içinde yönetimi sağlanan farklı projelerdir
2. Listeler, pano içerisinde yapılacak işim adımlarını oluşturmak için kullanılır. (Yapılacaklar, Yapım Aşamasında, Yapıldı) vs…
Bu listeleri kendimize ve projemize göre düzenleyip çoğaltarak işleri içlerine yerleştirebilirsiniz. Bu sayede hangi işin hangi durumda olduğunu görebilirsiniz. Tabi burada iş dediğimiz de
kartlar oluyor.
3. Kartlar, Trello üzerinde listelere ekleyeceğimiz kartlar sayesinde yapmamız gerekenleri listeleyebilir ve işin süreci değiştikçe ilgili listeye çekebiliriz. Kartlar aynı zamanda özelleştirilebilir yapıda tasarlanmıştır. Kartlar üzerinde aşağıdaki eylemleri gerçekleştirebiliriz :
- : görevli atayabiliriz, bu sayede birden fazla kişi aynı projede farklı görevlerden sorumlu olacaktır.
- : görsel ekleyerek görevi detaylandırabilirsiniz.
- : bitirme tarihi atarak görevliyi çalışmaya itebilirsiniz.
- : görev içinde maddeler belirleyerek bunlardan kaç tanesi yapıldı görebiliriz.
- : etiketler atayarak önem sıralaması yapabilirsiniz.
- : görev altında yorum yaparak durum hakkında bilgi alabiliriz.

Aslında görebileceğiniz gibi çok farklı amaçlarla kartları düzenleyip projenizi düzenleyebiliriz.

🔰 Bootstrap
- Extra Small
: telefon dikey <576 - col-
- Small : telefon yatay >=576 - col-sm
- Medium : tablet dikey >=768 - col-md
- Large : tablet yatay >=992 - col-lg
- Large : bilgisayar veya tv >=1200 - col-xl

🔰 OOP (Nesne Yönelimli Programlama)
Nesne yönelikli programlama
ya örnek verecek olursak gerçek hayatta gördüğümüz araba, radyo, bina…vb gibi nesnelerin bilgisayar ortamına aktarılmasına denir.

-- Sağladığı kolaylıklar
-: g
erçek dünyadaki nesnelerin tasarımları sınıf içinde yapılır.
-: sınıftan nesne üretilip değişiklik yapılmak istendiğinde tüm programda değişiklik yapmak gerekmez sadece oluşturulan nesnenin sınıf içinde değişiklik yapmak yeterlidir.
-: oluşturulan nesneler birbirinden bağımsız olduğu için bilgi gizleme olanağı artar.
-: nesne oluşturma bir sınıf içerisinde gerçekleştirilir ve bu kodlar başka projelerde kullanılabilir.
-: sınıflar oluşturarak daha az kod oluşturup daha fazla iş yapıp kod tekarı önlenir.
-: kod tekrarı önlediği için geliştirme sürecinin verimliliğini artırır.

-- Sınıf : gerçek dünyadaki nesnelerin özellikleri ve davranışları sınıflara aktarılır. Bu durumların sınıflara aktarılması metodlarla olur. Sınıfta tanımlanan metot ve değişkenlere sınıfın üyeleri denir. Sınıf soyut bir kavramdır doğrudan kullanılamaz nesne oluşturup kullanabiliriz.

-- Nesne : içinde veri saklayan ve bu veriler üzerinde işlem yapacak olan metodlar bulunduran bileşenlerdir. Nesneler her uygulamada tekrar kullanılabilir. Nesne oluşturduğumuzda hafızada yer kaplar.

-- OOP Özellikleri : nesne yönelimli programlamada 4 temel özellik vardır. Bu 4 özellikten birini sağlamayan programlama dili nesne yönelikli programlama dili sayılmaz. ( Soyutlama, Kapsülleme, Miras Alma(Kalıtım), Çok Biçimlilik)

-: soyutlama(abstraction), bir sınıfta davranış ve özelliklerin tanımlanmasına diyoruz.
Örneğin araba sınıfında rengi, modeli, tekerlek sayısı, motor gücü, özellikleridir. Hızlanması, fren yapması, durması davranışlarıdır ve metotlar ile tanımlanır.

-: kapsülleme(encapsulation), davranış ve özellikler sınıfta soyutlanarak kapsüllenir. Kapsülleme ile hangi özellik ve davranışın dışarıya sunulup sunulmayacağını belirleriz.
Örneğin İnsan sınıfında yemek alışkanlığı bizi iliglendirmiyorsa bunu kapalı (private) yapıp gizleriz. Ancak isim soyisim gibi bilgiler bizi ilgilendirdiği için bunlar açık bırakılır. Bu olaya bilgi saklama yani kapsülleme denilmektedir. Bilgi saklama erişim belirteçleri (public, private, protected) ile gerçekleştirilir.
public : herkesin kullanabileceği özellik ve davranışlardır
private : sadece kendi sınıfta kullanılabilen özellikler ve davranışlardır
protected : sınıf içinde ve miras alınan alt sınıflarda kullanılır.

-: kalıtım(inheritance), sınıflar birbirinden türeyebilir. Alt sınıf üst sınıfın özelliklerini alabilir.
Örneğin araba ve bisiklet sınıflarında ortak özellik olarak tekerlek sayısı, hızı… gibi özelliklerini tekrar yazmak yerine bu özellikleri içeren bir sınıf oluşturup miras alabiliriz. Bir sınıftan birden fazla miras alınıyorsa buna çoklu kalıtım denir.

-: çok biçimlilik(polymorphism), alt sınıflar üst sınıfın gösterdiği davranışları göstermek zorunda değildir. Alt sınıfların farklı davranışları göstermesine Çok biçimlilik denilmektedir.
Örneğin Gemi ve araba sınıflarını ele aldığımızda bunların hareket tipleri bulunmaktadır. Gemi su üzerinden giderken araba karada hareket etmektedir. Kısaca farklı nesnelerin (araba ve gemi gibi) aynı olaya (hareket tipine) farklı şekilde cevap vermesidir.

🔰 Katmanlı Mimari
Yazılım projelerimize yeni isteklerin implemente edilmesi projemizin daha karmaşık bir yapıya dönmesine sebep olmaktadır. Bu karmaşık yapıdan dolayı projenin okunabilirliği azalmaktadır. İşte bu karmaşayı yönetebilmek için katmanlıı mimari ortaya çıkmıştır.

Katmanlı mimari projelerimizi belirli bir standart ve düzene göre geliştirmemizi sağlayan, kodun okunabilirliğini arttıran, projelerimizin daha derli toplu olmasını sağlayan ve hata yönetimini daha kolay hale getiren bir yapıdır.

Yazılımlarda veriye nasıl erişileceği, üzerinde nasıl işlemler yapılacağı ve bu işlemlerin kullanıcıya nasıl gösterileceği gibi işlemleri katmanlı mimari ile çok iyi bir şekilde yönetebiliyoruz. Katmanlı mimari sayesinde bu yapıyı parçalara ayırarak bu işlemlerin daha iyi yönetilebilmesini sağlıyoruz.

Projemizi parçalara bölerek projemizi sürdürülebilir duruma getiriyoruz.

Katmanlı mimari temelde 3 katmandan oluşmaktadır. Bu 3 katman genelde her projenizde olması gereken katmanlardır. Siz bu 3 katmandan daha fazla bir katmanlı yapıda oluşturabilirsiniz buna da çok katmanlı mimari denilmektedir. Hadi gelin temeldeki 3 katmanı inceleyelim.

Katmanlı Mimari

Data Access Layer : bu katmanda sadece veritabanı işlemleri yapılmaktadır. Bu katmanın görevi veriyi ekleme, silme, güncelleme ve veritabanından çekme işlemidir. Bu katmanda bu işlemlerden başka herhangi bir işlem yapılmamaktadır.
Business Layer : bu katmanda iş yüklerimizi yazıyoruz. Öncelikle şunu söylemeliyim bu katman Data Access tarafından projeye çekilmiş olan verileri alarak işleyecek olan katmandır. Biz uygulamalarımızda Data Access katmanını direk olarak kullanmayız. Araya Business katmanını koyarak bizim yerimize Business’ın yapmasını sağlarız. Kullanıcıdan gelen veriler öncelikle Business katmanına gider oradan işlenerek Data Access katmanına aktarılır. Bu katmanda ayrıca bu verilere kimlerin erişeceğini belirtiyoruz.
Presentation Layer : bu katman kullanıcı ile etkileşimin yapıldığı katmandır. Burası windows form’da olabilir, web’te olabilir veya bir console uygulamasıda olabilir. Burada temel amac kullanıcıya verileri göstermek ve kullanıcıdan gelen verileri Business Katmanı ile Data Access’e iletmektir.
Entities Layer : bu katmanda ise genelde classlarımızı tanımlıyoruz. Bu katmanda proje boyunca kullanacağımız ana classlarımızı belirliyoruz yani gerçek nesnelerimizi belirlediğimiz yer burası. Daha anlaşılabilir bir şekilde anlatmak için birkaç örnek vereyim. Örneğin bir Stok veritabını sistemi yapmak istiyorsunuz. Bu sistemde Ürün bilgileriniz, Kategori bilgileriniz ve Satış bilgilerinizin olduğunu varsayalım. İşte bu bilgilerinizi burada tanımlıyoruz. Bu katmanı hem Data Access hem Business hem de Presentation katmanı kullanmaktadır.

🔰 Dependency Inversion - Dependency Injection
Yazılım projelerinde daima class lar ile çalışırız. Nesnelerimizi class lar içerisinde tanımlarız ve bunları bazı yerlerde new leyerek kullanırız. İşte temel olay burada Eğer bir class ınızı bir yerde new leyerek kullanıyorsanız bilin ki siz o classınıza bağımlısınız. Projede bir değişklik yapmak istediniz ve o new leyerek kullandığınız classınız vardı ya onu değil de yerine daha iyi yazdığınız bir classı kullanmak istediniz bilin ki yandınız arkadaşlar. Komple projedeki kod yapınızı değiştirmeniz gerekecek ki bu da solid prensiplerine aykırıdır. Solid in bir prensibi derki eğer projeye yeni bir şey ekleyecekseniz ekleyeceğiniz bu şey diğer kodlarınızı etkilememelidir. Peki nasıl çözeceğiz bu durumu? Bağımlılığı ortadan nasıl kaldıracağız? İşte bağımlılıkları biz soyut nesneler kullanarak ortadan kaldırıyoruz. Yani arkadaşlar burada interface leri kullanıyoruz.

Bağımlılıkları ortadan kaldırmayı Dependency Injection denilen teknik ile gerçekleştiriyoruz.

Eğer bir class’ı çıplak görüyorsanız bundan korkun. Bu classlarınızı ilk yazdığınız zaman başınıza dert açmaya bilir ama projeye yeni eklentiler ekleyeceğiniz zaman emin olun ki size sorun çıkartacaklardır. Çıplaklıktan kastım bir abstract nesne den türetilmemeleridir. Projelerinizde class larınızı new lemeden interface leri kullanarak bu classlarınız arasında geçiş yapabiliriz. Böylece sürdürülebilir bir yazılım projesi geliştirmiş olursunuz. Hadi gelin basit bir örnekle bu anlattıklarımı daha anlaşılabilir kılalım.

Senaryomuz : patron geldi ve dedi ki Text Dosyasına loglama işlemi yapacağız. Siz de yazılımcı olarak düşündünüz ki Patron hoş diyor da ya proje büyürse ve Text dosyasına değil de Database’e de loglama yapmamızı isterse o zaman ne yapacağız dediniz. İşte böyle bir durumda projenin sürdürülebilir olması için İnterface leri kullanarak bizim ilk başta oluşacak olan Text Dosyasına bağımlılığımızı daha oluşmadan ortadan kaldıracağız. Hadi kodlamaya geçelim bunu.

Görüldüğü üzere biz burada TextLogger classımıza bağımlı durumdayız. Patron’un Bizden artık Database’e loglama yapmak istediğini düşünürsek gidip TextLogger’ı DatabaseLogger olarak değiştirmemiz gerekecekti. Tabi burada örnek olsun diye gösterdim sadece bir yeri değiştireceğiz ama gerçek bir projede bu TextLogger her yerde kullanılmış olabilirdi bunu da değiştirmek çok masraflı olacaktı. İşte şimdi bir İnterface tanımlayarak asıl olayımızı gerçekleştirelim ve bağımlılıktan kurtulalım.

Burada ILogger adında bir Interface oluşturuyorum ve hem TextLogger hem de DatabaseLogger bu interface ten impelemte ediliyor. Main’de ILogger türünde değişken oluşturuyorum ve bunu new lediğim zaman görüyorsunuz TextLogger da olabilir DatabaseLogger da. Burada Interface’i new lemiyoruz ondan implemente edilmiş olan classlarımızı new lemiş oluyoruz. ILogger interface ini kullanarak biz bu iki classımız arasında istediğimiz gibi geçiş yapabiliriz. Normalde eee hani new lersek bağımlı oluyorduk diyebilirsiniz. Arkadaşlar burası son nokta burada hangi tür ile çalışacağımızı söylemek zorundayız. Ancak biz bunu burada böyle new leyerek değil de “IoC Container”ları kullanarak bu atama işlemini gerçekleştiriyoruz.

Bağımlılıkların Ortadan kaldırılması için kullanılan terimler.

20 ile 30 yaş arası kafanı, 30 ile 40 yaş arası cebini, 40 ile 50 yaş arası ruhunu doldur.

Yukarıda yazmış olduğum araçları elimden geldikçe anlatmaya çalıştım. Bunlardan herhangi birini daha önce kullandıysanız, fikirlerinizi benimle paylaşırsanız çok sevinirim. Ayrıca beğeninizi alkışlarınızla 👏 göstermekten geri durmayın lütfen.

Bir sonraki makalede görüşmek ümidi ile sağlıcakla kalın.

--

--