Bir yarış pistinde oturan bir grup araba parçasının kimseye ne yararı var?
Araba sınıfınızın yaptığı tüm araba parçalarını tutmak ise ıslak bir parça torbası kadar faydalıdır.
kullanım
Sürücü olarak istediğim, kontrol edebileceğim bir şey. Hız istediğimde bu cevap veriyor. Bu raylarda olduğu gibi işler. Bu bir kuruşa dayanabilir.
İstediğim kullanılabilir bir araba sınıfı. Karbüratörün nasıl çalıştığını düşünmek zorunda kalmadan bir şeyler yapmamı söyleyebilirim. Sadece gaz pedalını düşünüyorum. Bunların nasıl bağlandığı endişe duyduğum bir şey değil. Bu soyutlama.
Bağımlılık Enjeksiyonu
Bağımlılık enjeksiyonunun bununla hiçbir ilgisi yoktur. Arabayı sürerken nasıl inşa edildiğini düşünmüyorum. Çalıştığı sürece, nasıl bir araya getirdikleri umurumda değil.
Hayır, DI, pit ekibimin pistte yağmur yağmaya başladığında lastiklerimi daha hızlı bir şekilde değiştirmesini sağlayan şeydir. Tamamen farklı bir arabaya atlamak zorunda kalmadan bunu yapabilmek güzel.
DI gerçekten bir ilkeyi izlemekle ilgilidir: İnşaattan ayrı kullanım.
Saatte 90 mil hızla yeni lastikler takabilen bir araba kulağa hoş gelebilir, ancak lastik takma mekanizmasıyla herhangi bir yarış kazanacağını sanmıyorum.
DI, parçalarınızı çukur ekibinizin onlara ulaşmasına izin verecek şekilde kurmakla ilgilidir. new
Aynı yerde kullandığınızda davranış programlıyorsunuz, sanki karbüratörü yerine kaynak yapıyormuşsunuz gibi. Asetilen torçunun çıkarabileceğinden emin olun, ancak lütfen önce somun ve cıvata kullanın.
DI budur. Elbette new
, istediğinizi fark ettiğiniz anda bir şeyi bulmak kadar kolay değil. Bunun yerine arabanızı nasıl inşa edeceğinizi bilen ayrı bir kod yazmalısınız. Ancak daha sonra işleri değiştirmeyi kolaylaştıracaktır. Ve bu, bir araba montaj tesisini yolun etrafına sürüklemeniz gerekmediği anlamına gelir.
İnşaat
Bir şey, bir yerde, lastiklerin Goodyear olup olmadığını bilmek zorundadır. Araba yapım kodunu nereye koyacaksınız? Araba değilse o zaman çukur mürettebatı? Hayır. Parça? Hayır. Bunların hepsinde davranış kodu var. Yarış sırasında gerçekleştirilmesi gereken kod. Aracın inşası, yarıştan önce davranış kodundan çıkarılan bir yerde yapılmalıdır. Mark Seemans burayı Kompozisyon Kökü olarak adlandırdı . Çoğu insan buna ana diyor.
Basit bir model. Esas olarak, nesne grafiğini oluşturun, ardından nesne grafiğindeki bir nesne üzerinde bir davranışsal yöntem çağırın. Bu kadar. Burası SADECE yer inşaat ve davranış birlikte olmak zorunda.
Bu, inşaatın hepsi sırayla sıralı olarak ortaya konan bir prosedür kodu yığını olduğu anlamına gelmez. Yapım yapmak için dildeki her aracı kullanmakta özgürsünüz. Sadece davranışla karıştırmayın.
Bunu dilde yapmak ve bazı DI çerçeveleri veya IoC kapları kullanmamak saf DI olarak adlandırılır . Çok iyi çalışıyor. Uzun zamandır var. Biz sadece referans geçişi derdik .
DI araçları
Bir DI aracının size sunduğu şey, inşaat ve davranış arasındaki ayrımı zorlayan farklı bir dile (xml, json, her neyse) taşınan inşaat detaylarıdır. Eğer diğer programcılarınızın, gerektiğinde kullanmamalarına güvenmiyorsanız new
, bu çekici olabilir.
Geri çekme, DI aracı detaylarının kod tabanı boyunca yayılmasına izin vermenin cazip olmasıdır. Bazen kod tabanına özel ek açıklamalarla bulaşır. Sağladıkları örnekler bunu kesinlikle teşvik ediyor. Araç, işi yalnızca Java programlama işi olarak değil, Java / Bahar programlama işi olarak da tanıtana kadar dil alanına geçme eğilimindedir.
Tasarım ilkeleri
Çağlar boyunca Araba sınıflarını programlıyordum çünkü benim için bir araba mantığı programlıyorsam Araba sınıfına ihtiyacım vardı. Ama DI ile bu benim için çok açık değil. Hala bunun için tanımlanmış bir rolüm yoksa DI'nin bir Araba sınıfı oluşturmaması deyimsel mi?
Bence soyutlamayı öğreniyorsunuz ve bir sınıfa nasıl karar vereceğinizi değiştiriyorsunuz. Bu iyi. Ama bu DI ile ilgili değil. DI, araba sınıfına ihtiyacınız olup olmadığına karar vermenize yardımcı olmaz. DI, lastiklerin Goodyear lastikleri olup olmadığını bilmenizi ve bakımını yapmanıza yardımcı olur. DI, arabaların Japonya'da yapılıp yapılmadığını bilmenizi engellemenize yardımcı olur.
Yazılım tasarımındaki en temel sorulardan biri "ne hakkında ne biliyor?" Bir UML diyagramının size gösterdiği ana şey budur. Geçmişte ulaştığınız bir şeyi yeni oluşturduğunuzda, şu anda bağlı olduğunuz somut şeyin arayüzüdür. Araba şimdi lastiklerin Goodyear olduğunu bilmelidir. Michelin size sponsor olmak istiyorsa bu biraz berbat.
Bunu yapmaktan kaçınmak, bağımlılık tersine çevirme ilkesini izler . Resmi olarak, yüksek seviye bir modül (araba sınıfı gibi) doğrudan düşük seviye modüllerine (GoodyearTire sınıfı gibi) bağlı olmamalıdır. Bir soyutlamaya bağlı olmalıdır (Lastik arayüzü gibi).
Bunu yapmaktan kaçınmanın bir yoluna kontrolün ters çevrilmesi denir . Burada vurgu, kontrol akışının değiştirilmesi üzerinedir. Lastikler aracı mı hareket ettiriyor yoksa araba lastikleri mi hareket ettiriyor? Bunu doğru şekilde düşünmek, arabayı ve lastikleri statik olarak bir araya getirmemizi sağlar. DI, Inversion of Control'ü takip etmenin özel bir yoludur.
Bunların hiçbiri size araba sınıfına ihtiyacınız olup olmadığını söylemez. Eğer "araba mantığı" programlıyorsanız, daha sonra her yere saçmak yerine onu tutmak için bir yer varsa güzel. Sadece araba inşaat mantığının araba davranış mantığı ile aynı olduğunu düşünmeye aldanmayın, bu yüzden hepsi aynı yerde yaşamak zorunda. Ancak, bir araba için tanımlanmış bir rulonuz yoksa, o zaman da ihtiyacınız yoktur. İsterseniz pist etrafında motosiklet yarış.
Demek istediğim, sürüş için bir SteeringWheel, çukur mürettebatı için tekerlekler üzerinde BoltsAndNuts ve bir bütün olarak bir aracı temsil eden bir örneğe sahip olmadan diğer komik arayüzlerin olması iyi mi?
DI ya da DI yok, bir otomobili bir bütün olarak temsil eden bir örneğe sahip olmak iyidir, ancak bu örnek, gerekmiyorsa doğrudan bilmek istediğim bir şey değildir. Bana bir araba soyutlama verin, bu yüzden kullandığımda gaz, dizel veya elektrikle çalışıp çalışmadığına bakmak zorunda değilim. Bu sadece onu inşa ederken veya bakımını yaparken dikkat etmem gereken bir şey. Arabayı kullanan kodun nasıl çalıştığını bilmek veya önemsemek zorunda olmaması güzel. "Bilmiyorum. Bilmek istemiyorum."