重複を削除するために、このコードをクリーンアップするにはどうすればよいですか?
-
01-10-2019 - |
質問
複製がある次のコードがあります
private List<SelectListItem> GetDeskList(int deskId)
{
List<Desk> apps = Model.GetDesks();
List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
{
Selected = c.Id == deskId,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
private List<SelectListItem> GetRegionList(int regionId)
{
List<Region> apps = Model.GetRegions();
List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
{
Selected = c.Id == regionId,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
似たようなパターンでもう少し好きです。重複を避けるためにこれをリファクタリングする最良の方法は何ですか
解決
モデルを変更して共通のインターフェイスを実装できる場合(または共通のベースクラスから継承)、次のようなことができるかもしれません。
var desks = GetList(123, () => Model.GetDesks());
var regions = GetList(456, () => Model.GetRegions());
// ...
private List<SelectListItem> GetList<T>(int id, Func<List<T>> getApps)
where T : IDropdownItem
{
List<T> apps = getApps();
List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
{
Selected = c.Id == id,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
public interface IDropdownItem
{
int Id { get; }
string Name { get; }
}
public class Desk : IDropdownItem { /* ... */ }
public class Region : IDropdownItem { /* ... */ }
他のヒント
暗闇の中での刺し傷ですが、このようなものはあなたが率いるべき場所です:
private List<SelectListItem> GetList<T>(List<T> list, int Id)
{
List<SelectListItem> dropdown = list.ConvertAll(c => new SelectListItem
{
Selected = c.Id == Id,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
そして、のメソッドを呼び出す代わりに、タイプの安全リストに渡す GetList
方法
private List<SelectListItem> GetObjectList<ObjectType>(int id, Func<List<ObjectType>> getObjects)
{
List<ObjectType> apps = getObjects();
List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
{
Selected = c.Id == id,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
private List<SelectListItem> GetDeskList(int deskId)
{
return GetObjectList(deskId, (() -> Model.GetDesks()));
}
private List<SelectListItem> GetRegionList(int regionId)
{
return GetObjectList(regionId, (() -> Model.GetRegions()));
}
リストアイテムタイプの関数をテンプレート化し、リストに渡すのでしょうか?
private List<SelectListItem, ItemType> GetRegionList(int theId, List<ItemType> apps)
{
List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
{
Selected = c.Id == theId,
Text = c.Name,
Value = c.Id.ToString()
}).ToList();
dropdown.Insert(0, new SelectListItem());
return dropdown;
}
List<Desk> apps = Model.GetDesks();
GetRegionList<SelectListItem,Desk>(ID, apps);
また、パターンに関するマシューコクランのブログをいくつか見てみましょう。私はそれらが本当に役に立つと思いました。これが1つです:訪問者パターン そして、彼の投稿の下を見て、彼のパターンのいくつかを見てください。
所属していません StackOverflow