我搜索了google和stackvoverflow以获得答案,但这一切归结为:创建方法。 我希望我的代码可以重用。我不想在同一个类中创建其他方法。这个类已经包含了很多代码。如何在具有可读类的同时降低复杂性? 我考虑过创建另一个类并在那里使用所有新方法。
代码
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;
}
答案 0 :(得分:1)
这个类已经包含了很多代码。 ... 我想创建另一个类和 拥有所有新方法。
这正是你应该做的。
答案 1 :(得分:1)
可读代码之路在遗留代码中非常粗糙。
首先,你应该有完全覆盖你正在重构的代码的测试,否则你最终会在暴风雪中穿越那条崎岖不平的道路 - 它可能但不是很有趣而且非常危险。
一旦你在那里覆盖了你的屁股,你就可以开始重构了。总的来说,大多数早期的重构(假设有很多类似于上面的方法)将是 Extract Method 。从那里开始,一些阶级行为应该开始变得明显,然后你可以将它们提取出来。
我考虑过创建另一个类并在那里使用所有新方法。
这类似于通过推动床下的所有东西来打扫房间。房间很干净,但你只是隐藏了一塌糊涂。不要没有任何想法,否则你最终会得到一个比你现在更糟糕的Utility
课程。
从OOP的角度来看,通常需要努力实现SOLID解决方案。从传统角度关注的关键原则是您的课程的单一责任。如果你有这个,那么O-L-I-D往往会落到实处(根据我的经验,虽然我的棕色地带开发经验比我真正喜欢的更多)。
答案 2 :(得分: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
}