Ş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. if
Anlamak 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 PageCodes
sı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ı?