2012-11-13 72 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 
}