2012-11-13 73 views
-1

我已經搜索谷歌和stackvoverflow得到的答案,但它都歸結爲:創建方法。 我希望我的代碼可以重用。我不想在同一個類中創建其他方法。這個類已經包含了很多代碼。如何在具有可讀類的同時降低複雜性? 我想過創建另一個班級,並在那裏有所有的新方法。如何降低if語句的複雜度?

public Issue GetIssue(int issueId, IssueOption issueOption) 
     { 
      string resource = "issues/{id}.xml?"; 

      if (issueOption.IncludeRelation) 
      { 
       resource += "include=relations&"; 
      } 
      if (issueOption.IncludeChildren) 
      { 
       resource += "include=children"; 
      } 

      //To fetch multiple associations use comma (e.g ?include=relations,journals 

      RestRequest request = new RestRequest(resource); 
      request.AddParameter("id", issueId, ParameterType.UrlSegment); 

      Issue issue = Execute<Issue>(request); 

      if (issueOption.IncludeVersion) 
      { 
       issue.Fixed_version = GetVersion(issue.Project.Id); 
      } 

      if (issue.Parent != null && issueOption.IncludeParent) 
      { 
       issue.Parent = GetIssue(issue.Parent.Id, issueOption); 
      } 

      if (issueOption.IncludeUsers) 
      { 
       if (issue.Author.Id == issue.Assigned_to.Id) 
       { 
        issue.Author = GetUser(issue.Author.Id); 
        issue.Assigned_to = issue.Author; 
       } 
       else 
       { 
        issue.Author = GetUser(issue.Author.Id); 
        if (issue.Assigned_to != null) 
        { 
         issue.Assigned_to = GetUser(issue.Assigned_to.Id); 
        } 
       } 
      } 

      if (issueOption.IncludeProject) 
      { 
       issue.Project = GetProject(issue.Project.Id); 
      } 

      return issue; 
     } 
+1

它不以某種方式工作嗎?如果不是,這屬於代碼審查,而不是SO。 – Servy

+0

用較小的方法用描述性名稱包裝它們。也可以明確傳遞bool以啓用測試。 –

+2

「我希望我的代碼可以重用,我不想在同一個類中創建其他方法。「 - 這些對我來說似乎是矛盾的,他們對你不怎麼樣? –

回答

1

可讀的代碼的道路是很粗糙了的遺留代碼。

首先,你應該有完全覆蓋你正在重構的代碼的測試,否則你最終會在一場致盲的暴風雪中穿越那條崎嶇不平的道路 - 這可能但並不有趣,而且非常危險。

一旦你覆蓋了你的屁股,你就可以開始重構。總的來說,大部分早期重構(假設有許多類似的方法)將是提取方法。從那裏開始,一些課堂行爲應該開始變得明顯,然後你可以提取出來。

我想過要創建另一個類,並擁有所有新的方法。

這類似於通過推動牀下的一切來清潔你的房間。房間很乾淨,但你只能隱藏混亂。不要沒有任何想法,否則你最終會得到一個類比現在更糟的課程。

從OOP的角度來看,通常需要朝着SOLID解決方案工作。從傳統觀點來看,關鍵的原則是爲您的課程設定單一職責。如果你有這些,O-L-I-D傾向於恰到好處(根據我的經驗,儘管我已經有了比我更喜歡的更多的棕色地塊開發經驗)。

1

這個類已經包含了很多的代碼。 ... 我想過創建另一個班級,並且在那裏有所有新的方法, 。

這正是你應該做的。

0

正如您所提到的,將代碼分解爲更小的方法是最好的選擇。如何使用靜態擴展方法組織代碼,看到Issue如何是代碼的主要議題:

// top-down: 
RestRequest request = GetRequestForIssueOption(issueId, issueOption); 
Issue issue = Execute<Issue>(request); 

// make it fluent... 
return issue.SetVersion() 
.SetParent() 
.SetUsers() 
.SetProject(); 

我覺得靜態擴展方法是有意義的使用。就個人而言,我認爲使靜態擴展流暢有助於使代碼更清晰,不知道這是否是您的一杯茶。

public static Issue SetVersion(this Issue issue_) 
{ 
    // code here 
} 

public static Issue SetParent(this Issue issue_) 
{ 
    // code here 
} 

public static Issue SetUsers(this Issue issue_) 
{ 
    // code here 
} 

public static Issue SetProject(this Issue issue_) 
{ 
    // code here 
}