KATI ilkeleri ve YAGNI


43

SOLID ilkeleri ne zaman YAGNI olur?

Programcılar olarak, karmaşıklık, sürdürülebilirlik, inşa edilme zamanı vb. Arasında her zaman değiş tokuş yaparız. Diğerlerinin yanı sıra, seçim yapmak için en akıllı ilkeler aklımda SOLID ilkeleri ve YAGNI. İhtiyacınız yoksa; İnşa etmeyin ve temiz tutun.

Şimdi, örneğin, SOLID'de dimecast serisini izlerken, oldukça basit bir program olarak başladığını ve oldukça karmaşık bir program olarak sona erdiğini görüyorum (son evet karmaşıklık da bakanın gözündedir), ama yine de merak ediyorum: SOLID ilkeleri ne zaman ihtiyaç duymadığınız bir şeye dönüşür? Tüm sağlam ilkeler daha sonraki bir aşamada değişiklik yapmak için kullanımı sağlayan çalışma yöntemleridir. Peki ya çözülecek sorun oldukça basitse ve bu çok basit bir uygulamasa ne olacak? Yoksa SOLID ilkeleri her zaman geçerli olan bir şey midir?

Yorumlarda istendiği gibi:


Başlık da olmamalı SOLID principle vs YAGNImı?
Kurt

2
@Wolf: çoğul "KATI (Tek sorumluluk, Açık-kapalı, Liskov ikamesi, Arabirim ayrılığı ve Bağımlılık inversiyonu), Michael Feathers tarafından ilk kez Robert C. Martin tarafından adlandırılan 'ilk beş ilke' için tanıtılan bir anımsatıcı kısaltmadır. Nesneye yönelik programlama ve tasarımın beş temel ilkesini temsil eden 2000'li yıllar. ”
logc

Yanıtlar:


55

Bir ekrana dayanan bir yaklaşımı değerlendirmek her zaman zordur, çünkü demolar için toplanan sorunlar genellikle SOLID gibi ilkeleri hızlı bir şekilde uygulamanın tamamen üstesinden gelmiş gibi görünmesini sağlayacak kadar küçüktür.

SOLID ilkelerinin neredeyse her zaman faydalı olduğunu söyleyebilirim. Onlarla yetkin olduğunuzda, bunları kullanmak, kasten düşünmeniz gereken bir şey gibi görünmüyor. Sadece doğallaşıyor. Çok sayıda tek kullanımlık uygulamanın bundan daha fazlası olduğunu gördüm, bu yüzden artık bir şeyi çöpe atacağımı söylemekten korkuyorum çünkü asla bilemeyeceksiniz.

Genellikle benim yaptığım yaklaşım, belirli bir görev için basit bir uygulama yazıyorsam, bazen işe yarayan birkaç kod satırı lehine büyük ad prensiplerinden vazgeçeceğim. Daha fazla değişiklik yapmak için bu uygulamaya geri döndüğümü tespit edersem, bunu KATI hale getirmek için zaman ayıracağım (en azından bir şekilde, ilkelerin% 100 uygulaması nadiren mümkün olabilir).

Daha büyük uygulamalarda, küçük başlıyorum ve program ilerledikçe, mümkün olduğunda SOLID ilkelerini uygularım. Bu şekilde, her şeyi en baştaki son noktaya kadar tasarlamaya çalışmıyorum. Bu, bana göre, YAGNI ve SOLID'in bir arada olduğu en güzel nokta.


Bu da benim düşündüğüm şey. Bir açıklama olarak, screencast tarafından yargılamadığım, bunun sadece SOLID uygularken yazılımın nasıl büyüyebileceğinin güzel bir örneği olduğunu düşünüyorum.
KeesDijk

İyi bir nokta. Eldeki sorunu göstermek veya daha da şiddetlendirmek için yapılan herhangi bir gösteri yapılmayacaktır. Temel olarak, bir fikri kanıtlamak için en son sonucuna kadar bir fikir alma fikri bir başarısızlıktır. Kendisinde kötüye kullanılabilecek bir öncül.
Berin Loritsch,

YAGNI and SOLID coexistiyi sonuç. Her ne kadar iyi bir başlangıç ​​noktası olsa da
Wolf

Öyle görünüyor ki bazen bir kambur ihtiyaç duyulabilir. Sıhhi tesisat ve soyutlama seviyelerinin nerede durduğunu ve başladığını bilmek için birçok değişiklik görmeye nereden başlayabileceğinizi bilmek zorundasınız.
johnny

19

En başta eldeki sorunu düşünün. YAGNI veya SOLID ilkelerini çok iyi uygularsanız, daha sonra kendinizi incitebilirsiniz. Hepimizin anlayabileceğimizi umduğum bir şey, tüm sorunlara uyan "tek" tasarım yaklaşımının olmaması. Bir mağaza "herkese uyan tek beden" olarak ilan edilen bir şapka sattığında bunun kanıtını görebilirsiniz, ancak kafanıza uymuyor. Ya çok büyük ya da çok küçük.

Bunun yerine, SOLID'in ele almaya çalıştığı ilkeleri ve sorunları anlamak daha iyidir; YAGNI'nin ele almaya çalıştığı ilke ve sorunların yanı sıra. Birinin başvurunuzun mimarisiyle, diğerinin ise geliştirme süreciyle bir bütün olarak ilgilendiğini göreceksiniz. Bazı durumlarda üst üste gelmekle birlikte, belirgin şekilde farklı problemlerdir.

YAGNI (İhtiyacınız Olmayacak [tuhaf Amerikan kısaltması]), geliştiriciden zaman tasarrufu yapmakla ilgileniyor, ancak daha basit bir ahşap köprü sadece 3 metrelik bir dereye yayılacak olan bir köprüye çelik takviyeli beton temeller ekliyor ince. Bir mil genişliğinde bir nehri kaplıyorsak ve birkaç traktör römorkunu desteklememiz gerekiyorsa, elbette bu ekstra temel çalışmasına ihtiyacımız var. Temelde, YAGNI size mevcut ihtiyaçlar için daha büyük resme ve tasarıma bakmanızı söylüyor . Çok karmaşık bir şey yapma sorununu ele alıyor, çünkü müşterinin henüz belirlemediği bir takım potansiyel ihtiyaçları öngörüyoruz.

SOLID, köprünün parçalarının birbirine tam olarak uyduğundan ve zaman içinde korunabildiğinden nasıl emin olduğumuzla ilgilidir. SOLID ilkelerini ahşap köprüye ve çelik takviyeli beton köprüye uygulayabilirsiniz.

Kısacası, bu iki kavram mutlaka birbiriyle çatışmaz. Olduklarına inandığınız bir durumla karşılaştığınızda, büyük resme bakmanın zamanı geldi. Sonucunuza bağlı olarak, SOLID ilkelerinin bir kısmını ortadan kaldırmaya karar verebilir veya gerçekten ihtiyacınız olduğuna karar verebilirsiniz.


Yeap, katılıyorum .. Her senaryoya uygun bir gümüş kurşun yaklaşımı yoktur.
EL Yusubov

Sizin make sure the pieces of the bridge fit togetherkadar açık değil can be maintained over time.
Kurt

Temel olarak, SOLID, bu tahta köprüyü, tam bir yeniden yazma yapmadan veya sadece kesmeden sonra kesmeye yapışarak zırhlı bir müfredatı destekleyebilen 1 mil uzunluğunda çelik köprüye dönüştürmenize olanak sağlayacak olan şeydir.
sara,

@kai, bu sahte bir öncül. 1 mil uzanan bir köprüye ihtiyacınız varsa, o zaman 1 mil uzanan bir köprüyü tasarlarsınız. 5 metrelik bir köprüye ihtiyacınız varsa, 5 metrelik bir köprüyü inşa edin. Beni yanlış anlama, SOLID ilkeleri çok faydalıdır, ancak eldeki sorun için hangi ilkelerin gerekli olmadığını bilmek daha fazla anlayış gerektirir. 10 üzerinden 9 kez, bu ekstra mil asla gerekli değildir.
Berin Loritsch 19

@BerinLoritsch bu yüzden 5 ayağa ihtiyacınız olursa, 5 ayağa iniyorsunuz, ancak yere 2x4'lük bir çift kanal sokarak 5 ayağa YAPMAYIN. ihtiyacın olanı yaparsın ve iyi yaparsın. (analojinin parçalara ayrılmasına rağmen)
sara

9

Bir fırlatma uygulaması olduğunda SOLID ilkelerine gerek yoktur; Aksi takdirde her zaman ihtiyaç vardır.

SOLID ve YAGNI olasılıkları yok: İyi sınıf tasarım uygulamanın bakımını kolaylaştırır. YAGNI, uygulamanızın güneşin altındaki her şeyi yapabilen bu yapılandırılabilir canavarlık olma özelliğini eklememeniz gerektiğini, aslında ihtiyaç duymadıklarını belirtir.

İyi tanımlanmış sınırları olan bir araç sınıfı (SOLID) ile müşteri sormadan önce kendi kendini iyileştirme yeteneğine sahip bir otomobil sınıfı (YAGNI) arasındaki fark.


1
Bu karışık değil mi? Bunun hakkında: Kendini iyileştiren otomobillerin karmaşıklığını ele almak için SOLID ilkelerini doğru şekilde uygulayın veya arabalarınız hala asla kırılmayacakları kadar basit olacakları sürece (veya alternatif olarak - neşelendirebilecekleri) YAGNI uygulayın .
Kurt

2
@ SOLID ilkeleri ne yapmalı, sadece NASIL söylemez. Kendinden iyileşen arabalar istemeye karar vermişseniz, SOLID ilkelerini bu koda uygulayabilirsiniz. SOLID, kendi kendini iyileştiren bir arabanın iyi bir fikir olup olmadığını söylemiyor. Burası YAGNI'nin geldiği yer.
sara

Çoğu zaman fırlatma uygulamaları değildir.
Tulains Córdova

"Kendini iyileştir" iyidir. "Müşteri bunu istemeden önce" de iyidir, çünkü bence Bob Amca'yı dinlerseniz, tüm fikri bir kazanç yaratan, müşterinin ihtiyaçlarını önceden tahmin eden ve ihtiyaçlara cevap verebilecek uygun bir iş sahibi olan kişiler içindir. çünkü değişiyorlar. Bob Amca’da pek çok insan sinirleniyor çünkü programlamaya hakkını vermiyor, ama size çoğu zaman neden SOLID’i kullanmanın önemli olduğunu anlatmıyor.
johnny

"Kullanılabilir bir uygulama olduğunda SOLID ilkeleri gerekli değildir" . SOLID ilkelerinin iyi bir alışkanlık olduğunu düşünüyorum, bu yüzden atılmış bir uygulama olsa bile, büyük bir uygulama yazmak istediğinizde kendiniz için eğitim alıyorsunuzdur, bu nedenle aşağıdaki SOLID ilkelerine uymanın bir faydası olabilir.
icc97

4

Hiçbir şey her zaman geçerli olmaz! Mimarlık Astronotlarının Sizi Korkutmasına İzin Vermeyin ! Önemli olan, bu ilkelerin hangi sorunları gidermeye çalıştığını anlamaya çalışmaktır; böylece bunları uygulama konusunda bilinçli bir karar verebilirsiniz.

Son zamanlarda, Tek Sorumluluk İlkesi'ni ne zaman kullanmam gerektiğini anlamaya çalışıyordum ( işte şimdi buldum.)

Bu yardımcı olur umarım!


2

Einstein'a atfedilen bir alıntı var (muhtemelen gerçek olanın bir varyasyonu ):

“Her şey mümkün olduğunca basit yapılmalı, ancak daha basit olmamalı.”

Üstelik, SOLID - YAGNI tradeoff ile karşılaştığımda, benim aldığım yaklaşım azalıyor: alternatif olarak uygulayın, çünkü bir programın 'atılma' kodu olup olmadığını asla bilemezsiniz. Bu yüzden, sadece çalışan bir kir tabakası ekleyin, daha temiz bir ara yüze cilalayın ... ve doğru entropi seviyesine yakınlaşana kadar tekrarlayın. İnşallah.


İyi nokta: you never know if a program is 'throw-away' code- Bence alternatif fikir o kadar iyi değil.
Kurt

@ Kurt: evet, en iyisi olduğunu düşündüğüm adımların sırasını genişletiyordum ('Önce mümkün kıl, sonra güzel yap, sonra hızlı yap' sloganı '' bölümünde özetlendi), ama sonra düşündüm ki ... YAGNI :)
logc

1

Belirli bir problem için bir program tasarlamanın birçok yolu vardır; SOLID, iyi bir tasarımın özelliklerini belirleme girişimidir. SOLID'in doğru kullanımının, üzerinde düşünmesi ve değiştirilmesi kolay bir programla sonuçlanması beklenir.

YAGNI ve KISS, özellik kapsamı ile ilgileniyor. Daha fazla problem türünü çözen bir program daha karmaşık ve soyut. Bu genelliğe gerek duymuyorsanız, anlaması ve bakımı daha zor ancak katma değer sunmayan kod oluşturmak için zaman ve çaba harcadınız.

İyi tasarlanmış bir program mutlaka yalnızca ihtiyaç duyduğu özelliklere odaklanmamıştır. Yalnızca ihtiyaç duyduğu özelliklere odaklanan bir program mutlaka iyi tasarlanmış değildir. Karar alma alanında takas, sadece iki dikey eksen yoktur. İdeal bir program hem modülerdir hem de sadece temel özelliklere sahiptir.


0

Bence YAGNI'ye başlamalısınız ve ne zaman bir ihtiyaç varsa, SOLIDify.

Demek istediğim SOLID orada, yani yeni bir sınıf eklediğinizde, yeniden düzenlemek zorunda kalmayacaksınız, basitçe bir uygulamayı değiştirmek (örneğin), benim görüşüme göre, kodunuzu basitçe yazmak ve ne zaman değiştirdiğinizi görmek şeyler - bunu SOLID ile değiştirin (yani, SOLID'i yeniden canlandırmanın korkusuyla sizi kurtarmanız gerekiyor - yalnızca başladığınızda çok kötü değil).

Vaktinizi boşa harcamıyorsunuz çünkü işi yine de yapmak zorunda kalacaksınız (başlangıçta) ve ihtiyaç duyduğunuz her yerde kod güzel ve düzenli olacak.

Sanırım buna SOLID'in tembel bir değerlendirmesi diyebilirsin.


Hm, gönderinin fazlalık olduğu konusundaki noktanızı anlıyorum, sildim, ancak bunu yapma ayrıcalıklarına sahip değildim (veya düğmeyi göremiyorum). Her iki durumda da daha net olması için düzenleyeceğim.
Binyamin
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.