如何降低if语句的复杂性?

时间:2012-11-13 18:51:10

标签: c# complexity-theory

我搜索了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;
        }

3 个答案:

答案 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 
}