Katı Prensipleri Enjektife Nasıl Kullanılır
Table of Contents
Giriş: Neden Yeniden İftifa ve SOLID Go Hand in Hand
Birkaç aydan fazla aktif bir gelişmede olan her yazılım sistemi kaçınılmaz olarak teknik borçlar biriktirir. Hızlı düzeltmeler, değişen koşullar ve gemiye baskı genellikle kırılgan olan koda yol açar, anlaması zor ve genişletmek zor. İki uygulama bu çürüklere karşı en etkili antidotes yapar:0)
Yeniden yapılandırma, mevcut kodu dış davranışını değiştirmeden yeniden yapılandırmanın disiplinli tekniğidir. Bunun yerine, böcekleri düzeltme veya ekleme özellikleri yoktur; bunun yerine, gelecekteki değişiklikleri daha güvenli ve daha hızlı hale getirmeniz için içsel yapıyı geliştirir.The SOLID ilkeleri, Robert C. Martin tarafından tanıtıldı, orijinal tasarımla uyumlu bir dizi tasarım kılavuzu sağlarken, test edilebilir ve esnektir.
Pratikte, birçok gelişim ekibi, SOLID ilkeleri retroaktif olarak uygulamak için mücadele eder. Orijinal kod, monolithic, sıkı bir çiftleştirilebilir veya koşullu bir mantıkla birleştirilir. Sistematik bir yaklaşım olmadan, “tekrarlı bir şekilde yapmak” için çaba, her bir şekilde, işe yaramak için pratik rehberlik eden tekniklerle dolu, davranışların adımları kırılabilir, her bir şekilde bir kod tabanını her bir şekilde birleştirebilirsiniz.
SOLID İlkelerini Anlamak
Yeniden faktörleme tekniklerine girmeden önce, SOLID acronym'in kısa bir yenidenkapı sahneyi belirleyecektir:
- [FONT=0) Tek Sorumluluk Prensi (SRP): Bir sınıf sadece bir değişiklik için bir nedene sahip olmalıdır – bu, tek, iyi tanımlanmış bir sorumluluğu olmalıdır.
- [FONT:0) Açık / Kısa Prensip (OCP): ), Yazılım varlıkları ( sınıflar, modüller, fonksiyonlar) uzatma için açık olmalıdır, ancak değişiklik için kapalı olmalıdır.
- [FONT:0]Liskov Substitution Prensi (LSP): [Döneticileri bir süper sınıfın nesneleri, programın doğruliğini etkilemez.
- [FONT=0) Interface Segregation Prens (ISP): ) Müşteriler kullanmadıkları arayüzlere bağlı olmak zorunda kalmamalıdır.
- [DIP:0)Dependency Invers Prensipleri (DIP): [DFLT:1) Yüksek seviyeli modüller düşük seviyeli modüllere bağlı olmamalıdır; her ikisi de soyutlığa bağlı olmalıdır.
Her ilke belirli bir tür kod kokusuna hitap eder. SRP, “çok fazla şey” diye savaşıyor. OCP bu kokuları nasıl sistematik olarak ortadan kaldırabileceklerine bakıyoruz.
Tek Sorumluluk Prensibi için Emekli Olmak
Mutasyonları Tanımlamak
Bir SRP ihlalinin en yaygın belirtisi, bir e-postanın en az dört sorumluluk alması gereken bir sınıfdır. Örneğin, bir sınıf adı, toplamları hesaplar, ekran için faturayı hesaplar, onu bir veritabanına gönderir ve bir e-posta gönderir. herhangi bir vergi hesaplaması için, HTML formatı, depolama şeması veya e-posta içeriği aynı sınıfa bir değişiklik olacaktır.
Bu ihlalleri tespit etmek için, “Manager” veya “Üzersiz” gibi kelimeler içeren sınıf isimlerine bakın, bu da genellikle sınıfların yöntemi imzalarını inceler: eğer bazı yöntemler diğer yöntemlere karşı olan parametreleri ele alırsa, bu bir ipucudur.
Teknikleri Yeniden Düşünmek
SRP için birincil refaksiyonu:0)Extract Sınıfı) ve her yeni sınıf değişikliği için tek bir neden olduğunu tespit edebilirsiniz. Örneğin, [[DüzDÜSÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN
Mantık bir bütün sınıf yerine birkaç yönteme yayılmışsa, [[Döntme Yöntemi[[Dönetici:0) Belirli bir davranıştan daha mantıklı olarak başka bir sınıfa ait görünme yöntemiyle ortaya çıkıyor. Bu, gelecekteki bir alıntı Sınıfı için zemini daha görünür hale getirir.
Başka bir değerli teknik şu şekildedir:0)Ana Sayfada Fonda[[Dönetici")[Dönetici Çağrısı[[Dönemli bir yönteme ait olan mantığı farklı bir alana çevirdiğinizde, bu mantıktan özel bir işleve veya sınıfa kadar, birincil sınıfın yüzey alanını azaltır ve açık sorumluluklar yaratırsınız.
Open/ Closed Prensliği için Yeniden İttifak Uygulayın
Polimorphism ile Durumalları Yeniden Oluşturun
OCP'yi ihlal eden kod genellikle büyük bir İLDİT:5 içeriyor veya [[DÜyetim: 16.Öylegeme: 9) Yeni bir yöntem ekleme yöntemiyle, bu koşullu bloku değiştirmesi gerekir - “önemli bir değişiklik için nakliye maliyeti hesaplayan bir yöntem.
Burada standart refaksiyon:0)Replace Durumal with Polymorphism[D: 1) Bir soyut sınıf veya arayüz (örneğin, [[Dönetici) oluşturmak için eklenmiş bir yöntem haline gelir.
Strateji ve Dekorasyon Desenleri Kullanın
[FONT=0]Strateji[[Dönetici:0][Dönetici][Dönetici], genellikle strateji arayüzünü tanımlamakla başlarsınız, sonra koşullu şubeleri ayrı strateji sınıflarına uygularsınız.Son olarak, uygun stratejiyi çalıştırdığınızda müşteriye enjekte edersiniz.
[FONT=0]D[Döncük|Döncük|Döncük|Döncük|seçmiş)|seçmişler (kücretsiz) veya spertajlar (D)) ile ilgili olarak, (Dörtücükler) veya alt sınıfları değiştirmek için bir nesneye eklenmeniz gerekir.
Resmi tasarım desenleri olmadan bile, miras üzerine kompozisyon ilkesi OCP'ye yardımcı olur. Davranışa değişiklik yapmanız gerektiğinde sınıfı sınıf kendi başına bir mantık yerine daha küçük değişikliklerle değiştirilebilir parçalardan oluşturun.
Liskov Substitution Prensiplerini Desteklemek
Altlama ve Davranış Sözleşmeleri
LSP, beklenmedik istisnaları atlayan alt sınıfdaki yöntemler olarak sık sık sık yüzey ihlal eder, geri döndürür:) Temel sınıf geçerli bir nesne döndürür, veya ön koşullara ve ön koşullara sahip olmalıdır. Klasik bir örnek, İZFLT:18'den miras alan bir sınıftır, ancak ihlal eder.[DÜye Olmayanlar için: 16/01/34)
İlk refaksiyonu [Dönetici:0) Sözleşmeyi açık hale getirmek için (Dönetici: 2)Introduce Assertion) veya [[Döneticileri hariç, (örneğin,) ortak bir arayüzle miras almak için (örneğin, alt sınıf onuruna sahip olmak için) gerekir.
Enforce LSP'leri kullanarak
Pratik bir yaklaşım, herhangi bir uygulamanın onları tatmin etmesi için yeterlidir, LSP bir temel sınıfa sahip olmak yerine, alt sınıf davranışını uyumlu olmayan bir yönteme sahiptir.O zaman müşteri yalnızca arayüze bağlıdır.Eğer arayüz yöntemleriniz varsa, LSP otomatik olarak tatmin edilebilir. Örneğin, LSP'nin bir sınıf olduğu gibi, ancak sadece bir yönteme sahip olmak yerine boş bir şekilde uygulanır.
Başka bir yararlı refaksiyonu ise şöyledir:0)Push Down Yöntemi): Eğer süper sınıfta bir yöntem, sadece bazı alt sınıflara göre anlamlıdır, alt sınıflara kadar uzanır.
Yeniden Yeniden Bağlanma yoluyla Arabulucu
Şişman Arabileri
ISS genellikle tek bir arayüz çok fazla yöntem biriktirdiğinde ihlal edilir. Örneğin, aİLFLT:37 ile arayüz , [[Üye Olmayanlar için |Split Interface) daha küçük, daha fazla kohesive arayüz oluşturmak için basit bir yazıcıya sahiptir: $ 0:0,00 $ · 8|DÜye Olmayanlar için.
Bölünme, belirli müşteriler tarafından sık sık kullanılan yöntemler gruplarına bakın. Ortak bir hata birçok küçük arayüze ayrılır. Rol arabirimleri için bir arayüz: bir müşterinin isteyebileceği tek bir yeteneği temsil eden bir arayüz. Örneğin, aİLFLT:45).
Mevcut Müşteri Kodu
Yağ arayüzü bölünmüş olduğunda, her müşteriyi yalnızca ilgili arayüzü uygulamaya yeniden düzenlemeniz gerekir.Bu, büyük uygulama sınıflarını kırmanız gerekir:0)Değişim Yöntemi İmza) ve [[daha dar arayüzleri kabul etmek için) ve [[Dönetici|[Döneticileri) Sınıfın her ikisine de uygulanması için mükemmel bir şekilde iyidir.
Bağımlılık Prensibi için Yeniden Yardımcı Olmak
Özet Bağımlılık
Tipik bir DIP ihlali yüksek seviyeli bir sınıf, örneğin, [[DörtÜSÜŞÜNÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜK-YÜK-YÜK-YÜK-YÜK-YÜK-YÜK-YÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
Bağlanma Enjeksiyonu ve Kontrolün Etkileri
Yeniden düzenleme tekniği:0)Kontrol Konfüçyü (Cehenne) Kombine sahip olarak, tüm bağımlılıklara kolayca bağlı kalamayacağınızda kullanılabilir.Bu, sınıfın saf olarak soyutlamalara ve yüksek çözünürlüklere bağlı olarak test edilmesi anlamına gelir.
Yapı enjeksiyonu yaptığınızda, uygulamanızı göz önünde bulundurun:0)Ek Yöntem Object[DDDDÜT:1) Eğer enjekte edilen bağımlılıklar birçok yöntemde kullanılırsa - bu, sınıfın hala çok fazla sorumluluğu olduğunu gösteren bir işaret olabilir.
Özetler müşteriye ait olmalıdır, beton uygulama için değil. Bu, düşük seviyeli modüle sahip değildir[Döneticileri kontroller).Eğer arayüzünüzün düşük seviyeli kütüphanede olduğu gibi, yüksek seviyeli modüle doğru hareket ederek ve düşük seviyeli modüle sahip olmasını sağlar.
Sonuç: Bir Habit Yeniden Düşünmek
Yeniden faktörleme yoluyla SOLID ilkeleri tek zamanlı bir faaliyet değildir, ancak devam eden bir disiplindir. Burada açıklanan teknikler - Polymorphism, Extract Interface, Discover parameter, and many others – yavaş yavaş yavaş bir kod tabanını kırabilmeniz için izin veren bina bloklarıdır. Her küçük adım daha anlaşılabilir ve daha kolay uzantılı olarak kapıyı açar.
Uygulamanızı derinleştirmek için, Martin Fowler'in [[Döneticileri:0)Refaksiyon web sitesi) için ayrıntılı bir tedavi için, Robert C. Martin Fowler'in Notu[DÜye Olmayanlar İçindekiler)[Döneticileri Göremezler.
Küçük başlayın: SRP'yi ihlal eden bir sınıf seçin, alıntı Sınıfı uygulayın ve sistemin geri kalanının nasıl yanıt vereceğini görün.Öylernek uygulama ile, bu yeniden faktörlemeleri içselleştireceksiniz ve başlangıçtan itibaren SOLID'ye saygı duymaya başlayacaksınız.