SORU
25 ŞUBAT 2010, PERŞEMBE


Çok tekrarlanan kod yönetimi ve Dokümantasyon Java

Çok tekrarlanan kod genellikle kötü bir şeydir, ve bunu en aza indirmek yardımcı olabilir tasarım desenleri vardır. Ancak, bazen sadece kaçınılmaz dilin kendisi kısıtlamaları nedeniyle. java.util.Arrays: Aşağıdaki örnek al

/**
 * Assigns the specified long value to each element of the specified
 * range of the specified array of longs.  The range to be filled
 * extends from index <tt>fromIndex</tt>, inclusive, to index
 * <tt>toIndex</tt>, exclusive.  (If <tt>fromIndex==toIndex</tt>, the
 * range to be filled is empty.)
 *
 * @param a the array to be filled
 * @param fromIndex the index of the first element (inclusive) to be
 *        filled with the specified value
 * @param toIndex the index of the last element (exclusive) to be
 *        filled with the specified value
 * @param val the value to be stored in all elements of the array
 * @throws IllegalArgumentException if <tt>fromIndex > toIndex</tt>
 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex < 0</tt> or
 *         <tt>toIndex > a.length</tt>
 */
public static void fill(long[] a, int fromIndex, int toIndex, long val) {
    rangeCheck(a.length, fromIndex, toIndex);
    for (int i=fromIndex; i<toIndex; i  )
        a[i] = val;
}

Yukarıdaki Pasajı kaynak kod 8 kez, belgelerinde çok az değişim yöntemi imza/ama görünüraynı yöntem gövdesibiri her kök dizi türleri int[], short[], char[], byte[], boolean[], double[], float[], ve Object[].

Bir yansıma başlı başına tamamen farklı bir konu olan) resorts sürece, bu tekrarı kaçınılmaz olduğuna inanıyorum. Bir yardımcı sınıf olarak, tekrarlayan Java kodu gibi yüksek konsantrasyon son derece atipik, ama en iyi yöntem bile, bunu anlıyorumtekrarı oluyor! Yeniden düzenleme her zaman mümkün (açık durumda tekrar belgelerinde olduğunda değil, çünkü işe yaramıyor.

Belli ki bu kaynak kodu korumak olduğu bir kabus. Belgelerinde ufak bir yazım hatası, ya da bu uygulama küçük bir hata, ancak çok tekrar yapıldı çarpılır. Aslında, en iyi örnek tam olarak bu sınıfa dahil olur:

Google Research Blog - Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken (by Joshua Bloch, Software Engineer)

Böcek şaşırtıcı derecede ince, birçok düşünce ne kadar basit ve kolay bir algoritması olarak gerçekleşiyor.

    // int mid =(low   high) / 2; // the bug
    int mid = (low   high) >>> 1; // the fix

Yukarıdaki satırgörünür kaynak kod içinde 11 kez!

Bu yüzden benim sorular şunlardır:

  • Nasıl tekrarlayan Java kod/belgeleri uygulamada işlenen bu tür? Ne kadar gelişmiş, bakımı ve test ediyorlar?
    • Başlarsın "özgün", ve bunu mümkün olduğunca olgun olun ve sonra Kopyala ve gerektiği gibi yapıştırın ve bir hata yapmadın umarım?
    • Ve eğer orijinal bir hata yaptın, o zaman sadece kopya silme ve tüm çoğaltma işlemi tekrar rahat olduğun sürece her yerde bunu düzeltmek?
    • Ve seni test kodu için aynı işlemi de geçerli mi?
  • Java kullanımı sınırlı çeşit yarar kaynak bu tür bir şey için ön kod?
    • Belki de Güneş, yazmak, belge ve tekrarlayan kütüphane kodu bu tür test korumaya yardımcı olmak için kendi işleyişi vardır?

Yorum Google Koleksiyonları çok çektim başka bir örnek talep: com.google.common.base.Predicates çizgiler 276-310 (AndPredicate) vs hatları 312-346 (OrPredicate).

Bu iki sınıf için kaynak için de aynıdır:

  • AndPredicate Galatasaray OrPredicate (her biri kendi sınıfında 5 kez görünür)
  • "And(" vs Or(" (toString() ilgili yöntem)
  • #and vs #or (@see Javadoc yorum)
  • true vs 25* *(apply; ! ifadesi dışında yazılmış olabilir)
  • -1 /* all bits on */ vs hashCode() 29*
  • hashCode() 31 *vs* 32*

CEVAP
26 ŞUBAT 2010, Cuma


Kesinlikle performans ihtiyacı olan insanlar için, Boks ve kutulama ve generified koleksiyonları ve etajer-hayır büyük.

Aynı sorun performans aynı karmaşık iş için gereken bilgi işlem yüzer ve çift (yöntem Goldberd içinde gösterilen bazı söylüyorlar . hem de olur ^em>"What every computer scientist should know about floating-point numbers"kağıt).

Troveneden'TIntIntHashMap Java etrafında daireler çalışır s veri aynı miktarda ile çalışırken HashMap<Integer,Integer>. var

Şimdi nasıl Hazinesi koleksiyonun yazılı kaynak kodu?

Tabii ki kaynak kod araçları kullanarak :)

Kod jeneratörler tekrarlanan kaynak kodu oluşturmak için kullanan yüksek performans (daha yüksek varsayılan Java olanlar) için bazı Java kütüphaneleri var.

Hepimizin bildiği "kaynak kod araçları" kötü ve kod oluşturma yaramaz, ama hala böyle insanlar gerçekten ne yaptıklarını biliyorlar (yani bu tür insanlar bunu yazma gibi şeyler Hazinesi) yap :)

Ne gibi büyük uyarıları içeren kaynak kodu oluşturun

/*
 * This .java source file has been auto-generated from the template xxxxx
 * 
 * DO NOT MODIFY THIS FILE FOR IT SHALL GET OVERWRITTEN
 * 
 */

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Breno Rises

    Breno Rises

    7 Ocak 2014
  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008