2017-04-20 8 views
-1

私はサービスコールを介して別のプロバイダを取得しています。このスイッチのケースを最小限に抑える方法は?

このベースでは、タブのセクションが異なります。このコードを最小化したいと考えています:

if(selectedProvider.equalsIgnoreCase("youtube")){ 
    switch (tabName.toLowerCase()) { 
     case "songs": 
      sectionTab = "video"; 
      break; 
     case "artists": 
      sectionTab=""; 
      break; 
     case "albums": 
      sectionTab="channel"; 
      break; 
     case "playlists": 
      sectionTab="playlist"; 
      break; 
    }} 
else if(selectedProvider.equalsIgnoreCase("soundcloud")){ 
    switch (tabName.toLowerCase()) { 
     case "songs": 
      sectionTab = "track"; 
      break; 
     case "artists": 
      sectionTab="artist"; 
      break; 
     case "albums": 
      sectionTab=""; 
      break; 
     case "playlists": 
      sectionTab="playlist"; 
      break; 
    }} 
else { 
    switch (tabName.toLowerCase()) { 
     case "songs": 
      sectionTab = "track"; 
      break; 
     case "artists": 
      sectionTab = "artist"; 
      break; 
     case "albums": 
      sectionTab = "album"; 
      break; 
     case "playlists": 
      sectionTab = "playlist"; 
      break; 
    } 
} 
+1

マップを使用して翻訳の内容を判断することをお勧めします。 –

+1

[コード内のスイッチを排除する方法]の可能な複製(0120-13-011) – Tom

+0

はい、重複するスイッチを削除したい –

答えて

1

可能な解決策の1つは、マップを含むマップを使用することです。

同様:

Map<String, String> soundCloudMappings = new HashMap<>(); 
soundCloudMappings.put("songs", "track"); 

...

Map<String, Map<String, String> providerMappings = ... 
providerMappings.put("soundcloud", soundCloudMappings); 

とprovider.toLowerCaseは()あなたの外側のマップに存在する場合、あなたは確認することができます。内側のマップに正しいsectionTabエントリがないか尋ねてください。

もちろん、これはかなり「低レベル」のソリューションです。コンテキストに応じて、これらの生の文字列をEnums定数に変換する方法を検討することもできます。そのEnumに素晴らしいマッピングメソッドを追加します。つまり、コンパイル時の安全性の向上と柔軟性(文字列ですべてを行う)をバランスさせることを検討してください。

0

あなたは

static final Map<String, String> SECTION_TAB2 = new LinkedHashMap<>(); 
static final Map<String, String> SECTION_TAB1 = new LinkedHashMap<>(); 

static { 
    // are there special two word outcomes 
    SECTION_TAB2.put("youtube songs", "artists"); 
    SECTION_TAB2.put("youtube artists", ""); 
    SECTION_TAB2.put("youtube albums", "channel"); 
    SECTION_TAB2.put("soundcloud albums", ""); 
    // if not, what are the default tab name outcomes. 
    SECTION_TAB1.put("songs", "track"); 
    SECTION_TAB1.put("artists", "artist"); 
    SECTION_TAB1.put("albums", "album"); 
    SECTION_TAB1.put("playlists", "playlist"); 
} 

public static String sectionTab(String selectedProvider, String tabName) { 
    return SECTION_TAB2.getOrDefault((selectedProvider + " " + tabName).toLowerCase(), 
      SECTION_TAB1.get(tabName.toLowerCase())); 
} 
+0

ありがとうございましたコードが本当に助けになりました。 –

0

が、私は、我々は避けるために、グアバテーブルを使用することができます

 public static void main(String[] args) throws IOException 
{ 
    Table<String,String,String> table= HashBasedTable.create(); 
    table.put("youtube","songs","video"); 
    table.put("youtube","artists",""); 
    table.put("youtube","albums","channel"); 
    table.put("youtube","playlists","playlist"); 
    table.put("soundcloud","songs","track"); 
    table.put("soundcloud","artists","artist"); 
    table.put("soundcloud","albums",""); 
    table.put("soundcloud","playlists","playlist"); 
    table.put("default","songs","track"); 
    table.put("default","artists","artist"); 
    table.put("default","albums","albums"); 
    table.put("default","playlists","playlist"); 
    String sectionTab = table.get("soundcloud","artists"); // u will get artist 
} 

のための答えとしてコメントしていますので、コメントすることができません翻訳を行うには、このような地図のカップルを使用することができますマップのマップと

https://www.tutorialspoint.com/guava/guava_table.htm

0

を維持し、redableやすいです私は、このような状況でそれをコーディングするのではなく、ロジックを定義する構造を構築することを好みます。このようにそれをやってする

// What tabs we have. 
enum Tabs { 
    songs, 
    artists, 
    albums, 
    playlists; 
    // Build a lookup. 
    static Map<String, Tabs> lookup = Arrays.stream(Tabs.values()).collect(Collectors.toMap(e -> e.name(), e -> e)); 

    static Tabs lookup(String s) { 
     return lookup.get(s); 
    } 
} 

// The providers. 
enum Providers { 
    youtube("video","","channel","playlist"), 
    soundcloud("track","artist","","playlist"), 
    others("track","artist","album","playlist"); 
    // Build a String lookup. 
    static Map<String, Providers> lookup = Arrays.stream(Providers.values()).collect(Collectors.toMap(e -> e.name(), e -> e)); 

    Map<Tabs,String> tabs = new HashMap<>(); 
    Providers(String track, String artist, String album, String playlists) { 
     tabs.put(Tabs.songs, track); 
     tabs.put(Tabs.artists, artist); 
     tabs.put(Tabs.albums, album); 
     tabs.put(Tabs.playlists, playlists); 
    } 

    static Providers lookup(String s) { 
     Providers p = lookup.get(s); 
     // Default to others. 
     return p == null ? others : p; 
    } 

    public static String getSectionTabName(String provider, String tabName) { 
     // Lookup the provider. 
     Providers p = lookup(provider); 
     Tabs t = Tabs.lookup(tabName); 
     return p.tabs.get(t); 
    } 
} 

public void test() { 
    String provider = "youtube"; 
    String tabName = "albums"; 
    String section = Providers.getSectionTabName(provider, tabName); 
    System.out.println(provider+"!"+tabName+" = "+section); 
} 

利点:新しいプロバイダを追加する

  • はちょうど新しい列挙型を追加する必要があります。
  • 新しいタブを追加するのはやや単純です(Providersコンストラクタに新しいパラメータを追加する)が、コードを大幅に変更することはありません。
関連する問題