什么是超大开关的替代品



我正在应用程序中集成伪搜索功能。我有一个搜索小部件,它提供了一个搜索提示列表(这些提示来自fts3-sqlite表)。当用户单击搜索提示时,相应的sqlite表将填充listView。

我需要一种方法来确定什么表将基于所选的搜索提示来填充列表。我正在考虑做这样的事情:

switch(search_hint){
    case(search_hint_1):  useTable(table_1);
                          break;
    case(search_hint_2):  useTable(table_2);
                          break;
    case(search_hint_3):  useTable(table_1 + table_2); // Case when I need to use
                          break;                       // two tables for ListView
}

我相信这是一个可能的解决方案,但如果有几个(数百或数千)案例呢?有人能提出一个更好的方法来面对这一点吗?

如果可以的话,将映射到某种类型的对的数组中,然后只需使用for-loopif即可遍历它们。类似于我在重构重复的guard语句中的建议。您需要创建一个类似于pair的类,该类包含提示和表。

要么这样,要么创建一个实际的地图。并使用search_hint作为关键字。

Map< /*insert hint type here*/,Table> mapTable;

例如。

根据我的想法,我认为可行的方法。。使用HashMap键值对。。(仅伪码)

Map<Integer,String> mapTable = new HashMap<Integer,String>();
mapTable.put(search_hint_1,table_1);
.
.
.

只需访问useTable(mapTable.get(search_hint));

switch语句是面向对象设计中的反模式(请参阅对象思维)。您应该使用继承。

将信息放入搜索提示表中。你需要考虑一下你所拥有的不同案例,以及如何将它们分解成可配置的小块。

search_hint_1  table_1
search_hint_2          table_2
search_hint_3  table_1 table_2

使用枚举器。类似:

private static enum DojoDecider {   
    search_hint_1(table_1),
    search_hint_2(table_2);     
    private Table var;      
    private DojoDecider(Table var) {
        this.var = var;
    }
    @SuppressWarnings("unused")
    public Table getVar() {
        return var;
    }           
}
final int[] hintArray = {search_hint_1, search_hint_2, search_hint_3};
final String[] tableArray = {table_1, table_2, table_3};
private Map<Integer,String> hintMap = new HashMap<Integer,String>();
// Populate the map, probably at onCreate() of your activity
for(int i=0; i<hintArray.length; i++) {
    hintMap.put(hintArray[i], tableArray[i]);
}
// When you want to get it
useTable(hintMap.get(search_hint));

最新更新