Temiz Kod ve Genel Olarak Yazılımda Bazı Kavramlar/İlkeler 2
Selamlar,
Gold Plating(Altın Kaplama)
Altın kaplama, bir ürüne veya projeye asgari gereksinimlerin veya özelliklerin ötesinde gereksiz özellikler veya işlevler ekleme uygulamasına atıfta bulunur. Bu, müşteriyi etkileme veya ürünü pazarda öne çıkarma isteği gibi çeşitli nedenlerle meydana gelebilir. Ancak altın kaplama, maliyet ve program aşınmasına yol açabileceği ve son kullanıcıya gerçek bir değer sağlamayabileceği için projeye zarar verebilir.
Waterfall Model(Şelale Modeli)
David Farley’e göre, yazılım geliştirmeye uygulanan şelale modeli, işi her aşama arasında iyi tanımlanmış teslimatlar olan bir dizi belirgin aşamaya bölerek organize etmeye yönelik aşamalı, ardışık bir yaklaşımdır. Fikir, yineleme yapmak yerine her aşamayı sırayla ele almanızdır. Bu, Agile metodolojileri 90'larda daha belirgin hale gelene kadar dominant bir fikirdi.
Dependency Inversion(Bağımlılığı Tersine Çevirme)
Bağımlılığı tersine çevirme, geleneksel bağımlılık ilişkisini ters çevirerek daha yüksek seviyeli nesneleri daha düşük seviyeli nesnelerden ayıran bir tasarım ilkesidir. Daha yüksek seviyeli nesnelerin doğrudan daha düşük seviyeli nesnelere bağımlı olması yerine, ilke her ikisinin de soyutlamalara veya arayüzlere bağlı olması gerektiğini önerir. Bu, daha düşük seviyeli bir modülün uygulanmasındaki değişiklikler daha yüksek seviyeli modülde değişiklik gerektirmediğinden kod tabanında daha fazla esneklik ve modülerlik sağlar.
Design by Contract(Sözleşmeye Göre Tasarım)
Bertrand Meyer’in “Object-Oriented Software Construction” kitabında bahsedildiği gibi nesne yönelimli paradigmayı kullanarak yazılım geliştirmeye yönelik kapsamlı bir rehberdir. Kitabın temel fikirlerinden biri, yazılım modülleri arasında açık ve net sözleşmeler oluşturmanın önemini vurgulayan “Sözleşmeye Göre Tasarım” kavramıdır. Bir sözleşme, modüllerin birlikte doğru şekilde çalışmasını ve yazılımın zaman içinde güvenilir ve sürdürülebilir kalmasını sağlayan sorumlulukları ve davranışları belirtir. Bir temas koptuğunda, hızlı başarısızlık ilkesi(fail-fast principle) onurlandırılır ve sorunlar hemen fark edilir.
Preconditions, Postconditions, and Invariants(Önkoşullar, Sonkoşullar ve Değişmezler)
Ön koşul(precondition), bir fonksiyon veya metod çağrılmadan önce doğru olması gereken bir koşuldur. Fonksiyon veya metodun girdilerinin karşılaması gereken gereksinimleri belirtir. Değişmez(invariant), meydana gelebilecek herhangi bir değişiklikten bağımsız olarak, bir programın yürütülmesi sırasında her zaman doğru olması gereken bir koşuldur. Zamanla değişmemesi gereken bir program özelliğini belirtir. Son olarak, bir son koşul(postcondition), metod çağrıldıktan sonraki zamana bağlıdır. Bunları doğruluğu sağlamak, hataları tespit etmek veya program tasarımına rehberlik etmek için kullanabilirsiniz.
Function Signature(Fonksiyon İmzası)
Bir fonksiyon imzası, adını, parametre türlerini ve dönüş türünü belirtir. Bir fonksiyonu diğerinden ayırt etmek ve fonksiyon çağrılarının doğru şekilde yapıldığından emin olmak için kullanılır.
Hashing
Hashing, değişik boyuttaki verileri sabit boyutlu bir değere eşleme sürecini ifade eder. Bir hash fonksiyonunun çıktısına hash değer veya hash kodu denir. Hash değerleri, büyük listelerde dizin tablosu olarak kullanabilirsiniz; öğeleri sırayla yinelemekten daha performanslı bir şekilde öğeleri bulmak için bir kısayol işlevi görürler.
Spaghetti Code(Spagetti Kodu)
Spagetti kodu, anlaşılması ve sürdürülmesi zor, kötü yapılandırılmış koddur. “Spagetti” adı, kodun genellikle bir tabak karışık spagetti eriştesine benzeyen bir şekilde birbirine karışmış ve bağlantılı olması nedeniyle kullanılır. Tekrarlayan veya çoğaltılmış kod ve takip edilmesi zor olabilen çok sayıda koşullu ifade, dallanma ve döngü ifadeleri içerir.
Structured Programming(Yapısal Programlama)
Yapısal programlama, bilgisayar programlarının netliğini, sürdürülebilirliğini, okunabilirliğini ve güvenilirliğini artırmak için döngüler ve fonksiyonlar gibi kontrol akışı yapılarının kullanımını vurgular. Bir programı daha küçük, yönetilebilir parçalara bölersiniz ve ardından bu parçaları yapılandırılmış kontrol akışı yapılarını kullanarak düzenlersiniz.
Polymorphic Hierarchy(Polimorfik Hiyerarşi)
Çok biçimli bir hiyerarşide, sınıflar “bir-şey-gibi-davranma” ilişkilerine dayalı bir hiyerarşik yapıda düzenlenir. Bu, daha genel sınıflardan davranışları devralan uzmanlaşmış sınıfların oluşturulmasına olanak tanır. Çok biçimli bir hiyerarşide, temel bir soyut sınıf temel görevi görür ve birden fazla somut alt sınıf tarafından paylaşılan ortak davranışı tanımlar. Alt sınıflar bu özellikleri üst sınıftan devralır ve kendi davranışlarını ekleyebilir. Alt sınıflandırma, çok biçimliliği uygulamanın bir yoludur. Ancak derleme zamanından sonra bir üst sınıfı değiştiremeyeceğiniz için katı bir yoldur.
Boolean Flags(Boolean Bayrakları)
Boolean bayrağı, yalnızca doğru veya yanlış olabilen ve ikili bir koşulun iki olası durumunu temsil eden bir değişkendir. Boolean bayrakları genellikle koşullu ifadeler, döngüler ve diğer kontrol yapıları aracılığıyla mantık akışını kontrol etmek için kullanılır.
Open-Closed Principle(Açık-Kapalı İlkesi)
Açık-kapalı(Open-closed) ilkesi SOLID’den gelen “O”dur. Yazılım sınıflarının genişlemeye açık ancak değişikliğe kapalı olması gerektiğini belirtir. Kodu değiştirmeden davranışı genişletebilmelisiniz. Bu ilke, mevcut kodu değiştirmeden yeni işlevlerin eklenmesine izin vermek için soyut arayüzlerin, kalıtımın ve polimorfizmin kullanımını teşvik eder. İlke ayrıca kaygıların ayrılmasını(separation of concerns) teşvik ederek, yazılım bileşenlerini bağımsız olarak geliştirmeyi, test etmeyi ve dağıtımı(deploy) kolaylaştırır.
State Design Pattern(Durum Tasarım Deseni)
Durum tasarım kalıbı, bir nesnenin sınıfını değiştirmeden çalışma zamanında iç durumu değiştiğinde, davranışını değiştirmesine izin verir. Her bir durumun davranışını ayrı bir sınıf içinde kapsülleyen geçerli durum nesneleri kümesini tanımlarsınız. Durum nesneleri, bağlam nesnesinin davranışını uygun durum nesnesine devretmesine izin veren ortak bir arayüz(interface) sunar. Bağlam nesnesinin durumu değiştiğinde, basitçe uygun durum nesnesine geçer. Bağlam nesnesi ile durum nesneleri arasında gevşek bir bağlantı(loose coupling) sağlar ve bağlam nesnesinin daha esnek ve genişletilebilir olmasını sağlayarak açık-kapalı(open-closed) ilkesini destekler.
Strategy Design Pattern(Strateji Tasarım Deseni)
Strateji tasarım deseni, değiştirilebilir algoritmalar ailesini tanımlar, her birini kapsüller ve bunları çalışma zamanında değiştirilebilir hale getirir. Desen, bir istemci nesnesinin, çalışma zamanındaki belirli bağlam veya duruma göre kullanılacak bir dizi algoritma arasından seçim yapmasına olanak tanır. Ayrıca istemci nesnesi ile stratejiler arasında gevşek bir bağlantı(loose coupling) sağlar ve istemci nesnesinin davranışını, uygulamasını etkilemeden genişletmenizi veya değiştirmenizi kolaylaştırır.
Ninja Code(Ninja Kodu)
Ninja kodu (zeki kod veya akıllı kod olarak da bilinir), akıllıca yazılmış ancak anlaşılması veya sürdürülmesi zor olan kod anlamına gelir. Genellikle, daha verimli ve erken optimize edilmiş kod yazmak için gelişmiş programlama tekniklerini veya belirli dil özelliklerini kullanmaktan hoşlanan deneyimli programcılar tarafından oluşturulur. Ninja kodu etkileyici olabilir ve diğer kodlardan daha hızlı çalışabilirken, okunması ve anlaşılması zor olabilir ve bu da sürdürülebilirlik, ölçeklenebilirlik ve gelecekteki geliştirmeyle ilgili sorunlara yol açabilir. Ninja kodu, temiz kodun tam tersidir.
Null Object Pattern(Null Nesne Deseni)
Null nesne deseni, normal bir nesne gibi davranan ancak neredeyse hiçbir işlevi olmayan “boş nesne” adı verilen özel bir nesne oluşturmayı önerir. Avantajı, bir “if” ile boş referansları kontrol etmek zorunda kalmadan boş nesne üzerindeki metodları güvenli bir şekilde çağırabilmenizdir.
Optional Chaining(Opsiyonel Zincirleme)
Opsiyonel zincirleme, zincirdeki her özelliğin varlığını kontrol etmek zorunda kalmadan bir nesnenin iç içe geçmiş özelliklerine erişmenizi sağlar. Opsiyonel zincirleme olmadan, var olmayan bir nesnenin özelliğine erişmeye çalışırsanız, bir hata verecektir.
Monads(Monadlar)
Bir monad, fonksiyonları kapsüllemek ve işlemek için yapılandırılmış bir yol sağlar. İşlemleri birbirine zincirlemenize, fonksiyonları ve yan etkilerini tutarlı ve öngörülebilir bir şekilde ele almanıza olanak tanır.
Computational Complexity(Hesaplamalı Karmaşıklığı)
Hesaplama karmaşıklığı, hesaplama problemlerini çözmek için gereken kaynakları inceler. En önemlileri zaman ve bellektir. Bu kaynaklara ilişkin algoritmaların ve hesaplama sistemlerinin verimliliğini ölçer ve karşılaştırır.
Primary Keys(Birincil Anahtarlar)
Veritabanları bağlamında, birincil anahtar bir tablodaki belirli bir kayıt veya satır için benzersiz bir tanımlayıcıdır. Bir tablodaki her kaydı benzersiz şekilde tanımlamanın bir yolu olarak hizmet eder ve verilerin verimli bir şekilde aranmasını ve sıralanmasını sağlar. Birincil anahtar, birleştirildiğinde tablodaki her kayıt için benzersiz bir değer oluşturan tek bir sütun veya sütunların bir kombinasyonu olabilir. Genellikle, birincil anahtar bir tabloyla oluşturulur ve bir veritabanındaki o tabloyla ilişkileri olan diğer tablolar tarafından referans olarak kullanılır.
Globally Unique Identifier(GUID, Global Olarak Benzersiz Tanımlayıcı)
GUID (Global olarak benzersiz tanımlayıcı), bilgisayar sistemlerinde dosyalar, nesneler veya ağdaki varlıklar gibi kaynakları eşlemek için kullanılan benzersiz bir tanımlayıcıdır. GUID’ler, benzersizliklerini garanti eden algoritmalar kullanılarak üretilir.
Repository Design Pattern(Depo Tasarım Deseni)
Repository tasarım deseni, uygulamanın iş mantığı ile veri depolama katmanı arasında bir soyutlama katmanı sağlayarak daha esnek ve sürdürülebilir bir mimariye olanak tanır.
Cache(Önbellek)
Bir önbellek, daha hızlı erişim için sık erişilen nesneleri geçici olarak depolar. Pahalı kaynaklara erişim sayısını azaltarak yazılım uygulamalarının performansını iyileştirmek için kullanabilirsiniz. Verileri bellekte önbelleğe alarak, yazılım daha yavaş depolama aygıtlarına erişmenin getirdiği ek yükten kaçınabilir ve bunun yerine nesneleri doğrudan önbellekten alabilir.
Observer Design Pattern(Gözlemci Tasarım Deseni)
Gözlemci tasarım deseni nesneler arasında bire çok bağımlılığı tanımlar. Örneğin, bir nesne durumunu değiştirdiğinde, tüm bağımlı nesneler doğrudan bir referans olmadan otomatik olarak bilgilendirilir ve güncellenir. Yayımlanmış olaylara abone olursunuz ve değiştirilen nesne kimin abone olduğunu bilmeden bir uyarıyı her aboneye gönderir.
Rule of Zero(Sıfır Kuralı)
Sıfır kuralı, programlama dilinin veya mevcut kütüphanelerin kendi başlarına yapabileceği şeyler için kod yazmaktan kaçınmanızı önerir. Herhangi bir kod yazmadan uygulanabilen bir davranış varsa, o zaman mevcut koda güvenmelisiniz.
Garbage Collector(Çöp Toplayıcı)
Bir çöp toplayıcı, programlama dilleri tarafından bellek tahsisini ve geri toplanmasını otomatik olarak yönetmek için kullanılır. Program tarafından artık kullanılmayan nesneleri tanımlayıp bellekten kaldırarak kullanılmış belleği serbest bırakarak çalışır.
Façade Pattern
Façade tasarım deseni, karmaşık bir sisteme veya alt sisteme basitleştirilmiş bir arayüz sağlar. Bir sistemin karmaşıklığını gizlemek ve istemcilerin kullanması için daha basit bir arayüz sağlamak için kullanılır. Ayrıca istemci ile alt sistem arasında bir arabulucu gibi davranarak istemciyi alt sistemin uygulanmasının ayrıntılarından korur.
Shotgun Surgery(Tüfekle Ameliyat)
“Shotgun surgery”, kod tabanındaki tek bir değişikliğin sistem genelindeki farklı parçalarda birden fazla değişiklik gerektirdiği bir durumu tanımlar. Kod tabanının bir parçasındaki değişiklikler sistemin diğer birçok parçasını etkilediğinde gerçekleşir. Bu, bir tüfekle ateşlemeye benzer: tek bir atış, aynı anda birden fazla hedefi vurabilir, tıpkı tek bir kod değişikliğinin sistemin birden fazla parçasını etkileyebilmesi gibi.
Feature Envy(Özellik Kıskançlığı)
“Özellik kıskançlığı”, bir nesnenin aşırı bir şekilde başka bir nesnenin yöntemlerini kullanarak kendi davranışından daha fazla başka bir nesnenin davranışıyla ilgilenmesi durumunda ortaya çıkar.
Single Point of Failure(Tek Arıza Noktası)
Tek arıza noktası, arızalanması durumunda tüm sistemin arızalanmasına veya kullanılamaz hale gelmesine neden olacak bir bileşen veya sistem parçası anlamına gelir. Sistem bu bileşene veya parçaya bağımlıdır. Bu bileşen veya parça olmadan hiçbir şey düzgün çalışamaz. İyi tasarımlar, bu dalgalanma etkisini(ripple effect) önlemek için yedek bileşenlere sahip olmaya çalışır.
Loose Coupling(Gevşek Bağlı)
Gevşek bağlı, bir sistem içindeki farklı nesnelerin birbirine bağımlılığını en aza indirmeyi amaçlar. Birbirleri hakkında asgari bilgiye sahiptirler ve bir bileşene yapılan değişiklikler sistemdeki diğer bileşenleri etkilemez, böylece dalgalanma etkisi önlenir.
Data Clump(Veri Kümesi)
Veri kümelerinde, aynı nesne grubu sıklıkla bir programın farklı bölümleri arasında dolaştırılır. Bu, artan karmaşıklığa, azalan sürdürülebilirliğe ve daha yüksek hata riskine yol açabilir.
Inappropriate Intimacy(Uygunsuz Yakınlık)
Uygunsuz yakınlık, iki sınıf veya bileşen birbirine aşırı bağımlı hale geldiğinde ortaya çıkar ve kodun sürdürülmesini, değiştirilmesini veya genişletilmesini zorlaştıran sıkı bir bağlantı yaratır.
Fungible Objects(Değiştirilebilir Nesneler)
Değiştirilebilir nesneler, değer, kalite ve özellikler bakımından birbirinin yerine kullanılabilir veya aynıdır. Değiştirilebilir bir nesnenin belirli bir örneği, herhangi bir değer veya kalite kaybı olmaksızın aynı nesnenin başka bir örneğiyle değiştirilebilir. Değiştirilebilirlik, bireysel birimleri esasen birbirinin yerine kullanılabilir ve parçalarının her biri diğer parçalardan ayırt edilemez olan bir malın veya emtianın özelliğidir.
Testing Full Environmental Control(Tam Çevresel Kontrol Testi)
Tam çevresel kontrol, testlerin yürütüldüğü ortam üzerinde tam kontrole sahip olma yeteneğidir. Testlerin tutarlı ve dış etkenlerden bağımsız olarak çalışmasını sağlayan kontrollü ve öngörülebilir bir ortam yaratmayı içerir. Özellikle dış bağımlılıkları, ağ simülasyonunu, veritabanı izolasyonunu, zaman kontrolünü ve diğer birçok şeyi dikkate almanız gerekir.
Liskov Substitution Principle(Liskov İkamesi İlkesi)
Liskov ikamesi ilkesi, bir fonksiyon veya metodun belirli bir sınıfın nesneleriyle çalışmak üzere tasarlanması durumunda, o sınıfın herhangi bir alt sınıfının nesneleriyle de beklenmedik bir davranışa neden olmadan çalışması gerektiğini belirtir. Bu, SOLID’den gelen “L”dir.
Composition(Bileşim)
Bileşim, nesnelerin diğer nesnelerden parçalar veya bileşenler olarak oluşmasına izin verir. Daha basit olanları birleştirerek karmaşık nesneler inşa edersiniz, klasik “is-a” veya “behave-as-a” yerine bir “has-a” ilişkisi oluşturursunuz.
The Yo-Yo Problem(Yo-Yo Problemi)
Yoyo sorunu, kodu anlamak veya değiştirmek için bir sınıf hiyerarşisindeki sınıflar ve metodlar arasında gezinmeniz gerektiğinde ortaya çıkar ve bu da kod tabanını sürdürmeyi ve genişletmeyi zorlaştırır.
Entity-Relationship Diagrams (ERD, Varlık-İlişki Şemaları)
Varlık-ilişki şemaları, bir veritabanındaki verilerin görsel bir temsilidir. Bir ERD diyagramında, varlıklar dikdörtgenlerle temsil edilirken, varlıklar arasındaki ilişkiler dikdörtgenleri birbirine bağlayan çizgilerle temsil edilir.
Protected Attributes(Korumalı Öznitelikler)
“Protected bir attribute”, yalnızca sınıf veya alt sınıfları içinde erişilebilen bir sınıfın örnek değişkeni veya özelliğidir. Protected attribute, bir sınıf hiyerarşisi içindeki belirli verilere erişimi kısıtlamanın bir yoludur, ancak alt sınıfların gerektiğinde bu verilere erişmesine ve bunları değiştirmesine izin verir.
Traits(Özellikler)
Traits(Özellikler), birden fazla sınıf tarafından paylaşılabilen ortak özellikler veya davranışlar kümesini tanımlar. Bir özellik, esasen farklı sınıflar tarafından ortak bir üst sınıftan miras almaları gerekmeden yeniden kullanılabilen bir yöntem kümesidir. Sınıfların birden fazla kaynaktan davranış miras almasına izin verdiği için, mirastan daha esnek bir kod yeniden kullanım mekanizması sağlar.