web-dev-qa-db-ja.com

多くのメソッドへのリファクタリング-これはクリーンと見なされますか?

そのため、プログラマーとして経験が浅い(プロジェクトで自分のデバイスにインターンを任せている)誰かから継承したプロジェクトについて同僚が文句を言っているのを見ました。

ある時点で、コードが70〜80行という方法で、コードが7〜8行(合計で14〜16行)重複していた。私たちはコードについて話し合っており、彼はこれをリファクタリングして、構造を少し変更するだけで重複を取り除く方法を見つけました。

私は素晴らしいと言ったので、コードを別のメソッドに移動して、大きなメソッドをもう少し読みやすくする必要があります。

彼は「いいえ、コードを7〜8行だけで作成することは決してないだろう」と述べた。

パフォーマンスの問題はさておき、これについてyour入力とは何ですか?その特定のコードがおそらく他のどこでも使用されない場合、より多くのメソッド(c#では約3行でコードを埋め込む)またはより大きなメソッドを使用することに傾いていますか?したがって、それは純粋に可読性の問題であり、コードの再利用の問題ではありません。

乾杯:)

46
Max

メソッドのLoCは完全に無意味な尺度です。重要なことは、懸念の分離とコードの重複です。

メソッドは1つのことだけを行う必要があり、その1つのことはその名前で表現する必要があります。他のことは他の方法に任せるべきです。

コードの重複から生じる問題は、過大評価することはできません(つまり、常に考えているよりも大きな問題です)。そしてそれだけでも、1行のコードでメソッドを正当化します。

一方、ビッグデータオブジェクトの詳細をビッグフォームに入力するメソッドでは、50行以上のコードを簡単に作成できますが、条件ステートメントは1つもありません。機能要件(またはコードの重複)がない場合、なぜそれをより小さな部分に分解したいのですか?

84
wolfgangsz

短いメソッドは非常に読みやすくなります- それらを理解するために覚えておくべき事柄が少ない 。クリーンなコードの最も声高な支持者は、おそらくほとんどすべてのメソッドはshorter8行より。そして、このトピックに関心のあるほとんどすべての開発者は、メソッド内の70〜80行のコードは多すぎるため、分割する必要があることに同意します。

25

それはすべて懸念の分離に関するものです。メソッドは、1つの質問に答えるか、1つの決定を行う必要があります。そして、それだけです。したがって、100行のコードのメソッドがあるということは、これらのメソッドがやりすぎであることを意味します。 7-8 LoCメソッドは非常に優れています。もう1つの質問は、これらのメソッドをどこに配置するかです。単一のクラスに20の短いメソッドがあることは、おそらく懸念されるトピックです。それらが30個あるのは、抽象化で何かが間違っていることを理解するのに十分な理由だと思います。すべてをできるだけ短く、シンプルにしてください。

8
Andrey Agibalov

7-8のLOCは少しlongメソッドであると言う考え方があります。私はそれを購読しませんが、私は先に行くと言います-画面よりも小さいものは私にとっては良いです。

6
mcottle

メソッドは必要のように単純である必要がありますが、単純ではありません。

5
Andrew Lewis

LoCは価値のある指標ではありません。代わりに、メソッドの実行量に注目してください。通常、メソッドは1つのことを行う必要があります。私見、1つまたは2つの非常に単純な操作に取り組むことは時々良いです。たとえば、長方形の周囲を計算します。

かもしれない:

public int GetPerimeter(int side1, int side2)
{
    totalWidthLength = side1 * 2;
    totalHeightLength = side2 * 2;
    return totalWidthLength + totalHeightLength;
}

-または-

public int GetPerimeter(int side1, int side2)
{
    return DoubleSide(side1) + DoubleSide(side2);
}

private int DoubleSide(int side)
{
    return side * 2;
}

個人的には、技術的には複数の操作を実行しますが、私は最初の方法を好みます。同時に、読みやすく、理解しやすいコードの多くの行を持つメソッドを持つこともできます。

public void UpdateCustomer()
{
    customer Customer = new Customer();

    customer.Name = textboxName.Text;
    customer.AddrLine1= textboxName.Text;
    customer.AddrLine2 = textboxName.Text;
    customer.OfficialName = textboxName.Text;
    customer.Age = textboxName.Text;
    customer.BirthDay = textboxName.Text;
    customer.NickName = textboxName.Text;
    customer.LastLocation = textboxName.Text;
    customer.... = textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer.... = textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer.... = textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;
    customer....= textboxName.Text;

    db.InsertOnCommit(customer)
    db.SubmitChanges();
}

上記の例は約50行ですが、200行になることもあり、違いはありません。顧客オブジェクトの各プロパティ割り当ては、実質的に複雑さを追加しないので、50行メソッドは、平均4行メソッドと同じ複雑度レベルのままです。実際、私はそれが基本的に以下の方法と同じ読みやすさを持っていると言うまで行きます:

public void UpdateCustomer()
{
    customer Customer = new Customer();

    customer.Name = textboxName.Text;

    db.InsertOnCommit(customer)
    db.SubmitChanges();
}

50行の方法は、リフレクションと正規表現を使用して10行未満で達成でき、Customerの各プロパティを繰り返し、名前に一致するLIKE値を持つテキストボックスを検索します。明らかに、これはあまりにも賢く、奇抜なハックを利用して美的理想を実現するコードの例です。 最終的に、LoCは非常に信頼性の低い複雑さ/読みやすさの指標であることです。誰もがこれを知っています(私のCRUDの例は決して珍しいことではありません)。生産性については、コード品質を測定することになっているメソッドごとのLoCルールについて常に耳にします。それは本当に両方の方法ではあり得ません。

5