Boyler için bir savunma?


15

Bana göre, kaynak plakası açıkçası kötü. Ancak, kazan plakasını azaltmak için herhangi bir girişimde direnç gösteren bir geliştiriciyle tanıştım. Zaman içinde geliştirdiğim nefreti aşan, kolayca oluşturulmuş, iyi düşünülmüş bir argümana sahip olmadığımı fark ettim.

Daha az kaynak plakası lehine ikna edici bir argüman oluşturabilmem için, bazı karşı düzenlemeler nelerdir? Başka bir deyişle, eğer kazan plakası lehine argümanlar (varsa) nelerdir?

(Demek istediğim genellikle kazan plakası ile kastedildi, ama iyi bir örnek Java'da alıcılar ve ayarlayıcılar.)


7
Yinelenen kod karşı Argümanlar (varsayarak Demirbaş kopyalama / yapıştırılan olduğunu): stackoverflow.com/a/2490897/1583
Oded

1
@Oded: Doğru. Ama soruyu yanlış okudun. :) Söyleyecek bir şey varsa bakmaya çalışıyor için Demirbaş kodu. Benim tahminim dezavantajları hakkında çok iyi bilgilendirilmiş olması.
Steven Jeuris

3
@StevenJeuris - Soruyu mükemmel okudum. Bu yüzden bir cevap göndermedim. Sadece tartışmanın diğer tarafına ekliyorum. OP vardır Sadece çok yakın zaman için "Ben zamanla bunun için geliştirdik nefret kolayca oluşturulabilir, iyi geçmiş argüman düşünülmüş";)
Oded

2
Boilerplate estetik olarak hoş olabilir: en.wikipedia.org/wiki/This_Is_the_House_That_Jack_Built
SK-mantığı

Birbirini tamamlayan birkaç iyi cevap ve yorum ... hangisinin kabul edileceğini seçmek zor.
soyutlandı

Yanıtlar:


15

Hatırlanması gereken önemli bir nokta, kodun gereksiz içerik kaldırılarak genellikle daha küçük yapılmasıdır. Derleyici bir şey çözebilirse , argüman gider, açıkça yazmanıza gerek yoktur.

Ve eğer sadece derleyici onu okumak isteseydi bu harika olurdu. Ancak unutmayın, "insanların okuması için programlar ve yalnızca tesadüfen makinelerin çalışması için programlar yazılmalıdır." (İronik olarak, bu alıntı , büyük ölçüde aşırı kıvamı nedeniyle sıradan insanların okuması için en zor dillerden birine adanmış bir ders kitabından gelir .)

Yazarken sıkıcı, tekrarlayan bir kazan plakası gibi görünebilir, bir yıl (veya beş) sonra gelen ve kodunuzu korumak zorunda olan başka biri için değerli bir bağlam olabilir.

Daha kısa hem birşeyle ile değiştirilebilir beri WRT Java örneği özel olarak, ben kötü Demirbaş iyi bir örnek olduğunu kabul edeceğiz ve Özellikleri: kolay okunur ve aynı zamanda daha esnek. Ancak bu, tüm dillerdeki tüm demirbaş sözdizimsel öğelerin Java ve C ++ 'dan alıcılar ve ayarlayıcılar kadar israf olduğu anlamına gelmez.


7
Tabii ki, bu argüman her iki şekilde de çalışır. Demirbaş kodunun önemli miktarda derleyici yatıştırmak için sadece orada olup gelmez değil yardım insanlar kavramak - getters / belirleyiciler ile kalmak, çizgiler tamamen okunacak sahip olan onlarca "Bu sadece-do hiçbir şey Alıcılar ve ayarlayıcılar vardır" Emin olmak için , mülk başına tek bir kısa satır okumak yerine, yalnızca bir mülk olduğunu ve ne tür olduğunu belirtir.

6
Bence kazan plakası insan okuyucu için de zararlı . Tekrarlayan, anlamsız metin yazmaya zorlanarak, kodun ilgili kısımlarını diğer insanlardan gizliyoruz. Bir şey yardımcı olursa, tanım gereği kaynak plakası değildir.
Andres F.

1
@Giorgio: Aksine, bu sadece benim düşüncemden çok daha fazlası; bu, onu incelemeye çalışan insanların büyük çoğunluğunun görüşüdür. Ve "okunması zor" doğal olarak bir fikir meselesi olduğunda, bu görüşün bu kadar geniş bir şekilde paylaşılması gerçeği gerçeğe dönüştürür.
Mason Wheeler

1
@Mason Wheeler: İnsanların programlama dillerini nasıl algıladıkları genellikle geçmiş deneyimlerinden etkilenir. Şemada programlamayı öğrenen insanlar C veya Pascal'ı beceriksiz ve okunması zor bulurlar. Öte yandan, insanların büyük çoğunluğu ana dilde programlamayı öğrendi.
Giorgio

2
Kazan plakasını kaldırarak programcıdan daha fazla bağlam gizlendiğinde, sadece İnsan'ın sahnelerin arkasında görünmeyen tüm şeylerin daha büyük bir zihinsel haritasını tutması gerektiği anlamına gelir ve bu , söz konusu olduğunda daha büyük bir zarardır. geliştirme sırasında biraz görsel alan tasarrufu yapmaktan çok hata ayıklama.
Patrick Hughes

7

Ortak kod lehine bir argüman, tek bir yerde değiştirirseniz, kodun yalnızca bir akışını etkilemesidir. Bu, çoğu zaman değil, onu kullanan her kod parçasını etkilemek için bir değişiklik istediğiniz gerçeğine karşı dengelenmelidir. Ancak bu argümanı destekleyen nadir örnekler gördüm.

Diyelim ki bir kod parçanız var

public ForTheBar(Foo foo)
{
    Bar bar = foo.bar();
    return bar.BeFooed();
}

Bu, kodunuzdaki yaklaşık 2 yerde kullanılır.

Bir gün birisi gelir ve "tamam, sadece bu yolda, Fooing'den önce çubuğu Grommit yapmanızı istiyoruz."

Ve sizce "bu basit."

public ForTheBar(Foo foo, bool shouldIGrommit)
{
    Bar bar = foo.bar();

    if (shouldIGrommit)
    {
        bar.BeGrommitted();
    }

    return bar.BeFooed();
}

Sonra kullanıcı bazı yeni işlevsellik ekler ve sizce FooTheBar ile iyi uyuyor. Ve onlara, Foo'dan önce o barı Grommit yapman gerekip gerekmediğini sordun ve "hayır, bu sefer değil" diyorlar.

Yani yukarıdaki yöntemi çağırmalısınız.

Ama sonra kullanıcı "tamam, bekle, üçüncü durumda, BeFooed'i aramadan önce Çubuğu Doodle yapmanızı istiyoruz."

Sorun değil, sence, bunu yapabilirim.

public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
    Bar bar = foo.bar();

    if (shouldIGrommit)
    {
        bar.BeGrommitted();
    }

    if (shouldIDoodle)
    {
        bar.BeDoodled();
    }

    return bar.BeFooed();
}

Aniden kodunuz daha az kaynak plakası haline geliyor. Belki de tekrarlanan iki kod satırını kabul etmiş olmalısınız. Şimdiye kadar her biri 2-3 satır uzunluğunda ve artık tekrarlanan çok fazla görünmeyen üç kod parçasına sahip olacaksınız.

Bütün bunlar, "bu yaygın bir durum değil ve bu olduğunda yeniden düzenleme yapabileceğiniz" ile karşı çıkacağımı söyledi.

Son zamanlarda duyduğum başka bir argüman, kaynak plakasının bazen kodda gezinmenize yardımcı olabileceğidir. Tartıştığımız örnek tonlarca kazan plakası eşleme kodunu kaldırdığımız ve onu AutoMapper ile değiştirdiğimiz yerdi. Şimdi, her şey konvansiyona dayalı olduğu için, IDE'ye "Bu özellik nerede ayarlandı" diyemez ve bilmesini beklemezsiniz.

İnsanların IoC kapları hakkında benzer şeyler tartıştığını gördüm.

Onlarla hemfikir olduğumu söylememek, ama yine de bu adil bir argüman.


2
Cevabınızın ikinci bölümünü tercih ettim. ; p +1
Steven Jeuris

benim örneğimin sizinkine oldukça benzediğini
anlayın

Idk, grommit ve doodle işlevlerini ikinci veya daha iyi varyasyonlu işlev argümanıyla genişletilen orijinal işleve argümanlar olarak geçirerek kodları çoğaltmaktan daha kolay ve daha temiz olmaz mıydı ? Başka bir deyişle, bool anahtarları ve koşullarının eklenmesi sadece kötü bir modeldir. Örnek, kötü bir kalıbı (kod çoğaltma) daha kötü olanla değiştiriyor. İşlevleri geçemezseniz, bu, iki farklı işlevde yeniden düzenlemenin, önceki kod çoğaltması olmadan bir seçenek olacağı bir nokta olurdu.
gschenk

6

Verimliliğin evrimi

Bununla başlıyorsunuz:

<p>
    <label for="field">My field</label>
    <input type="text" id="field">
</p>

o zaman tüm bu sinir bozucu kazan plakasından kurtulun ve bir fonksiyona koyun:

  1. createFieldHtml( id, label )

    bu iyi, kendimi çok fazla satır kurtarıyorum!

  2. createFieldHtml( id, label, defaultValue )

    evet, ben de varsayılan bir değere ihtiyacım var, bu eklemek kolay oldu.

  3. createFieldHtml( id, label, defaultValue, type )

    güzel, şimdi onay kutuları için de kullanabilirim

  4. createFieldHtml( id, label, defaultValue, type, labelFirst )

    UX tasarımcısı, etiketin onay kutusundan sonra olması gerektiğini söyledi.

  5. createFieldHtml( id, label, defaultValue, type, labelFirst, isDate )

    artık gerektiğinde bir tarih seçici oluşturur. Hım .. paramlar biraz kontrolden çıkıyor

  6. createFieldHtml( id, label, defaultValue, type, labelFirst, isDate, containerCssClasses )

    CSS sınıfları eklemem gereken bir durum vardı

  7. createFieldHtml( id, label, defaultValue, type, labelFirst, isDate, containerCssClasses, fieldCssClasses, disabled, clearAfter, helpText, uploadPath )

    aaaaaaaaaaaaaaaaaaaaa

Isıtıcı levha savunmasında

Bunu kelimelere dökmekte zorlandım çünkü gerçekten son zamanlarda fark ettiğim bir şey, bu yüzden bir liste yapacağım:

  1. Bana öyle geliyor ki, biraz uzayan yinelenen çizgilere sahip olma korkusu var. Sadece birkaç satırsa hiç sorun olmayabilir. bazı şeyler doğası gereği "neredeyse tekrarlayıcı" dır (yukarıdaki örnek gibi). Uzun vadede optimizasyon yapma şansı çok az.
  2. İnsanlar bir yerde işlevselliği kapsamaya bayılırlar; nesnel olarak bakarsanız ve sadece "karmaşa gizleme" gibi görünüyor - şüpheli olun! bazı eski iyi kazanların zamanı gelmiş olabilir
  3. Gittikçe daha güçlü hale gelen bir işleve sahip olduğunuzda; girişe bağlı olarak birçok farklı yürütme yolu alır ve sonuçta çok az şey yapar - kaynatma süresi olabilir!
  4. Başka bir soyutlama katmanının üstüne bir soyutlama katmanı eklediğinizde, ancak sadece kodunuzu kısaltmak için (alttaki katman değiştirilmeyecek) - ısıtıcı plaka süresi!
  5. Eğer gerçekten bu kadar çok parametre alır bir işlevi varsa gerek belki 's Demirbaş zaman - adlandırılmış parametreleri var.

Son zamanlarda kendime sorduğum bir şey şudur:
Hiçbir şeyi değiştirmeden başka bir projeye kopyalayıp yapıştırabilir miyim? evet ise, kapsüllemek veya bir kütüphaneye koymak uygundur, eğer hayırsa: kazan plakası zamanı.

Bu, kazan plakasının kopyala ve yapıştır kodu olduğu genel algısına çok zıttır. Benim için demirbaş kopya ve yapıştırma ile ilgili, ama her zaman biraz ince ayar yapmak zorunda.


Güncelleme : Ben sadece gerçek bir ad yukarıdaki örneğimi veren bir makaleye rastladım: "çok KURU anti-desen".

İşlev daha fazla parametre alır ve farklı durumlarda davranışını kontrol etmek için giderek daha karmaşık bir iç mantığa sahiptir. Çok KURU işlevlerin fark edilmesi kolaydır. Geniş bir kullanım çeşitliliğini ele almaya çalışan çok sayıda karmaşık if-then mantığı var. [...] Ayrıca, kod küçükse ve ayrık bir işlev gerçekleştirirse, kodu tekrarlamak her zaman kötü bir şey değildir.

Kısa ve ilginç bir okuma, makaleyi burada bulabilirsiniz: Çok Kuru Anti-Desen


1
"Başka bir soyutlama katmanının üstüne bir soyutlama katmanı eklediğinizde, ancak kodunuzu daha kısa yapmak için" Doğru, yalnızca yeniden kullanma olasılığı olduğunda soyutlama katmanları eklemeniz gerekir.
Steven Jeuris

4
+1. Kendinizi tekrarlamayın, ancak neredeyse kendinizi tekrar etmekten kaçınmak için garip uzunluklara gitmeyin .
Julia Hayward

4

Boilerplate kodunu hor görüyorum , ancak boilerplate kodunu kaldırmak her zaman bunun en iyi yol olduğu anlamına gelmiyor.

WPF çerçevesi, çılgın bir kazan plakası kodu içeren bağımlılık özelliklerine sahiptir . Boş zamanlarımda , yazılması gereken kod miktarını büyük ölçüde azaltan bir çözüm araştırdım . Bir yıl sonra hala bu çözümü geliştiriyorum ve hala işlevselliğini genişletmek veya hataları düzeltmek zorundayım.

Sorun nedir? Bu, yeni şeyler öğrenmek ve alternatif çözümleri keşfetmek için harikadır, ancak muhtemelen en iyi ticari karar değildir.

WPF çerçevesi iyi belgelenmiştir. Bu düzgün sizin Demirbaş kodu yazmayı belgeler. Bu kazan plakası kodunu kaldırmayı denemek güzel bir alıştırmadır ve kesinlikle araştırmaya değer bir şeydir, ancak msdn'nin sunduğu ile aynı seviyede 'lehçe' elde etmek uzun zaman alır, her zaman sahip değiliz.


Bununla birlikte, şu anda elde ettiğim sonuçtan hala çok mutluyum ve boş zaman projelerimde memnuniyetle kullanıyorum. :)
Steven Jeuris

3
WPF ve bu bağımlılık özelliklerine her dokunduğumda, her zaman C # 'ın C ++ makroları kadar basit bir şey olmasını diliyorum. Elbette makrolar yanlış ellerde istismar edilir, ancak burada çok fazla tekrarı ortadan kaldırabilirler. Bu makroları bir dahaki sefere dilemeye başladığımda AOP çerçevenize bir göz atmam gerekecek :)
DXM

@DXM Yaparsanız ve perişan bir şekilde çökerse, beni suçlamayı ve hataları yayınlamayı unutmayın. ; p
Steven Jeuris

Kod snippet'i bağımlılık özellikleri için benim için oldukça iyi çalıştı.
Codism

@Codism: Eh, onlar olan bir çözüm, ama hor de o . :)
Steven Jeuris

1

Boyler plakası ile ilgili sorun DRY'yi ihlal etmesidir. Esas olarak, kazan plakası yazdığınızda, aynı kodu (veya çok benzer kodu) birkaç sınıfta tekrarlıyorsunuz. Bu kodun değiştirilmesi gerektiğinde, geliştiricinin kodun tekrarlandığı tüm yerleri hatırlayacağı kesin değildir. Bu, eski API'lerin veya eski yöntemlerin kullanıldığı hatalara yol açar.

Ortak plakayı ortak bir kitaplığa veya üst sınıfa yeniden yönlendirirseniz, API'nız değiştiğinde kodu yalnızca tek bir yerde değiştirmeniz gerekir. Daha da önemlisi, beklenmedik değişiklikler meydana geldiğinde, kod tek bir yerde kırılır ve her şeyin tekrar çalışması için tam olarak neyi düzeltmeniz gerektiğini bilmenizi sağlar. Bu, bir değişikliğin onlarca hatta yüzlerce sınıfta başarısızlığa neden olduğu bir senaryoya çok tercih edilir.


2
Bu nasıl ortak levha lehine bir argüman ?
Chris Wesseling

0

Farklı bir dokunuş yapacağım. Gelişimdeki tutarlılık, yazılım tasarımının en önemli özelliklerinden biridir, uygulamaları genişletilebilir ve sürdürülebilir hale getirmede kritik bir araçtır, ancak birden fazla site, dil ve zaman diliminde bir ekibi yönetirken başarılması zor olabilir.

Eğer başarılırsa, tutarlılık kodu "birini gördüğünüzde, hepsini gördünüz mü", çok daha ucuz ve bakımını daha ucuz hale getirir, ama hepsinden önemlisi uzatılması çok daha kolaydır. Biraz kaynak levhası gerektiren bir kütüphane yazdığınızda, kütüphanenizin gücü ile birlikte geliştiriciye de verdiniz:

  • Bir başlangıç ​​noktası , önsözü (kazan plakası) işlevselliğinize göre anlar, çoğu anahtar sınıf ve erişim noktası genellikle kazan plakasının bir parçası olarak öne çıkar. Bu, geliştiricilere belgelere bir başlangıç ​​noktası verir
  • Geliştiricilere verdiğiniz beklentiler belirginleşecektir, örneğin, bir izleme nesnesini başlangıç ​​ekinin parçası olarak ayarlarsanız, geliştiriciler istisnaları ve bilgileri nerede kaydedeceklerini bileceklerdir
  • Örtülü anlayış Derslere nesnelleştirilme sizin sürecinden geçmek geliştirici zorlamak gibi onlar kütüphanenizde geri kalanına ulaşmak gerekir teknikleri anlaması ve size kütüphanede boyunca kullandım herhangi sözleşmelere onları tanıtmak için fırsat olabilir
  • Kolay doğrulama sizin Demirbaş kodu genellikle çok kolay zaten hatalı bir süreç adadık hattı çok aşağısında yer sıkışmış alma tüketicileri engelleyen istisnalar ve bekçi maddeleri ile kendini doğrulamak gereklidir
  • Ortak uygulama kodu gerektiren bir kitaplığın yapılandırılması kolaydır, çünkü tek bir yürütme yolu için işlevselliği özelleştirmek için açık bir uygulama noktası vardır. Bu, özellikle gerekli kaynak plakası kodunuz Fabrika veya Komut deseni ile zenginleştirilmişse yararlıdır

Kütüphanenizdeki tüketiciler örneklemeyi kavradığında kolayca özel / uzantı yöntemleri, ebeveyn sınıfları ve hatta ortak etiket kodunu uygulamak için şablonlar oluşturabilirler.


-3

Boilerplate koduyla ilgili tek gerçek sorun, bir hata bulduğunuzda, yeniden kullandığınız tek bir yer yerine onu kullandığınız her yerde düzeltmeniz gerektiğidir .

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.