【GitHub】レビュワーがいなくとも綺麗にコード書く気になるサービス2選と利用方法

## はじめに
コード、綺麗に書きたいですよね。使い捨てならともかく。

しかしレビュワーがいないと、ついつい神関数を作り上げたり、ネストしまくったり、
```python:良くないね.py
if nanika == None:
```
って書いてしまいがち。（良い子は`nanika is None`と書く）

そんなあなたに、めんどくさいぐらい読みづらコードを指摘してくるサービスをご紹介します。

## CodeClimate
### ふいんき
**publicレポジトリなら無料**です。
OSSでよく使われたり使われなかったりするものです。

これは、プルリクエストを出すたびに、自動でコードレビューをしてくれ、**プログラム構造のまずさ**を指摘してくれます。

まずは見ていただく方が早いでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/ee729852-d1cd-9908-81fc-901c8df67d4f.png)
こちらに、とんでもないアホネストコードを書きました。これでプルリクを出してみましょう。

すると、なんと自動的にレビューが飛んできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/162d0fc5-6533-cce5-580c-cb62f3d914b3.png)
`Cognitive Complexity`が15超えてるぞ、リファクタリングしてせめて5にしろと言われています。

この`Cognitive Complexity`（認知的複雑度）は、めっちゃ簡単に言うと**ぐちゃぐちゃ度**です。
ずっと上から下へ直線的に流れて来たプログラムが、例えば`if`や`for`に当たると、流れが変わる。その流れの変わり方が複雑すぎるとこの`Cognitive Complexity`が上昇します。

これを下げるには、関数化などしてネストを軽減するリファクタリングをしよう、ということです。

GitHubのプルリク画面だけでなく、CodeClimateのWebサイト上に「ヤバいとこリスト」をまとめて見れます。

（僕もコントリビュートしている[pythainlp](https://github.com/PyThaiNLP/pythainlp)のをお見せしています: https://codeclimate.com/github/PyThaiNLP/pythainlp）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/40ba5580-fb40-fd7d-671c-73a2203b26e1.png)

最初の複雑度103ってなんだ、どんなコードだよ、と思いますよね。
[こんな感じです](https://github.com/PyThaiNLP/pythainlp/blob/f877567bc9ba26f3a6ee03d7418a2f5e0c0ec535/pythainlp/khavee/core.py#L318)
うーん、確かに読みたくない。

### 設定項目
CodeClimateが指摘する事項はこれらがあります：
（設定画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/3fe790f7-bd20-ea28-8a4f-c67ccf4aee24.png)
* 引数の数
* 条件文の複雑度
* ファイルの行数
* 一致したコードの存在
* 関数の複雑度
* クラス内のメソッド数
* メソッドの行数
* 分岐のネストの深さ
* 返り値の数
* かなり類似したコードの存在

正直、 **デフォルトの設定はかなり厳しいです**

例えば、1ファイルの行数制限は250行（空行除く）です。
250行越えのファイル、みなさん書いてますよね。
しかし、このルールにも妥当性はあります。250行にどんな根拠があるのか分かりませんが。というのは、単純に何でも同じファイルに盛り込んでアホデカファイルを作っても、保守の際にアクセス性が悪いですよね（目的の記述を探す手間）だから責務を分割して、モジュール化しよう、というcodeclimateからの指摘です。

という感じで、これら全てに従うようにリファクタリングすると、なかなか構造的に **見やすい、扱いやすい** コードになるかと思います。

その一方で、「引数の数は3つまで」みたいな、プロジェクトの目的によってはちょっと邪魔な項目もあります。
この場合は、 **オン/オフ** あるいは **上限数** を編集することができます。安心ですね。

### 使い方
簡単です。

1. CodeClimateのWebサイトにアクセスする
    **ここで一つ罠があります**

    **2023/12/1現在、Google検索で当たる" https://codeclimate.com/ "では、OSS版（無料）にアクセスできる導線がなく、** ずっと有料のCodeClimate Velocityの案内を見させられます。

    **こっちにアクセスしてください： https://codeclimate.com/oss/dashboard**

    こっちがpublicレポジトリ用の無料版です。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/b771f444-d869-b66f-8e38-33942230acad.png)

    GitHubアカウントでユーザー登録ができます。

2. GitHubを連携

    右上の自分のアイコン->User Settingsを選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/98050250-27b8-f993-c20b-3a9f6b4e9f40.png)

    メニューからGitHubを選び、連携を設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/18020d03-848c-9477-a795-e8066511b73a.png)



3. 対象のレポジトリを登録

    Add a Repositoryからレポジトリを選んで登録
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/e9754d11-5186-d1ba-485b-3dbbbda32cc9.png)

4. レポジトリの連携設定
    レポジトリの管理画面を開いて"Repo Settings"を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/706b1295-358a-4f1b-4ffa-9435f5969100.png)

    左のメニューから"GitHub"を選び、"Pull request comments"と、"Pull request status updates"を有効化。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/d17a6e45-3469-1c6d-9136-a4836f8fd1f7.png)

    これで、**デフォルト設定**で利用することができるはずです。
アホプルリクで試してみてください。

5. レポジトリ直下に、`.codeclimate.yml`
    細かい設定がしたい場合はレポジトリ直下に`.codeclimate.yml`ファイルを作成し、やってほしいことを記入。デフォルト設定は[[こちら]](https://docs.codeclimate.com/docs/advanced-configuration)にあります。

## Codacy
### ふいんき
これも **publicレポジトリの場合は無料** です。
そしてこれもまたOSSでよく導入されていますね。

これもまたコードレビューを飛ばしてくるタイプのサービスです。
ただ、CodeClimateとは明確に役割が違っています。CodeClimateは行数やネストの深さなど「 **形式** 」を見るのに対し、Codacyは「 **記述** 」の **お行儀の良さ** を見ます。

例えば先ほどのカスコードなら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/8f2a55f5-74fb-ab7c-ad3a-0c69009c4551.png)
未使用のループ変数をやめ、`_`にしろと。こんな感じで言語特有のお言葉遣いを指摘してきます。例は`python`ですが、メジャーな言語はだいたい対応しています。
しかもいい感じに書いてくれていて、1クリックで修正コミットを出せるようになっています。
レビュー文はAI生成とのこと。ほんまに無料でいいの？

CodeClimateと同じように、サイトからヤバいとこリストを見ることができます。
このほかに、またもや[pythainlp](https://app.codacy.com/gh/PyThaiNLP/pythainlp/issues/current?levels=Warning&categories=CodeStyle)から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/ab48675d-d14e-e487-7c89-f8505385f7e8.png)
予約済み語を使うな、全例外catchはやめろ、など。

いかにも「 **お行儀** 」の躾をされている感じがして、気持ちがいいですね（？）

### 利用方法
1. ユーザー登録
    CodeClimateと違って普通にできます：https://app.codacy.com/

2. レポジトリを登録
    たぶん丁寧に画像で手順書かなくとも分かるかと思うので省略
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/37a0be93-e479-a463-dd09-29a777f46ed9.png)

**これで完了のはずです**

Codacyの設定はかなり簡単です。

## 最後に
林修からモノを列挙するときは3つ述べると多すぎず少なすぎずちょうどいいと授業で習いましたが、あとはlinterしか思いつかず、、、

`Python`の場合はBlackを使うと楽にフォーマットできるのでオススメです。

それはともかく、みなさんは綺麗なコードを書き、モジュールを分けて、保守可能なプロジェクトを開発しましょう。

:::note
いいね頂けると泣きながら喜びます><

この記事を読んでいる方は次の記事も読んでいるのかもしれません：
* [初心者だらけでもとりあえず共同開発ができる手引き](https://qiita.com/konbraphat51/items/8793f03807c39573fac2)
:::