27

特に長い引数リストに関しては、コード行をラップするのにどのような方法をお勧めしますか?

行の折り返しに関するいくつかの質問があります (コードを書くときにテキストを折り返すかどうか?行幅の書式設定の標準など)、コード行を折り返す場所をカバーするものを見つけることができませんでした。

次の例のように進行し続けるコード行があるとします。

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2, Argument3, Argument4);

それはどのように包まれるべきですか?

私が考えることができるいくつかの方法と、それらの欠点のいくつかを次に示します。

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2,
    Argument3, Argument4);

特に新しい行の孤立した引数のすぐ上に割り当て等号 ("=") があるため、呼び出しようとしているメソッドから引数リストを視覚的に分離しているように見えるため、個人的にはそのオプションは好みません。

そのため、しばらくの間、次のアプローチを採用しました。

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1,
                                                       Argument2,
                                                       Argument3,
                                                       Argument4);

ここでは、すべての引数がまとめられており、すべてメソッドの最初の引数の側にあります。ただし、タブがインデントするスペースの数が原因で、引数リストが常に 2 行目以降に整列するとは限らないという問題があります。(また、書式設定のために余分なスペースを入力すると、時間がかかりすぎます。)

前の質問の 1 つの回答では、次の形式が提案されました。

int SomeReturnValue = SomeMethodWithLotsOfArguments(
    Argument1,
    Argument2,
    Argument3,
    Argument4
);

私はこの形式が視覚的に魅力的であるため、実際に気に入っていますが、リストが属するメソッドから引数を視覚的に分離しています。また、1 つのメソッド呼び出しが多くの行を占有しないようにすることも好みます。

それで、私の質問は、そもそも行のコードが長くなりすぎるのを防ぐという問題に立ち入ることなく、コード行をどのようにラップすることをお勧めしますか? 具体的には、引数リストが長い場合、コード行を分割するのに適した場所はどこですか?

4

14 に答える 14

16
int SomeReturnValue = SomeMethodWithLotsOfArguments
(   Argument1,
    Argument2,
    Argument3,
    Argument4
);
于 2008-11-12T10:47:51.410 に答える
12

提案されたオプション 3

int SomeReturnValue = SomeMethodWithLotsOfArguments(
    Argument1,
    Argument2,
    Argument3,
    Argument4
);

それは良い感じを与えるので、より良い方法です。引数の長さがほぼ同じである場合は、それらをまとめて、たとえばテーブルとして並べることができます

int SomeReturnValue = SomeMethodWithLotsOfArguments(
    Argument1,    Argument2,    Argument3,    Argument4,
    Argument005,  Argument006,  Argument7,    Argument8
);
于 2008-11-12T10:13:02.137 に答える
7

私はこの方法を好みます:

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2, 
                        Argument3, Argument4);

行が現在の最大行幅 (それが何であれ) に最も近い場所で終了し、次の行が等号に対して通常のインデント レベル (それが何であれ) にインデントされます。

理由はわかりませんが、ほとんどの状況で最も読みやすいオプションだと思います。ただし、私はこれらのことについて衒学的ではないことを選択し、コードの特定のセクションに対して最も読みやすいものを常に好みます。たとえそれがインデントまたはフォーマットのルールに違反する可能性があるとしても(もちろん制限内で)。

この一例は、関数が多くの引数または複雑な引数を必要とする場合、代わりに次のようなものを選択する可能性があります。

int SomeReturnValue = SomeMethodWithLotsOfArguments(
                        Argument1 + Expression1 + Expression2, 
                        Argument2 - Expression3 * Expression4, 
                        Argument3, 
                        Argument4 * Expression5 + Expression6 - Expression7);

もちろん、引数の式が非常に長い場合や複雑な場合は、関数呼び出しの前に計算を行い、一時的な値を使用して結果を保存する方がよいでしょう。

于 2008-11-12T12:37:54.077 に答える
6

線を短くするようにしています。この場合、代入の前と各パラメーターの後で中断します。また、新しい引数を簡単に追加できるように、行の先頭にカンマを付けました。

int SomeReturnValue 
   = SomeMethodWithLotsOfArguments(
         Argument1
       , Argument2
       , Argument3
       , Argument4
    );

この種のレイアウトを使用することは、Visual Studio では大変な作業ですが、Emacs を使用すると自動化されます。

于 2008-11-12T13:06:13.363 に答える
2

個人的には、アスキー アートに近すぎる 2 番目のオプションが嫌いです。コードが不便です。関数の名前を変更すると、すべての引数を再度インデントする必要があります。そして、どういうわけか、ファイルが肥大化します。さらに、コードでハード タブを使用するとうまく機能しません。

ほとんどの場合、最初のオプションを使用しますが、継続行には 2 つのインデントを使用するという Eclipse の規則を採用しました。通常のインデントよりも目立つからです (特に条件付き命令を分割する場合)。

時々、2 番目のオプションを使用します。開き括弧がすでに行の長さの制限に近づいている場合...
利点: 各パラメーターの後に行コメントを追加できます。
または、Dheer が好きで、行幅いっぱいになるまで引数をグループ化します。

引数が関数名から分離されているという事実は、私を悩ませたことはありません.それらはまだ近くにあり、かなりグループ化されています. 最悪の場合、関数呼び出しの前後に空白行を入れることができます。

于 2008-11-12T10:48:18.087 に答える
1

ほとんどの人がインデントについて優れた提案をしており、これは制御できない API 関数に最適です。API を制御する場合は、3 つ以上の引数を取得したら、何らかの形式の構造を作成し、その構造をルーチンに渡すことをお勧めします。3 つ以上の引数を取得すると、それらを間違った順序で渡す可能性が非常に高くなります。また、パラメーターの型と意味がより明確になります。

someStruct.x = somevalue;
somestruct.y = someothervalue;

int someResturnValue - SomeMethod(somestruct);
于 2008-11-12T13:40:42.297 に答える
1

warning: I use IDEs. If you're not an IDE user, just skip this.

When working with others:

I tend to stick with whatever convention is currently adopted by the team. Even better if the team uses an IDE with code format support. Always stick w/ the team/IDE format conventions. Can't tell you how many times I've been burned by "version-contro-diff-hell-due-to-reformats"

When working alone:

I string the method on, line length isn't a problem for me. I've got a nice widescreen monitor and horizontal scrollbars were invented for a reason. On top of that, navigating source code is much more than visually scrolling now that many IDEs have utilities like call trees, find references, and refactoring tools.

于 2008-11-12T12:29:00.333 に答える
1

右側が壊れていない場合は、割り当ての前に常にブレークします。これは、割り当てられた値の型を明示的に宣言する必要がある Java などの言語で役立ちます。

SomeVeryVerboseTypeName SomeReturnValue
   = SomeMethodWithLotsOfArguments(Argument1, Argument2, ...);
于 2008-11-12T11:19:47.867 に答える
1

初め

引数が十分に短く、(ほぼ) 同様の長さである場合、以下の視覚的には十分だと思います

int variable_with_really_long_name = functionWhichDoMore(Argument1, ArgumentA2, 
                                                         ArgumentA3, Argument4, 
                                                         ArgumentA5, Argument6);

2番

悪化すると、1 つの引数の列が本当に役立ちます

int variable_with_really_long_name = somefunctionWhichDoMore(Argument_Expand1, 
                                                             Argument2, 
                                                             Argument_Expand3, 
                                                             Argument_Expand4, 
                                                             Argument_Expand5, 
                                                             Argument6);

三番

でも、今、悪化したらどうしよう!今何?これを試してみてください

int variable_with_really_long_name = someFunctionWhichDoMore
                                     (
                                       Argument_Expand_More1, 
                                       Argument_Expand_More2, 
                                       Argument_Expand3, Argument4, 
                                       Argument_Expand_More5, Argument6
                                     );

ちなみに、見た目を統一したい場合は、上記のすべての条件で3番目を使用してください。

Justify : きちんと配置すると、(6) 個の引数を持つ関数呼び出しであることがわかります。そして、コードがすっきりと見えるのが好き!(so_ugly)です。

批評家は大歓迎です。コメントしてください。

于 2014-07-25T11:25:53.333 に答える
1

私にとっては、引数リストの長さに依存します。私は行末レイアウトがあまり好きではなく、それをうまく行うにはエディターのサポート (例えば emacs) がほとんど必要です。

メソッド呼び出しが 1 行で済むほど短い場合は、次のようにします。

int SomeReturnValue =
    SomeMethodWithLotsOfArguments(Argument1, Argument2, ...);

メソッドと変数が 1 行に収まり、引数が別の行に収まる場合、私はこれを行いました。

int SomeReturnValue = SomeMethodWithLotsOfArguments
    (Argument1, Argument2, ... );

それは私の LISPy の心を笑顔にしますが、私の同僚を怒らせるので、私は容赦しませんでした:

int SomeReturnValue = SomeMethodWithLotsOfArguments(
    Argument1, Argument2, ... );

私は、私が本当に満足している解決策を見つけられなかったと言いたいだけだと思います.

int SomeReturnValue = SomeMethodWithLotsOfArguments(
    Argument1, 
    Argument2,
);
于 2008-11-12T11:32:12.150 に答える
1

これについては、私にとって決定的な答えはありません。ケースバイケースでやってます。関数名が長い場合、他の引数を前の引数と同じ列にインデントしません。関数名が短い場合、通常、次の引数を同じ列にインデントし、できるだけ多くの引数を 1 行に集めます (1 つの引数 = 1 行ではありません)。しかし、いくつかの心地よい対称性があれば、

int a = foo(a + b,
            c + d);

私はおそらくその規則を破り、各行に同じ数の引数を持ちます。

于 2008-11-12T12:50:51.147 に答える
0

私は次のほうが好きです

int variable_with_really_long_name = functionWhichDoMore(
        Argument1, ArgumentA2, ArgumentA3, Argument4, 
        ArgumentA5, Argument6);

int i = foo(Argument1, ArgumentA2, ArgumentA3, Argument4, 
        ArgumentA5, Argument6);

どちらも一貫性があり、80 文字に達すると、次の行に移動し、それぞれ 4 つのスペースの 2 つのインデントを配置します。これに対する私の主張は次のとおりです。

  • インデントされたコード ブロックではなく、折り返された行に関係しているという事実を明確に視覚化するために、それぞれ 4 つのスペースの 2 つのインデントを使用します。

  • このインデント方法では、常に同じインデント パターン (行の折り返しに 2 つのインデント、コード ブロックに 1 つのインデント) に従うため、コードが適切にインデントされたままになります。

  • すべての引数を別々の行に配置すると、メソッドが非常に大きくなる可能性があるため、1 つまたは複数の行で引数を順番に配置することをお勧めします。

  • この行折り​​返しの方法は、Eclipse などの IDE で構成でき、自動フォーマット機能を提供します。

ただし、重要な注意事項が 1 つあります。次のような例外的なケースが発生する可能性があります。

int variable_with_really_long_name = functionWhichDoMore(arg1,
        arg2)

私はこれを回避しようとします。もし起こったら、私は次のことをします

int variable_with_really_long_name = functionWhichDoMore(arg1, arg2)

はい、最大 120 文字を超えます。コード行の長さの規則、私の規則は実際にはこれに柔軟に対応しています。最大 120 から 140 文字、通常は 120 文字で折り返しますが、この場合は最大にします。140文字。これの欠点はもちろん、Eclipse などの IDE で自動フォーマット用に構成できないことです。

ps。コード行の長さとしては 120 文字は多すぎると考える人もいますが、それはまったく別の議論です。もちろん、上記の規則は 80 / 100 文字にも適用できます。

于 2014-08-14T16:40:49.757 に答える
0

また、Edward Kmett が引用した「一貫性のあるインデント オプション」も使用します。多くの議論がある場合、可能であれば関連性によってそれらをグループ化する傾向があります.

しかし、この特定の例では、おそらく 1 行にしておくでしょう。それほど長くはありません。

「ぶら下がっているラップ」形式は、(はるかに重要な) インデントと競合する視覚的な混乱を簡単に引き起こす可能性があるため、我慢できません。現時点では、ダングリング ラップは多くの言語で「デフォルト」のスタイルと見なされていますが、どのようにしてそのようになったのかはわかりません。それは私見恐ろしいです。

于 2008-11-12T11:24:29.263 に答える
0

長いパラメーター リストを持つ関数では、読みやすくするために 1 つまたは 2 つのパラメーターごとに折り返します (各行のパラメーターの数は常に同じにします)。

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1,
                                                       Argument2,
                                                       Argument3,
                                                       Argument4);

また

int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2,
                                                       Argument3, Argument4);

リスト/パラメータの長さによって異なります。

于 2008-11-12T10:15:31.837 に答える