Anasayfa » 1. Tasarım Kalıplarına Giriş

1. Tasarım Kalıplarına Giriş

by Levent KARAGÖL
10 dakikalık okuma süresi

Bu makaleyle birlikte, uzun soluklu tasarım kalıpları (design patterns) serimize başlıyoruz. Uzman junior ile senior developer arasındaki farkı ortaya çıkaran tasarım kalıplarına neden ihtiyaç duyduğumuz ve bize ne fayda sağlayacağı gibi konuların üzerinden geçtikten sonra “Pattern” ve “Anti-Pattern” kavramlarını inceleyecek ve sonu yazılım mimarlığına çıkan serüvenimize başlayacağız.

Not: Tasarım kalıpları her ne kadar salt JavaScript ile uygulanabilir olsa da, Interface ve benzeri kısıtlamalar JavaScript’de bulunmadığı için bu seriyi TypeScript üzerine inşa edeceğiz. Bu konuda eksiği olanlar TypeScript serimizden faydalanabilirler.


Sürekli Gelişim ve Ortak Miras

Öncelikle bir gerçeği kabul edelim. Yazılım bilgisayarın, bilgisayar elektroniğin, elektronik elektriğin, elektrik de fiziğin üzerine inşa bir bilim dalıdır. Her ne kadar çevremizden bilgisayar başında oyun oynayan, henüz gelişimini tamamlayamamış ergen muamelesi görüyor olsak da aslında hepimiz birer bilim insanıyız.

Bilim insanlığın ortak mirasıdır. Bilim, bizden öncekilerin bulduklarını geliştirdiğimiz ve bu mirası bizden sonrakilere teslim ettiğimiz için sürekli gelişmeye devam eder. Eğer herkes tekerleği yeniden icat etseydi, şu anda birbirimize tekerlek yuvarlamaktan daha ileriye gidememiş olurduk.

“Eğer ki diğerlerinden ötesini görebildiysem, bu devlerin omuzlarında yükseldiğim içindir”

Isaac Newton

Makalenin kapağında yer alan ve gençliği oldukça kibirli geçen Isaac Newton‘ın yaşamının ilerleyen zamanlarında sarf ettiği bu sözler, aslında gelişimin temel anahtarını bize en net şekilde ifade ediyor.

Yazılım diğer sektörlere nazaran her ne kadar emekleme aşamasında olsa da bu sektördeki bilgi, dünya tarihinde diğer hiçbir sektörde görüşmemiş bir hızda ve çapta yayılıyor, paylaşılıyor. Bundan gurur duyarak ifade ediyorum ki, biz yazılımcılar ne zaman işe yarayacak bir şey bulsak, aklımıza gelen ilk soru, “Bunu acaba bloğumda mı yazsam yoksa vakit kaybetmeyip doğrudan sosyal medyada mı paylaşsam?” oluyor. Hiçbir karşılık beklemeden, hiç tanımadığımız insanlarla açık kaynak kodlu projelere giriyor ve emek sarf ediyoruz. Bizden öncekilerin bulduklarını kendi malımız gibi kullanırken hiç çekinmiyoruz ve bir taktir karşılığında kendi bulduklarımızı da hiç düşünmeden ortaya atıyoruz. Çünkü bildiğimiz tek yol bu.

“This Is The Way”

Mandalorian


Bu yüzden de bizim sektörümüz, dünya tarihinde eşi görülmemiş bir hızda ilerliyor. Bir yıl önce bizi şaşkına çeviren buluşlar, bir yol sonra demode olarak bir kenara atılıyor. Daha birkaç yıl önce sesli asistanlara fıkra anlattırırken, şimdi yapay zekanın bizim adımıza yazdığı kodu beğenmeyip şikayetçi oluyoruz.

Eşi benzeri görülmemiş bu ilerlemenin temel sebebi, ortak mirasa sahip çıkmamız ve bilgi paylaşımındaki inanılmaz gönüllülüğümüzden geçiyor.


Tasarım Kalıpları Nedir ve Ne İşe Yarar?

Peki bu anlatılanların tasarım kalıpları ile ne alakası var?

Yazılımcılar olarak çok farklı projelerde çalışıyoruz. Kimimiz web uygulamaları yazıyor, kimimiz oyun geliştiriyor, kimimiz robotik üzerinde çalışıyor, kimimiz yapay zeka ile Skynet’i üretmeye çalışıyor vs. Çıktılar ne kadar farklı olursa olsun, aslında temelde hepimizin sıkıntıları ve bunların üstesinden gelmek için izlediğimiz yöntemler çok da farklı değil.

Hepimiz istiyoruz ki;

  • Yazdığımız kod büyüdükçe içinden çıkılmaz hale gelmesin, kontrolü kaybetmeyelim
  • Düşünmeye sonradan vakit bulabilen müşterilerimizin ek talepleri yüzünden kodun yarısını revize etmek zorunda kalmayalım
  • Yarım saatlik geliştirme sonrasında test ekibini bir hafta meşgul etmeyelim
  • Birisi bizden etki analizi istediğinde sırt ve omuz ağrısı, sol kolda uyuşma ve nefes darlığı gibi şikayetlerimiz olmasın
  • Bizden sonra projeyi devralacak çalışma arkadaşlarımız, yakın akrabalarımızın isimlerini saymadan çalışmaya devam etsin
  • Geçen sene bu sıralar yazdığımız koda bakarken, emekliliğimiz gözümüzün önünden geçmesin

Tüm bu talepler ve daha fazlası yazılım tarihinin genel sorunlarıydı ve bizim gibi bizden öncekilerin de başından geçti. Elbette bu sorunlara çözümler bulundu, zaman içerisinde daha da iyileştirildi ve az önce bahsettiğim ortak mirasa dahil edildi.

Çözümleri kendi başımıza bulup onlarca yıllık sıkıntıları tekrar tecrübe etmek istiyorsak, elbette insan özgür bir varlık ve düşük seviyedeki acının insana zevk verdiği de bir gerçek (Bunun bir eğri grafiği vardı ama şimdi bulamadım). Ancak bilgisayar dışında da bir hayat var ve zaman ayırmamız gereken başka konular da söz konusu. Ayrıca milyar adam-günlük bilgi birikimi ile karşı karşıyayız. En doğru çözümü bulmayı ummak, aklı başındaki her insan için fazla iyimser olur. Kendine güvenin de bir sınırı var yani.

Yazılımda sık yaşanan sıkıntılar ve ihtiyaçlara, uzun yıllarca test edilmiş ve iyileştirilmiş, güzelce de dokümante edilmiş ve ortak mirasa dahil edilmiş çözümlere “tasarım kalıpları” ya da “design patterns” diyoruz.


Tasarım Kalıpları Derken?

Öncelikle burada muhtemel bir yanlış anlaşılmayı ortadan kaldıralım. Tasarım kalıpları denince, Gang of Four olarak geçen ve Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides isimlerindeki dört mimardan oluşan grubun 1994 yılında çıkardığı ve 23 tasarım kalıbını içeren yayını akla geliyor. Elbette bu insanlar ortak mirasa çok ciddi bir katkı sağladılar ve önerdikleri kalıplar bugün dahi hala kullanılıyor ve pek çok mimari tasarımın temelini oluşturuyor.

Ancak bu yayının üzerinden yaklaşık 30 yıl geçti ve bu süreçte ortak mirasa pek çok yeni tasarım kalıbı eklendi. Sadece konunun anlaşılması için birkaçının ismini sayacak olursak; MVC, CQRS, Event Sourcing, Ambient Context Pattern, Circuit Breaker, Bulkhead Pattern, Service Locator, Retry Pattern, Backends for Frontends (BFF), Sidecar Pattern, Feature Flags, Throttling Pattern, Service Mesh, Concurrency Control Pattern, Eventual Consistency, Idempotent Receiver, Saga Pattern… Bu liste böylece uzayıp gider.

Biz de Gang of Four’un temel 23 tasarım kalıbı ile işe başlayacağız, çünkü diğer kalıpları anlamak ve belki de kendi tasarım kalıplarımızı inşa etmek için bunların mantıklarını anlamak çok önemli. Ancak sonrasında ortak mirasa katılan diğer kalıplarla devam ederek yazılım mimarlığına giden yolda repertuarımızı genişleteceğiz.


Peki Anti-Pattern Nedir?

Seriye başlamadan önce sık duyacağınız bu terime de açıklık getirelim. Kelime anlamı olarak desen veya kalıp anlamına gelen “Pattern” yazılım geliştirme dünyasında, yukarıda bahsettiğimiz ortak mirasta yer alan çözüm önerilerine verilen genel isim olarak geçer. “Anti-Pattern” ise bu önerileri dikkate almayıp doğrudan kendi bulduğu çözümlerle devam eden, ancak bu konuda başarılı olamayıp, kısa vadede çözüm gibi gözükse de uzun vadede sorundan daha büyük sorunlara yol açan yöntemlere verilen genel isimdir.

Özetle “Anti-Pattern“, bizden öncekilerin düştüğü ve bizim de düşmememiz için bir kenara yazdıkları hatalardır. Sık karşılaşılan birkaç anti-pattern saymak istersek;

  • God Object: Çok fazla sorumluluğu ve işlevselliği bünyesinde barındıran, karmaşık ve geniş bir sınıftır. Bu tür sınıflar, kodun bakımını ve anlaşılmasını zorlaştırır.
  • Singleton Abuse: Singleton kalıbının gereksiz yere ve kötü bir şekilde kullanılmasıdır. Bu durum, global değişkenlere benzer sorunlara ve bağımlılık karmaşasına yol açar.
  • Spaghetti Code: Yapısı düzensiz, karmaşık ve anlaşılması zor olan kod. Bu tür kodlar, bakım ve değişiklik yapmayı zorlaştırır.
  • Golden Hammer: Bir yazılım geliştiricinin bildiği veya favori bir teknolojiyi, uygun olmayan tüm sorunlara uygulama eğilimidir.
  • Cargo Cult Programming: Anlaşılmadan, başkalarının yazdığı kodların veya kütüphanelerin sorgulanmadan kullanılmasıdır ki, sonradan ortaya çıkabilecek hatalara ve uyumsuzluklara neden olur.
  • Magic Numbers and Strings: Anlamsız sayılar ve metinlerin doğrudan kod içerisinde kullanılmasıdır. Sabitler veya enum kullanılmayan bu yöntem, kodun okunabilirliğini ve anlaşılmasını zorlaştırır.
  • Premature Optimization: Yazılımın performansını daha kod yazma aşamasında, gereksiz ve karmaşık optimizasyonlar yaparak iyileştirmeye çalışma eğilimidir. Bu hata, kodun karmaşıklığını artırır ve bakımını zorlaştırır.
  • Copy-Paste Programming: Kodun tekrar kullanımını sağlamak amacıyla, aynı veya benzer kod parçalarının kopyalanıp yapıştırılmasıdır. Bu hata da, hataların ve uyumsuzlukların yayılmasına sebep olur ve kodun bakımını zorlaştırır.
  • Hardcoding: Değişken değerlerinin, yapılandırma ayarlarının veya dış bağımlılıkların doğrudan kodda tanımlanmasıdır (Allah ıslah etsin).
  • Not Invented Here (NIH) Syndrome: Mevcut, denenmiş ve test edilmiş dış kaynakları veya kütüphaneleri kullanmak yerine, her şeyi sıfırdan yazma eğilimidir. Bu kronik hata da gereksiz zaman kaybına ve potansiyel hatalara neden olur.

Bunlar ve çok daha fazlası, ortak mirastan nasibini almak istemeyen uzman junior yazılım geliştiricilerin düşmeye yatkın olduğu tuzaklardır. “Pattern” konusunu öğrenmek kadar “Anti-Pattern” konusunda bilgi sahibi olmak da çok önemlidir. Yeri geldikçe makalelerimizde bunlara da yer vereceğiz.


Böylece tasarım kalıplarına giriş makalemizin sonuna gelmiş ve tasarım kalıplarına giriş yapmış olduk. Bir sonraki makalemizde yazılım tasarım prensiplerini inceleyeceğiz.

Herkese iyi çalışmalar…

İLGİNİZİ ÇEKEBİLİR

Bir Yorum Yaz