Bağımlılık Enjeksiyonu: Tüm parçalarını tutmak için bir Araba sınıfı oluşturmalı mıyım?


10

Benim C ++ uygulamasında bir RaceTrack withing bulunan birçok araba var.

Her araba yüzlerce parçadan oluşur. Her bölüm bir veya iki bölüme bağlıdır.

DI ve Mark Seemann'ın kitabında birçok SO sorusu okudum ve sadece araba parçalarını tutmak için bir Araba sınıfı tanımlamamalıyım çünkü tüm araba parçaları birbirine bağlı olacak ve bu parça çorbası bir araba. Haklı mıyım?

Bu yüzden tüm yarış arabalarımı RaceTrack'a yerleştirdiğimde, araba varlıkları olmayacak ama pistte birbirine bağlı olarak bir sürü araba parçası olacak mı ?? Haklı mıyım?

DÜZENLE:

Ç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?

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?

Yanıtlar:


24

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. newAynı 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."


Eğer kodu temsil etmek için kullanan bir soru için araba ve çukur mürettebat metaforu kullanmadıysanız harika olurdu. Ama yine de, iyi bir cevap.
S. Tarık Çetin

6
Ve her zaman kontrolün İnversiyonunun sola döndüğünüzde olduğunu düşündüm ama araba sağa döndü ...
mkrieger1

CandiedOrange, yani anlamlı bir arayüzü ve iyi tanımlanmış bir sorumluluğu yoksa Araba sınıfı yok mu? Ve projemde Car.h yok. Ve meslektaşım benim kod bakarak ve bir araba parçaları e-mağaza veya garaj yönetimi uygulaması olduğunu merak? :)
Anton Petrov

@AntonPetrov "ördek gibi görünüyor ve ördek gibi quacks, ama pil gerekiyorsa muhtemelen yanlış soyutlama var". İyi isimler çok önemlidir ve düşünülmesi zor olabilir, ancak iyi tanımlanmış sorumluluk ve anlamlı arayüzü yansıtacak şekilde değiştirilmelidir, böylece bir sürpriz olarak gelmezler. Eğer adı okuduğumda arayüze bakıp "beklediğim bu kadar" diye düşünürsem iyi bir ismin var demektir.
candied_orange

15

Sadece araba parçalarını tutmak için bir Araba sınıfı tanımlamamalıyım çünkü tüm araba parçaları birbirine bağlı olacak ve bu parça çorbası bir araba. Haklı mıyım?

Hayır.

Bağımlılık enjeksiyonu noktası, bağımlılıkları caydırmak için hiç değildir . Tam tersi.

Bağımlılık enjeksiyonu şu soru ile ilgilidir: araba parçalarını nereden alıyor ? Nerede ve nasıl yaratılırlar ve araba bunlara nasıl referans alır?

Naif olarak, araba arayarak parçalarını kendisi yaratacaktı new. Bu kolay ve anlaşılır, ancak çok esnek değil. Araba, parçaları oluşturmak için gerekli olan her şeyi bilmelidir ve farklı parçalara sahip iki arabanız olmasını istiyorsanız, bu mantık da arabaya girmelidir.

Bağımlılık enjeksiyonu ile, tüm bu mantık araçtan çıkarılır ve tüm parçaları oluşturan ve referansları kablolayan bir konfigürasyon bileşenine konur. Tamamen yapılandırılmış bağımlılıklar araca ve birbirlerine enjekte edilir .


1
Son olarak, aklı başında bir dependency injectionkavram açıklaması .
anatoly techtonik

1
"Saf" yaklaşım için daha yaygın olan sistemin arabanın yeni arayacağını değil, araba sınıfının kullanıcısının parçalarını özelliklerine atayacağını ve bu arada araba sınıfının belirsiz bir durum. DI, sınıf geçerliliğini mekanik olarak sağlamak için bir araç sağlar.
whatsisname

2
@ whatsisname Geçersiz ve yarı başlatılmış nesneler yapmak için DI'yi kolayca kullanabilirim. Doğrulama bir DI sorumluluğu değildir. Değişmez de değil. DI geçerli ve değişmez nesneler inşa etme işini üstlenebilir. DI'nin, bu nesnelerin inşa edilmesinin ve kullanılmasının tek yolu olduğunu zorlamanın hiçbir yolu yoktur. Nesneler bunu zorlamalıdır.
candied_orange

@CandiedOrange: Yani yarı yamaçlı bir şey yapmak için herhangi bir tekniği kolayca kullanabilirsiniz, ne olacak? Yapıcıya bağımlılık istemek ve onları değişmez kılmak, gümüş bir kurşun değildir, ancak yine de birçok yaygın kötü durumu önlemenin çok yararlı bir yoludur.
whatsisname

0

Bu yüzden tüm yarış arabalarımı RaceTrack'a yerleştirdiğimde, araba varlıkları olmayacak ama pistte birbirine bağlı olarak bir sürü araba parçası olacak mı ?? Haklı mıyım?

İyi. Evet ve hayır. Bir araba varlığına sahip olmak hala geçerli. Ve bir araba, parçalarının toplamından daha fazlasıdır. Sen de bir şoföre ihtiyacın var (şimdilik). Çoğu zaman yarış arabalarının isimleri var, arabanın markası ve modelinden bahsetmiyoruz.

Evet, arabalar temelde bir parça konteynırdır, ancak daha büyük bir şey oluşturan parçaların bu ambalajı ve işbirliğidir: bir araba.

Gerçekten, hayır. Bir araba sadece rastgele bir metal ve plastik çanta değildir. Bu bir makine.

Bu durumda bağımlılık enjeksiyonu aşırı doldurulmaz. Başka bir şey, fabrika sınıfı veya Builder nesnesi olan arabayı inşa etmek zorunda. Araba kendini nasıl inşa edeceğini bilmemelidir.


2
Fabrikalar veya oluşturucu nesneleri olmadan DI'ye sahip olabilirsiniz. Basit yapıcı parametreleri birçok koşulda çalışan geçerli bir yöntemdir.
whatsisname
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.