Çok sayıda boole özellikli numaralandırma


11

Şu anda sık sık kullanıcıya iade edilecek sayfaya dayalı bazı sunucu mantığı koşul gerekir bir webapp üzerinde çalışıyorum.

Her sayfaya 4 harfli bir sayfa kodu verilir ve bu sayfa kodları şu anda bir sınıfta statik Dizeler olarak listelenir:

public class PageCodes {
    public static final String FOFP = "FOFP";
    public static final String FOMS = "FOMS";
    public static final String BKGD = "BKGD";
    public static final String ITCO = "ITCO";
    public static final String PURF = "PURF";
    // etc..
}

Ve genellikle kodda böyle bir kod görüyoruz ( 1. form ):

if (PageCode.PURF.equals(destinationPageCode) || PageCodes.ITCO.equals(destinationPageCode)) {
    // some code with no obvious intent
} 
if (PageCode.FOFP.equals(destinationPageCode) || PageCodes.FOMS.equals(destinationPageCode)) {
    // some other code with no obvious intent either
} 

Okumak korkunç bir şey çünkü bu sayfaların hangi ortak özelliğinin kod yazarının onları burada bir araya getirmesine yol açtığını göstermiyor. ifAnlamak için daldaki kodu okumalıyız .

Mevcut çözüm

Bunlar if, farklı sınıflardaki farklı kişiler tarafından bildirilen sayfa listeleri kullanılarak kısmen basitleştirilmiştir. Bu, kodu aşağıdaki gibi yapar ( 2. form ):

private static final List<String> pagesWithShoppingCart = Collections.unmodifiableList(Arrays.asList(PageCodes.ITCO, PageCodes.PURF));
private static final List<String> flightAvailabilityPages = Collections.unmodifiableList(Arrays.asList(PageCodes.FOMS, PageCodes.FOFP));

// later in the same class
if (pagesWithShoppingCart.contains(destinationPageCode)) {
    // some code with no obvious intent
} 
if (flightAvailabilityPages.contains(destinationPageCode)) {
    // some other code with no obvious intent either
} 

... niyetini çok daha iyi ifade ediyor. Fakat...

Şuanki problem

Buradaki sorun, bir sayfa eklersek, teorik olarak sayfamızı if()böyle bir listeye veya bir listeye eklememiz gerekip gerekmediğini bulmak için tüm kod tabanından geçmemiz gerektiğidir.

Tüm bu listeleri PageCodessınıfa statik sabitler olarak taşısak bile, geliştiricilerin yeni sayfalarının bu listelerden herhangi birine uyup uymadığını kontrol etmek ve buna göre eklemek için hala disipline ihtiyacı vardır.

Yeni çözüm

Benim çözümüm, her sayfanın ayarlamamız gereken bazı özellikler içerdiği bir numaralandırma oluşturmaktı (çünkü sınırlı bir sayfa kodları listesi var):

public enum Page {
    FOFP(true, false),
    FOMS(true, false),
    BKGD(false, false),
    PURF(false, true),
    ITCO(false, true),
    // and so on

    private final boolean isAvailabilityPage;
    private final boolean hasShoppingCart;

    PageCode(boolean isAvailabilityPage, boolean hasShoppingCart) {
        // field initialization
    }

    // getters
}

Sonra koşullu kod şimdi şöyle görünür ( 3. form ):

if (destinationPage.hasShoppingCart()) {
    // add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
    // add some info related to flight availability
}

Hangi çok okunabilir. Ayrıca, birisinin bir sayfa eklemesi gerekiyorsa, her bir boole ve bunun yeni sayfası için doğru veya yanlış olup olmadığını düşünmeye zorlanır .

Yeni Sorun

Gördüğüm bir sorun, bunun gibi belki 10 boolean olacak, bu da yapıcıyı gerçekten büyük kılıyor ve bir sayfa eklediğinizde bildirimi doğru şekilde almak zor olabilir. Daha iyi bir çözümü olan var mı?

Yanıtlar:


13

Fikri bir adım ileri taşıyabilir ve booleans kullanmak yerine sayfa özellikleriniz için bir numaralandırma tanımlayabilirsiniz.

Bu, sayfaya bir özellik eklemeyi / kaldırmayı kolaylaştırır ve 30-40 potansiyel özellik olsa bile sayfa tanımlarını anında okunabilir hale getirir.

public enum PageFeature {
    AVAIL_PAGE,
    SHOPPING_CART;
}

public enum Page {
    FOFP(AVAIL_PAGE),
    FOMS(AVAIL_PAGE),
    BKGD(),
    PURF(SHOPPING_CART, AVAIL_PAGE),

    private final EnumSet<PageFeature> features;

    PageCode(PageFeature ... features) {
       this.features = EnumSet.copyOf(Arrays.asList(features));
    }

    public boolean hasFeature(PageFeature feature) {
       return features.contains(feature);
    }
 }

Bunu düşündüm, ama burada, geliştirici tüm sorulara cevap vermek zorunda değil "boş bir sayfa mı?", "Bir alışveriş sepeti var mı?" Birçoğu olduğunda, kolayca unutursunuz.
Joffrey

5
@Joffrey Bunu düşündüğünüzde, on boole sahibi onları en azından düşündükleri bir yanıtı da vermeye zorlamaz. En olası senaryo, sadece başka bir sayfanın tanımını kopyalayacak veya IDE'nin tüm parametreleri doldurmasına izin verecek false, sonra bir veya iki (muhtemelen yanlış olanı, izlemesi çok zor olduğu için) değiştirecekleridir. Aptalca karşı mükemmel bir koruma yoktur ve doğru şeyi yapmak için geliştiricilerinize güvenmeniz gereken bir nokta vardır.
biziclop

Doğru, ben bu şekilde düşünmedim :) Ve boolean tarafından verilen küçük ekstra "aptal-geçirmez" lizibilite bozulmaya değer olduğunu düşünmüyorum, bu yüzden muhtemelen vararg çözüm ile gideceğim. Fikriniz için teşekkürler!
Joffrey

1
İyi bir çözüm. Rağmen 6502s kodlanan parçası her şeyi bit içine tıkmak istiyor. :-)
user949300

@ user949300 Düşündüğüm ilk vararg benzeri çözüm aslında bit maskeleri :) ama bir enum türü ile gerçek bir vararg temiz
Joffrey
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.