単一行のステートメントとグッドプラクティス


11

私は最近、多くの人が眉をひそめるかもしれないと知っている習慣を身につけましたが、最終的には、単一の(時には)反復的な方法の構造ではなく、グローバルなコード構造に目を向けるのに役立ちます:次のような1行のステートメント

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

とは対照的に

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

コードの全体的な「美しさ」を維持し、プログラム構造を簡単に追跡できるようにするために、繰り返し行うタスクでそれを使用しますが、それは良い習慣ではないことを認めます。私は実際にそれを頻繁に使用するので、これについてあなたの考えを知りたいと思います。また、私のコードを保守しなければならない人は誰でもこのアプローチに問題があると思いますか?



1
維持しようとすると問題が発生します。最初に行うことは、 ";"に対してCTRL + Fを実行することです そして改行を入れます。しかし、それは私だけです:-)。たとえば、いくつかのテキストボックスの有効なプロパティを既定値のfalseで初期化する場合は、1行だけが好きです。textBox1.Enabled= textBox2.Enabled = false;
アルン

2
コーディングスタイルの質問をしている場合は、言語を指定すると役立ちます。
カレブ

3
与えられた例では発生しないかもしれませんが、すべてを1行に配置する場合、2番目または3番目または...ステートメントにブレークポイントをどのように配置しますか?
マルジャンヴェネマ

1
また、私は自動化されたフォーマット(Java)に慣れています。コードはとにかく統一された外観になります。
クウェブル

回答:


22

あなたにとっても、コードを読む他の人にとっても、読みやすさは大きく損なわれると私は本当に思っています。それはあなたの心の中に積極的にあるので、それを最初に書くとき、それはすべて理にかなっています。コードをスキャンして変数や関数がどこにあるかを確認するときは異なります...自分のコードをスキャンするあなた自身の能力を破壊しています。それには、何も巨大でなく、悪いを超えて他の誰場合は、これまで、あなたのコードを読む必要があります。

また、コードの読み方についても考えてください。常に上から下にスクロールします。あなたのメソッドはこれに適合せず、コード読み取りで最もuい問題の1つをもたらします。水平スクロール。それがコードを読むのをどれだけ難しくするかを過小評価しないでください。水平方向にスクロールすることも、人々を水平方向にスクロールさせることもありません。ほとんどどんな状況でも、それは非常に不自然です。

また、問題がコード入力の繰り返しである場合は、Ctrl-Cを忘れないでください。あなたのサンプルコードから、すべてを手動で入力する方が効率的かもしれませんが、たくさんの行を何度もコピーする必要がある場合、1行目と新しい行をコピーするのと同じくらい効率的であるように思えますx回、変更を加えますが、タイプミスをする可能性は低くなります。

ああ、タイプミス!そのようなコードの可読性を損なうと、50個の変数宣言のどれを間違って設定したかを見つけるのが悪夢になります。現在、ほとんどのコンパイラーは行番号と列番号でエラーを出しますが、行でエラーを見つけることは列を見つけるよりもはるかに簡単です。


2
a)コードの読み取り/スキャン-ほとんどの人は、コードをスキャンするときに、行の最初の数文字を読み取り、それが「おもしろい」場合を除いて先に進み、さらに数回読み取ります。コンパイラエラー:ほとんどの場合、コンパイラエラーを「<x>行の問題」と解釈します。すぐに解決できる場合(まれ)にのみ、実際にエラーを読み取ります。
-mattnz

19

また、1行に1つのステートメントを使用することで、サイドバイサイドdiffで何が変更されたかを簡単に確認できます。


2
これがおそらく最大の理由です。誰かがそのコードをマージする必要がある場合、ほとんどすべてのマージツールにより、行のサブストリングではなく、行の分離と移動が簡単になります。
アノン

@anonマージツールについても良い点です。1行に1つのステートメントがあると、クリーンアップするマージの競合が少なくなります。
ヒューゴ

10

この例ではこれを示していませんが、1行で複数のステートメントをグループ化することには別の問題があります。1行にある5つのステートメントの1つが例外をスローした場合はどうなりますか?

スタックトレースには「EBlah at line N」と表示されますが、これらの5つのステートメントのどれが例外をスローしたかわかりません。

(同じことが、どんな種類の過度に長いステートメントでも起こります。)


2
同じ概念がデバッグにも適用されます。ここでも、粒度は通常、行番号です。
デビッドハンメン

2
ああ、これは問題になる可能性があります。「お気に入り」とは、foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(Java / C#構文)のようなものでヌルポインターがゆるんでいる場合です。そのような混乱を整理するには、余分な行(および一時変数…、元の開発者向けの2D6 Brick Of Clue)を使用することをお勧めします。
ドナルドフェローズ

7

1行につき1ステートメントは、広く使用されているコーディングスタイルです。結果として、将来あなたのコードを見る開発者のほとんどは、1行に複数のステートメントが表示された場合に勝つでしょう。ある方法で何かを見ることに慣れている場合、別の方法でそれを見るのは混乱を招く可能性があります。

このため、まれな状況を除き、これに反対することをお勧めします。


4

私はこれを25年前に、低いクロック速度で動作する小さなマイクロでインタープリター言語を使用してこれを行いました。

私は今、それを考えてひるむ(それは正当な理由で行われたが)。

残念ながら、このようなコードは読みにくく、したがって維持するのが困難です。


1
したがって、適切に記述してから、「マシンコピー」の空白やその他の準備を取り除きます。最近のJavaScriptの縮小と同じです。
CaffGeek

1
ええ-私もそのようなソースコードを再処理するためのプログラムを書きました-1986年に。
すぐに

1

構文的には、実際に問題はありません。チームのコーディングスタイルに大きく依存します。

私が見たほとんどのコード(標準のc ++ヘッダー内のコードを含む)はこのようにして行われるため、最初の方法を使用します。

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

0

これは本当に珍しいコーディングスタイルです。

代わりに、空行を使用してコードの論理部分を区切ることをお勧めします。


0

右に行きすぎると、複数の行と同じくらい多くの問題が発生する可能性があります。

何十ものフィールドを持ついくつかのsqlステートメントを処理する必要がありました。通常、行ごとに1つを配置しますが、いくつかの機会に、3または4を行に統合しました。これは、開発中に数回上下にスクロールしなければならないときの良いアイデアのようです。

このコードに戻って後悔しています。余分な行があっても、それほど多くの問題が発生するわけではないので、通常はクリーンアップします。


0

また、私のコードを保守しなければならない人は誰でもこのアプローチに問題があると思いますか?

1分間手をかざした後、お気に入りのIDE Regex機能を使用して、読み取り不能なコードをすべて1行に1つのステートメントに自動的に分離します。

2番目のアプローチがどれほど読みやすいかを理解するには、示した例を簡単に確認するだけで十分です。

目を永久に水平方向に動かすことなく、垂直方向のページフローを簡単に追跡できます。

あなたの例を見てください:コードはすべてText異なるtextBoxオブジェクトのプロパティに関するものであり、値として文字列が含まれていることがすぐにわかります。とても簡単です。


0

私は個人的にそのようなスタイルを使用しません。要約する

長所

  • スクロールするコード行が少ない
  • コードを意味的にグループ化して、「多くの割り当てもの」を表現するために使用できます。しかし、煩わしい場合は、いつでもそのようなブロックを関数にリファクタリングできます。

短所

  • 読みにくく、一般的にコードを水平方向に読みやすくなります(スキミング、目の動きがない、...)
  • diffはマージを含め、悪夢になりやすい
  • 変更がより難しい(コピー&貼り付け、コメントアウト、...)
  • 多くのIDEでは、個々の式ではなく行で動作するため、デバッグが問題になる場合があります。

一部の「短所」は、時には長所かもしれません。たとえば、コードの一部にの形式の8つの連続した操作があるとしif (x > maxX) {x=maxX; peggedAny = true;}ます。そのような各操作が1行に簡単に収まる場合は、ステートメントを分割する数十行よりも、そのような8行が必要です。そのような比較が十分な場所で使用された場合、フォームの4つのステートメントのpeggedAny |= pegValueMinMax(ref x, minX, maxX);方が優れている可能性がありますが、読んでいる人はpegValueMinMaxそれが何をするかを読む必要があります。
supercat 14

さらに、行の一部が変更された場合、「差分」はそれを行全体の変更と見なします。行がユニットとして機能的に動作する必要がある場合、それは良いことです。そうでない場合、セマンティック操作が複数の行に分割されている場合、一部の行を変更すると操作に影響が及ぶ可能性がありますが、これは明らかではありません。
supercat 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.