Bad Coding Academy:Newlines、Spaces、およびIndentation

こんにちは、Habr!著者による記事「ダークコードスタイルアカデミー:改行、間隔、およびインデント」の翻訳をあなたの注意を引くために提示しますzhikin2207



画像



やあみなさん!悪いコードアカデミーを続けさせてください。この投稿では、コードの読み取りを遅くする別の方法を明らかにします。次のトリックは、コードの理解を減らし、バグの可能性を高めるのに役立ちます。準備はいいですか?はじめましょう。



改行、スペース、およびインデントは殺すことができます。



人々はどのように本を読むのですか?上から下、左から右(少なくともほとんど)。開発者がコードを読んだときにも同じことが起こります。1行のコードには1つの考えが含まれている必要があるため、各行には1つのコマンドのみが含まれている必要があります。他の開発者を当惑させたい場合は、これらのガイドラインに違反したほうがよいでしょう。そして、その方法をお見せしましょう。



例1



このコードを見てください。1行に1つのアイデア。コードはとてもきれいなので、私は気分が悪くなります。



return elements
    .Where(element => !element.Disabled)
    .OrderBy(element => element.UpdatedAt)
    .GroupBy(element => element.Type)
    .Select(@group => @group.First());


すべてのステートメントを1行にまとめることはできますが、それは簡単すぎます。この場合、開発者の頭脳はここで何かが間違っていることを理解し、演算子を左から右に分割します。簡単ピーシー!



いくつかのステートメントを同じ行に保持し、いくつかを分割するのが最善です。最良のオプションは、開発者が一部の演算子に気付かない場合であり、誤解を招き、最終的にはエラーになります。もう1つのオプションは、「これは一体何だ!?」と叫ぶまで、このコードの理解をゆっくりと減らすことです。



return elements.Where(e => !e.Disabled)
    .OrderBy(e => e.UpdatedAt).GroupBy(e => e.Type)
    .Select(g => g.First());


お気に召しましたか?要素変数の名前を変更する必要がある場合、他の開発者が数十年にわたってコードをフォーマットするように、いくつかのインデントを追加できます。



return elements.Where(e => !e.Disabled)
               .OrderBy(e => e.UpdatedAt).GroupBy(e => e.Type)
               .Select(g => g.First());


このアプローチがチームによってコードレビューされた場合は、ポストカードを送ってください。



ヒント:1行にいくつかのステートメントを残し、別々の行にいくつかのステートメントを残します。



例2



ここでもまったく同じ考えです。これはあなたがはるかに頻繁に見る唯一のコードです。



var result = 
    (condition1 && condition2) || 
    condition3 || 
    (condition4 && condition5);


手順は同じです。読者をできるだけ混乱させるために行を分けてください。最良の結果を得るには、ニューラインで少し遊んでください。



var result = (condition1 && condition2) || condition3 || 
    (condition4 && condition5);


そして、コードが正常に見えるようにインデントを追加します。



var result = (condition1 && condition2) || condition3 || 
             (condition4 && condition5);


コードの判読不能性とスタイルの信憑性のバランスをとる必要があることを忘れないでください。



ヒント:最良の結果を得るには、ニューラインで遊んでください。



例3



これはどうですか?



if (isValid) 
{ 
    _unitOfWork.Save();
    return true; 
} 
else 
{ 
    return false; 
} 


同じ問題ですが、反対側です。ここでの最良のオプションは、もちろん、中括弧を配置することによって、演算子を1行に結合することです。



if (isValid) { _unitOfWork.Save(); return true; } else { return false; } 


このアプローチは、thenおよびそれ以外のブロックにステートメントがほとんどない場合にのみ機能します。そうしないと、コードのレビュー段階でコードが拒否される可能性があります。



ヒント:小さなif / for / foreachステートメントを1行にまとめます。



例#4



1行あたり80文字が、現在推奨されている標準です。これにより、開発者がコードを読むときに集中力を保つことができます。さらに、必要に応じて同じ画面で2つのドキュメントを同時に開くことができるため、ソリューションエクスプローラーを使用する余地があります。



bool IsProductValid(
    ComplexProduct complexProduct, 
    bool hasAllRequiredElements, 
    ValidationSettings validationSettings)
{
    // code
}


コードの読み取りを遅くする最も簡単な方法は、他の開発者にコードを水平方向にスクロールさせることです。80文字のルールは無視してください。



bool IsProductValid(ComplexProduct complexProduct, bool hasAllRequiredElements, ValidationSettings validationSettings)
{
    // code
}


とても簡単です。スクロールを開始する前に何が起こったかを忘れるか、開始した行をスキップしてください。素晴らしいトリック。



ヒント:意図的に、80文字のルールは無視してください。



例5



適切な場所の空白行は、コードをグループ化して読み取りを高速化するための強力なツールです。



ValidateAndThrow(product);

product.UpdatedBy = _currentUser;
product.UpdatedAt = DateTime.UtcNow;
product.DisplayStatus = DisplayStatus.New;

_unitOfWork.Products.Add(product);
_unitOfWork.Save();

return product.Key;


間違った場所にある空白行を、この記事の他のヒントと組み合わせると、作業を節約できます。どの空白行が好きですか?



ValidateAndThrow(product);
product.UpdatedBy = _currentUser;
product.UpdatedAt = DateTime.UtcNow;

product.DisplayStatus = DisplayStatus.New;
_unitOfWork.Products.Add(product);

_unitOfWork.Save();
return product.Key;


ヒント:空白行をランダムに挿入します。



例#6



リポジトリにコミットするとき、コミットしようとしているものを正確に確認する小さな機会があります。やめてください!ここのように空白行を追加しても問題ありません。



private Product Get(string key) 
{
    // code
}

private void Save(Product product) 
{
    // code
}


または、さらに良いことに、空白行にいくつかのスペースを追加しました(違いを理解するには、5行目を強調表示します)。



private Product Get(string key) 
{
    // code
}
    
private void Save(Product product) 
{
    // code
}


なぜこれが必要なのですか?コードは引き続き機能します(ただし、確実ではありません)。あなたはあなたのコードを理解し続けますが、他の開発者はあなたのコードをあまり理解しません。一般的なメソッドに一度にいくつかの空白を追加することはできませんが(コードレビューは私たちの敵です)、この方法を使用すると、数週間の活発な開発の後に混乱が生じます。



文字列に余分なスペースを使用することのもう1つの追加の利点は、他の開発者が関連機能をコミットするときに、IDEがフォーマットを自動的に修正できることです。コードレビューでは、1000本の赤と緑の線が表示されます。私の言いたいことを知っているなら;)



同じ理由で、プロジェクトでスペースを使用する場合はIDEにタブを設定でき、その逆も可能です。



ヒント:コミットする前にコードを見ないでください。



例7



コードに余分なスペースが表示される可能性のある開発者をバイパスします。彼らはあなたのキャリアにとって危険です。



product.Name = model.Name;
product.Price = model.Price;
product.Count =  model.Count;


ヒント:敵を知ってください。



コードをサポートしないようにするのは大変な作業です。あなたが多くの小さな問題を蓄積するとき、それらはあなたの参加なしに成長します。若い開発者は、テンプレートに従ってコードを記述します。コードレビュー中のある日、「一体何だ?」と聞こえます。チームリーダーから、キャッチフレーズを使用できるようになります。私たちは常にこれを行います」と、同じ方法で記述されたコード内の1000の場所を彼に示します。



楽しんで。



All Articles