プログラミングを独学するならRiderがおすすめ

# Riderとは？
チェコに本社を置く[JetBrain](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%96%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%BA)が開発したUnityむけの有料のエディターです。
Unity特有の機能のコード補完や、デバッガーはもちろんのこと、Unityと深く結びついているようで、エディタ側でUnityを操作できたりもします。WinでもMacでも動きます。

料金は、使い続けると**徐々に安くなる**面白い料金体系です。
私は使ったことがありませんが、
JetBrain製ではVisualStudioのプラグインの[ReSharper](https://www.jetbrains.com/ja-jp/resharper/)や[Kotorin](https://kotlinlang.org/)という言語も有名みたいです。

- [RiderのHP](https://www.jetbrains.com/ja-jp/dotnet/promo/unity/)
- [Riderの料金テーブル](https://www.jetbrains.com/ja-jp/rider/buy/#personal?billing=yearly)

# なぜ独学プログラマに良いのか？
私は、いわゆる独学のプログラマーであり、学校でプログラミングを勉強したことがありません。
最初は趣味で、今は仕事でプログラミングを書き続け、少しずつマシなコードが書けるようになった気がしています。

Riderを使い始めたのは今年、開発者の友人に勧められたのがきっかけです。
その結果、その便利さもさることながら、Riderの ~~ちょっとおせっかいな~~__添削機能__に大変驚きました。
まるでマンツーマンの先生が横にいるようです。

チームの一員としてプログラマ同士のコードレビューが開発フローに含まれていれば、~~多少不愉快だとしても、~~新しい気付きや成長もあるでしょう。しかし独学プログラマは成長させる工夫を自分で用意しなくてはなりません。Riderの__添削機能__は、その大きな助けになると思います。有料なので最初は躊躇しましたが授業料だと思えば安いものです。

以下に__添削機能__の例をあげました。

## 新機能を教えてくれる
知らないうちに言語の機能が増えている場合があります。
いつものように書いてみたら、波線が引かれていました。
### Getterの場合
＜スクリーンショット＞
![getter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/aef5e3fa-d703-e51d-50b1-0ae27786f54c.png)

```
Inconsistent body style: use expression-bodied property
```

意味が分からないので、注意書きを検索窓にコピペしてみます。すると…
![web.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/ac72e74f-578d-0817-6e9f-a4a8fe865f51.png)
こちらのマイクロソフトの記事がヒットしました。
[式形式のメンバー (C# プログラミング ガイド)](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members)

どうやらこれはC#6とC#7で導入された新機能であり、getterのみの場合（setterがないとき）は簡潔に書けるようです。
ふむふむ。勉強になります。

＜旧コード＞

```c#
private int score = 0;
public int Score
{
    get
    {
        return this.score;
    }
}
```

＜新コード＞

```c#

public int Score => this.score;
```

上記は説明のためのシンプルな例ですが、
実際のゲームでは、もうちょっと凝った感じで使っています。

```c#
/// <summary>
/// 点数の計算で必要な母数
/// </summary>
public int TotalRequiredCount => List.Where(l => l.Valid).Count(l => l.Required);
```

### varの場合
RiderはUnityだけでなく、webのフロントエンド用の言語もカバーしているようです。
せっかくなのでJavaScriptを書くときに使ってみました。

＜スクリーンショット＞
![var.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/78b7563e-13d3-d44f-a0dd-da2bb7742d1e.png)
`var` は普通、書いちゃいますよね。

```
'var' used instead of 'let' or 'const' 
```

調べてみるとES6からの新機能らしく、少し前に入ったようです。
こちらの記事を読んで勉強します。
[ES6の新機能: 「let」「const」宣言を調べてみた](https://qiita.com/niisan-tokyo/items/bacb5ed98ea10831eeba)

どうやら`var`の機能を制限したもののようで、うっかり上書きするのを防げるようです。
ありがとうございます、Rider先生。今後、積極的に使います。

## タイポの指摘
スペルを覚えるのがどうしても苦手で…　今まで多くのタイポをコードに混入させてきました。
Word等の文章ソフトではタイポチェッカーのおかげで間違えに気が付きやすいのですが、ソースコードの変数は（たとえスペルが間違っていようとも）書かれたものが正しく、エディタによる指摘は難しいだろうと諦めていました。

…ですがRiderは、このように変数や関数のタイポを指摘してくれます。
![スクリーンショット 2020-12-19 20.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/cd489519-9eab-3a97-9df6-5a6debe27828.png)
`socre` でなく `score` ですね。（なぜかよく間違えます）

また、このように複数の単語が合体した関数も、間違っている単語のみ指摘してくれます。
![スクリーンショット 2020-12-20 0.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/ee57b976-f997-3a51-d5f2-972a420fe7bf.png)
タイポは、後から見て恥ずかしいばかりでなく検索で引っかからなかったり、誤って別の変数にアクセスをしていたりなど不具合の原因になります。Riderがタイポを教えてくれるおかげでこの類のバグは起きなくなりました。

## UnityならではのTips

Unity特有の問題もアドバイスしてくれます。
リアルタイムにコードレビューを受けているような感覚です。

例えば、うっかり毎フレーム実行されるUpdateの中に、`GetComponet` を書いてしまいました。
すると…
![スクリーンショット 2020-12-19 20.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/3726ba81-0892-530d-e95e-f6f7f8d127dd.png)

```
Expensive method invocation
```
ざっくり意訳すると__「そこでやると重いですよ」__ということなのでしょうか。
こんなことも教えてくれるのですね。ありがたい。

# [おまけ] Riderの気に入っている機能

いままで添削機能について書いてきましたが、便利な機能もたくさんあります。
せっかくの機会なので、好きな機能をいくつか紹介します。

## 強力な検索
`Ctrl+Shift+F`で現れる検索ウィンドウが、恐ろしく強力です。
例えば`IgnoreConfirmationFlg`と入れるとプロジェクト内を全文検索して瞬時に表示されます。
…いや、現れるのが速すぎるので、事前にインデックスを作っているのでしょう。とにかく高速です。
![スクリーンショット 2020-12-20 0.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/01e1f5f6-3440-2f3f-83ac-84b1962635db.png)
また驚いたのは、この__検索ウィンドウ内で編集__ができることです。
新たにウィンドウを開く必要はありません。この編集の体験は革命的です。

### 強力なリネイム
今までリネイムは、おっくうな作業でした。
例えば、単純な置換ではヒットしてほしくない部分も編集してしまったり、
変数が変わることで、インスペクタで設定したパラメータがリセットされてしまったりするからです。

ところが、Riderのリネイムはどうゆうことでしょうか。
不思議な技術で__うまいことやってくれます。__

発見したRiderのリネイムの特性です。

- 依存性から検索しているようで、的確に置換される
- クラス名を変更したらファイル名も変更される
- __インスペクタで設定したパラメータが外れない__

最後の「インスペクタで設定したパラメータが外れない」について補足をしておきます。
まず、インスペクタで何か設定している変数の場合、以下のようなウィンドウが表示されます。
これは`gameUiState` を `gameUi` に変更しようとしたとき。
![スクリーンショット 2020-12-20 1.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/463c3edf-1345-1805-bde4-807cda700215.png)
`Add FormerlySerializedAs attribute` にチェックを入れます。
するとusingとアトリビュートが追加されます。どうやらこの変更でインスペクタの設定が維持されるようです。

```c#
using UnityEngine.Serialization;
public class Sample
{
    [FormerlySerializedAs("gameUiState")] [SerializeField] private GameUiState gameUi;
    ...
}
```

これらの追加された記述は、__一度でもUnityでコンパイルが動けば削除しても問題ありません。__
気になるなら消しましょう。（私は消す派です）

### usingの自動追加
ファイルの一番上にデフォルトで書かれている読み込みに関する記述です。

```c#
using System;
using System.Collections.Generic;
using UnityEngine;
```

C#には様々な便利な機能がありますが、それらを使うには読み込む必要があります。
今まで、いちいち書いていたのですが、
Riderは読み込んでいない機能もコード補完でき、その機能が使われたら自動で記述してくれます。
例えば`UniRx`の機能、`Observable` とおもむろに書いてみます、すると…
![スクリーンショット 2020-12-20 1.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95460/e00e2f23-2eb0-47c2-6167-b40ab3fd0b6e.png)
読み込んでいないのに、こんなに候補が出てきました。
実際に使用すると、usingに自動で追加されます。

```c#
using UniRx;
```

一度慣れてしまうと、もとの暮らし(?)には戻れない便利さです。

# まとめ
今年から使ってみたUnity用コードエディタのRiderについて、
__プログラムの独学に役立つぞ__、という視点でレビューをしてみました。

満足をしているのですが、最後にデメリットも書いておくと、かなりメモリを消費します。
WinとMacで使用していますが、私の環境ではともに__2GBくらい__使っているようです。
検索の高速さやリネイムの正確さはメモリとのトレードオフなのでしょう。たぶん。

導入については、すでに良い記事がありますのでご紹介だけしておきます。
[Unity(C#)のEditorを次世代IDEのRiderに乗り換えてみた](https://qiita.com/asa_s/items/2b7ee83e7ec5956734c1)
_2020/12/19現在、30日の試用期間があるようです。_

ここまで、お読み頂き、ありがとうございました。
良いお年を。