TL;DR: 要約
- 認知的複雑性は、コードの理解の難しさを測るコード品質の指標であり、サイクロマティック複雑性を超えて、人間が追うのが難しい制御フロー構造を考慮します。
- 認知的複雑性が高いと、バグのリスクが増し、新しい開発者のオンボーディングが遅れ、将来の変更が高コストになるため、メンテナンス性の負債の実用的な指標となります。
- この記事では、認知的複雑性を減らすための5つの実用的なコード品質のテクニックを紹介しています。例えば、ヘルパー関数の抽出、ネストされた条件の簡素化、複雑なロジックをより表現力豊かなパターンに置き換えることなどです。
- SonarQubeはコードベース全体で認知的複雑性を測定し、追跡し、最も問題のある領域を強調表示することで、開発者が最大のメンテナンス性の影響を与えるリファクタリングの優先順位を決定できるようにします。
はじめに
他人の(あるいは自分の)古いコードを理解しようとする感覚に非常に馴染みがあるかもしれません。6ヶ月前には確かに理解できたのに、今では「マジックアイ」のように見えてしまいます。今日のコードの理解の難しさに注目すれば、明日はずっと楽になります。認知的複雑性は、Sonarがまさにそれを助けるための指標です!このブログでは、認知的複雑性がどのように計算され、それがどのようにして素晴らしいコードを書くのに役立つかを探ります!
ヒント #1: チームが喜ぶコードを書く
チームと協力する際には、開発の後であなたが書いたコードがどれだけ読みやすいかを考慮することが非常に重要です。サイクロマティック複雑性は、モジュールの制御フローのテストと保守のしやすさを測る方法として最初に導入されました。それはテストのしやすさを評価するのにはかなり良いですが、保守性を測る際にはその数学的モデルが不十分です。このビデオでは、いくつかの例を観察します:
ヒント #2: 人生は常に全速力ではない
線形コードはあなたの友人です。すべてのコードがただ一連のコマンドとして順番にリストされているだけで、ループや複雑な処理がなければ、それを頭に入れておくのはかなり簡単でしょう。ループを追加したり、コードを分岐させる決定をすると、理解がますます難しくなります。このため、コードの認知的複雑性スコアは、そうするたびに1増加します。このビデオでは、分岐やループが導入されたときにスコアがどのように加算されるかを見ます。Sonarは、コードのどこに複雑さがあるかを確認し、リファクタリングの機会を探すのに役立ちます。
ヒント #3: ネストすることで問題が急速に悪化する
ネストされたコードは理解が難しく、ネストされたコード内でさらに多くのことを行うと、すべてを頭に入れておくのに必要な労力が増します。このビデオでは、他のループや分岐内でループや分岐を行うことが、認知的複雑性スコアにどのように大きな影響を与えるかを見ます。
ヒント #4: 有用なものは複雑性を増さない
コードを明確にするために設計された構造がいくつかあります。認知的複雑性のスコアリングはこれらの構造が良いことを理解するのに十分賢いので、それらを使用しても複雑性スコアは増加しません。このビデオでは、Sonarの認知的複雑性アルゴリズムがどのように機能するかをユーザーに教育するのに役立ついくつかの例を観察します。
ヒント #5: Sonarで道を見つける
このビデオでは、Sonarが認知的複雑性スコアリングを通じてユーザーが複雑なコードを理解するのをどのように助けるかを見ます。SonarQube for IDEやSonarQube Cloud、SonarQube ServerでIDE内で問題を確認するかどうかにかかわらず、関数内の各ポイントが全体のスコアにどのように影響するかを見ることができます。
結論として
認知的複雑性は、複雑性モデリングに新しい視点を提供します。それは、開発者がメンテナンス性をどのように認識するかとよく一致するメソッドの複雑性スコアをもたらします。これは、Sonarが認知的複雑性を測定することで、理解しやすいコードを書くのにどのように役立つかの簡単な概要でした。あなたのチームと未来のあなたが感謝するでしょう!
もっと知りたいですか?
コミュニティマネージャーのAnn Campbellによる認知的複雑性に関するホワイトペーパーをチェックしてください!

