c# - 重构:结合两种方法

标签 c# refactoring

以前我有一种称为“搜索”的方法。该方法实际上做了两件事:搜索/返回找到的文章并计算结果集的一些数据。我现在创建了两种方法:一种用于搜索和返回文章。另一个搜索 AND 计算数据。

第一个仅执行搜索的方法:

private List<SummaryRootEntity> search(int contentId,SearchModel query, bool includeTypeGroupFilters = true)
{
    cleanQuery(query);

    var inactiveForDays = getinactiveForDays();

    var searchProfileGroups = _manager.GetSearchProfileGroupsForSite(query.PropertyType);
    setLocationOfInterest(query);
    var searchBounds = _manager.GetSearchBounds(query.StreetID, query.SublocalityID);

    var shopsList = getShops();

    searchmodelDto.shops = shopsList;
    var filteredArticles = _articleService.Search(
        contentId,
        query,
        searchBounds,
        searchProfileGroups,
        inactiveForDays,
        includeTypeGroupFilters);

    // apply ordering
    var result = filteredArticles.ApplyOrdering(query.ForSaleOrRent, query.OrderBy, query.OrderDescending).ToList();

    return result;
}

第二个搜索并计算统计数据:

private List<SummaryRootEntity> searchWithStats(
    int contentId,
    SearchModel query,
    out FacetStatisticsModel stats,
    bool includeTypeGroupFilters = true)
{
    cleanQuery(query);

    var inactiveForDays = getinactiveForDays();

    var searchProfileGroups = _manager.GetSearchProfileGroupsForSite(query.Type);
    setLocationOfInterest(query);
    var searchBounds = _manager.GetSearchBounds(query.StreetID, query.SublocalityID);

    var shopsList = getShops();

    query.shops = shopsList;
    var filteredArticles = _articleService.Search(
        contentId,
        query,
        searchBounds,
        searchProfileGroups,
        inactiveForDays,
        includeTypeGroupFilters);

    var displaySearchResultSummary = getDisplaySearchResult ?? true;
    var stats = _articleService.GetStatistics(
        Site.ContentRoot.Id,
        shopsList,
        inactiveForDays,
        displaySearchResultSummary,
        searchProfileGroups,
        filteredArticles,
        query,
        searchBounds,
        Site.DefaultCultureInfo);

    // apply ordering
    var result = filteredArticles.ApplyOrdering(query.ForSaleOrRent, query.OrderBy, query.OrderDescending).ToList();

    return result;
}

第二种方法的开头与第一种方法相同。第二种方法通过“out”参数返回统计信息。

有什么办法可以用不同的方法来计算统计数据吗?我可以直接从第二种方法中删除搜索,但随后我必须将所有变量定义两次(inactiveForDays、searchProfileGroups、searchBounds)。

最佳答案

public Dictionry<string, object> PrepareQueryValues(SearchModel query)
{
     cleanQuery(query);

     Dictionary<string, object> dic = new Dictionary<string, object>();

     dic.Add("InactiveForDay", getinactiveForDays());
     dic.Add("SearchProfileGroups",_manager.GetSearchProfileGroupsForSite(query.PropertyType)); 
     dic.Add("SearchProfileGroups", setLocationOfInterest(query));
     dic.Add("SearchBounds", _manager.GetSearchBounds(query.StreetID, query.SublocalityID));
     dic.Add("ShopsList", getShops());

     return dic;         
}

所以你的第一个方法:

private List<SummaryRootEntity> search(int contentId,SearchModel query, bool includeTypeGroupFilters = true)
{
      Dictionary<string, object> dic = PrepareQueryValues(query);

      searchmodelDto.shops = (CastToProperType)dic["ShopsList"];
      var filteredArticles = _articleService.Search(
      contentId,
      query,
      (CastToProperType)dic["SearchBounds"],
      (CastToProperType)dic["SearchProfileGroups"],
      (CastToProperType)dic["InactiveForDays"],
      includeTypeGroupFilters);

      // apply ordering
      var result = filteredArticles.ApplyOrdering(query.ForSaleOrRent, query.OrderBy, query.OrderDescending).ToList();

      return result;

}

这样的东西应该有帮助,但我认为这有点过分了。

关于c# - 重构:结合两种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38659211/

相关文章:

c# - 如何提高这些 linq 语句的可读性?

java - Extract Class Eclipse IDE 重构功能有何用处?

java - 重构包名破坏了整个应用程序

c# - 运行时 EF6(mssql、mysql、oracle)的多个数据库提供程序的 Entity Framework 代码的动态连接字符串优先

c# - 如何从总秒数中获取日期时间?

c# - 使用 IoC 进行生产和测试的最佳方式

java - Eclipse - 记录并应用移动和重命名重构到另一个工作区

c# - MSXML 创建 XML "header"

string.Padding() 的 C# 控制台文本对齐问题

ruby-on-rails - 抽象异常检查