0

以下のコードを 1 つの汎用メソッドにリファクタリングするにはどうすればよいですか?
(背景情報。GSON ライブラリで使用される Json 文字列から値を取得するために使用されます)

ArrayList<Map<Object, Object>> theme = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getThemeList().size(); i = i + 1) {
    if(Boolean.parseBoolean(obj.getThemeList().get(i).getChecked())){
        Map<Object,Object> map = new HashMap<Object,Object>();
        map.put("id", obj.getThemeList().get(i).getId());
        map.put("name", obj.getThemeList().get(i).getName());
        theme.add(map);
    }
}

ArrayList<Map<Object, Object>> tag = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getTagList().size(); i = i + 1) {
    if(Boolean.parseBoolean(obj.getTagList().get(i).getChecked())){
        Map<Object,Object> map = new HashMap<Object,Object>();
        map.put("id", obj.getTagList().get(i).getId());
        map.put("name", obj.getTagList().get(i).getName());
        tag.add(map);
    }
}
4

3 に答える 3

4

getThemeList()基本的に、 orを受け入れる単一のメソッドにするだけgetTagList()です。それが彼らの唯一の違いのようです...

于 2012-05-29T13:45:25.383 に答える
3

リファクタリングほどジェネリックは適用されないため、「これをリファクタリングしてコードを再利用するにはどうすればよいか」という意味だと思います。

まず、foreach 構文を読んでください。for ループは本当に見苦しいものです。

先に進むことはあまりありませんが、これを試してください:

public interface HasIdNameAndChecked {
    String getChecked();
    String getId();
    String getName();
}

public static List<Map<String, String>> extractList(List<? extends HasIdNameAndChecked> items) {
    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    for (HasIdNameAndChecked item : items) {
        if (Boolean.parseBoolean(item.getChecked())){
            Map<String, String> map = new HashMap<String, String>();
            map.put("id", item.getId());
            map.put("name", item.getName());
            list.add(map);
        }
    }
    return list;
}

次にThemeTagクラスに を実装さHasIdNameAndCheckedせ、次のように呼び出します。

List<Map<String, String>> list1 = extractThemeList(obj.getThemeList());
List<Map<String, String>> list2 = extractThemeList(obj.getTagList());

免責事項: IDE を使用せずに入力したため、いくつかのタイプミスがある可能性があります。

于 2012-05-29T13:48:26.783 に答える
0

では、以下の順番でやってみましょう。

  1. 何が異なるかを識別します。テーマリストとタグリスト。

  2. 共通のプロパティと動作を識別します。getChecked()、getId()、getName()。

  3. 変化するものに一般化を適用します。変化するものに対して共通のインターフェースを定義します: 抽象クラス、インターフェース、動作など。

  4. ソリューションを一般化されたソリューションに更新します。

于 2012-05-29T13:55:17.577 に答える