現在、ユーザーに返されるページに基づいてサーバーロジックを調整する必要があることが多いwebappに取り組んでいます。
各ページには4文字のページコードが与えられ、これらのページコードは現在、静的な文字列としてクラスにリストされています。
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..
}
そして、多くの場合、コードには次のようなコードが表示されます(1番目の形式):
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
}
これらのページのどの共通プロパティがコードの作者をここにまとめたのかを示していないため、これは読みにくいです。if
理解するには、ブランチのコードを読む必要があります。
現在のソリューション
これらif
は、さまざまなクラスのさまざまな人々によって宣言されたページのリストを使用して部分的に簡素化されています。これにより、コードは次のようになります(2番目の形式):
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
}
...これは意図をはるかによく表します。だが...
現在の問題
ここでの問題は、ページを追加する場合、理論的にはすべてのコードベースを調べif()
て、そのようなリストにページを追加する必要があるかどうかを確認する必要があることです。
これらのリストをすべてPageCodes
静的定数としてクラスに移動した場合でも、新しいページがこれらのリストのいずれかに適合するかどうかを確認し、それに応じて追加するには、開発者からの規律が必要です。
新しいソリューション
私の解決策は列挙型を作成することでした(ページコードには有限の既知のリストがあるため)。各ページには設定する必要のあるプロパティが含まれています。
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
}
次に、条件コードは次のようになります(3番目の形式)。
if (destinationPage.hasShoppingCart()) {
// add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
// add some info related to flight availability
}
とても読みやすいです。さらに、誰かがページを追加する必要がある場合、彼/彼女は各ブール値と、これが彼の新しいページについて真であるか偽であるかについて考えることを余儀なくされます。
新しい問題
私が見る1つの問題は、このような10個のブール値が存在する可能性があることです。これにより、コンストラクタが非常に大きくなり、ページを追加するときに宣言を取得するのが難しくなる場合があります。誰もがより良い解決策を持っていますか?