2016-07-29 68 views
2

以前我有一種叫做「搜索」的方法。這個方法實際上做了兩件事:搜索/返回找到的文章,並計算結果集的一些數據。我現在創建了兩種方法:一種用於搜索和回饋文章。其他搜索和計算數據。重構:結合兩種方法

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)。

+0

就我所見,你的第二個函數永遠不會填充out參數。 – Nyerguds

+0

現在呢,錯別字 – user2939331

回答

2
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; 

} 

像這樣的事情應該幫助,但我認爲這是矯枉過正。

+0

無論如何,如果你使用「數據傳輸對象」的方式,只需要爲其創建一個實際的類,而不是使用帶硬編碼字符串的字典,這會更加簡潔。 – Nyerguds

+0

@Nyerguds我同意你的100%。 – mybirthname

+0

不是在.NET中重構的超級familiair。如果我使用Classes而不是字典,這是乾淨的解決方案嗎? – user2939331

0

只需使用搜索的返回值作爲參數傳遞給統計:

所以簽名將如下:

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

private FacetStatisticsModel searchWithStats(
    List<SummaryRootEntity> searchResults) 
{ 
} 

的,你可以調用

var searchResult = Search(x, y, z); 

var searchResult = Search(x, y, z); 
var statsResult = Stats(searchResult); 
+0

我也認爲,但這意味着這兩種方法將包含第一〜7行。這將是重複的代碼。所以變量(inactiveForDays,searchProfileGroups,searchBounds)將在Search()和Stats()中聲明。 – user2939331

0

這兩個函數都做同樣的事情,只有其中一個做了一些額外的,對吧?

我只是把它們都放到一個函數中,然後在函數參數中添加一個額外的參數Boolean withStats。然後你可以在函數中使用if/else來執行每個case所需的步驟。你沒有這樣的重複代碼,只有一個功能具有部分分支功能的所有情況。

你會得到實際的全部功能,其所有的參數,如:

private List<SummaryRootEntity> search(
    Int32 contentId, 
    SearchModel query, 
    Boolean withStats, 
    out FacetStatisticsModel stats, 
    Boolean includeTypeGroupFilters = true) 
{ 
    // I'll leave the actual combining part here up to you. 
    // Shouldn't be too hard to implement. 
} 

現在,這是一個有點笨重,與兩個輸出參數和布爾;你的普通搜索調用需要定義一個他們從未實際使用的'out'參數,並且兩者都需要給出該布爾值,從技術上可以推斷出你是否要給出'out'參數。您可能更願意按照以前的方式撥打電話。

好吧,那很容易;只是做兩個重載,指向你剛剛做出的同樣的中心功能。這爲您處理這些參數。

超載與統計呼籲搜索:

private List<SummaryRootEntity> search(
    Int32 contentId, 
    SearchModel query, 
    out FacetStatisticsModel stats, 
    Boolean includeTypeGroupFilters = true) 
{ 
    return search(contentId, query, true, out stats, includeTypeGroupFilters); 
} 

過載而沒有統計調用搜索,這使得完全丟棄虛擬「出」參數:

private List<SummaryRootEntity> search(
    Int32 contentId, 
    SearchModel query, 
    Boolean includeTypeGroupFilters = true) 
{ 
    FacetStatisticsModel stats; 
    return search(contentId, query, false, out stats, includeTypeGroupFilters); 
} 

呯,代碼壓縮到一個功能。您當然必須確保「withStats = false」執行使用null填充out參數。