-2

私は答えを得るためにグーグルと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;
        }
4

3 に答える 3

1

このクラスにはすでに多くのコードが含まれています。...別のクラスを作成し、そこにすべての新しいメソッドを含めることを考えました。

それはまさにあなたがすべきことです。

于 2012-11-13T18:56:00.000 に答える
1

読み取り可能なコードへの道は、レガシーコードから非常に荒いです。

まず、リファクタリングするコードを完全にカバーするテストを行う必要があります。そうしないと、目がくらむような吹雪の中、その荒れた道を横断することになります。それは可能ですが、楽しくはなく、非常に危険です。

そこでお尻を覆ったら、リファクタリングを開始できます。概して、初期のリファクタリングのほとんど(上記のものと同様のメソッドが多数あると想定)は、Extractメソッドになります。そこから、いくつかのクラスの振る舞いが明らかになり始め、それらを抽出することができます。

別のクラスを作成して、そこにすべての新しいメソッドを含めることを考えました。

これは、ベッドの下にすべてを押して部屋を掃除するのに似ています。部屋はきれいですが、あなたは混乱を隠しただけです。何も考えずにやらないでください。そうしないと、Utility現在のクラスよりもさらに悪いクラスになってしまいます。

OOPの観点からは、一般的に固溶体に向けた取り組みが望まれます従来の観点から焦点を当てるべき重要な信条は、クラスの単一責任です。あなたがそれを持っているなら、OLIDはちょうどその場に落ちる傾向があります(私の経験から、私は本当に望むよりもはるかに多くのブラウンフィールド開発経験を持っていますが)。

于 2012-11-13T19:27:12.063 に答える
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 
}
于 2012-11-13T19:25:25.390 に答える