[Android-Kotlin]convert java to kotlinで問題になるm-prefix,s-prefixを正規表現置換で一発除去

# はじめに
普段は技術系のネタは個人ブログに書いていますが、アドベントカレンダー仕様に合わせてQiitaで初投稿します！
今回の記事は何が言いたいかというと正規表現で検索とか置換って便利ですよねというお話です。（実際のところkotlinはこじつけであまり関係ありません。）

# ◯-prefixとは

変数のネーミング規約でハンガリアン的にプレフィックス（先頭）に決まった文字（◯の部分）をつけることです。

#### 例
```
int strHoge;
static textHoge;
```

## android-javaのコーディング規約
android-javaのスタイルガイドにはprivateフィールドのプレフィックスは「m」、staticフィールドのプレフィックスは「s」がスタイルガイドに記載されており、慣例的に使われています。

android-javaのスタイルガイドには
- Non-public, non-static field names start with m.
- Static field names start with s.
https://source.android.com/setup/code-style

```
public class Book {
    
    private int mId;
    private String mTitle;
    private int mPrice;
    
    public Book(final int id,final String title, final int price){
        mId = id;
        mTitle = title;
        mPrice = price;
    }
}
```

## Don't use m-prefix and s-prefix
android-javaの時からあまりつける意味がないと思ってきていました。
とは言っても個人的にはハンガリアン記法はよくやります。
m-prefixとs-prefixが入らない理由は色々なありますがバインドライブラリで定番のButterKnifeを使う場合にバインドするものはprivateなのでmをつけたくなりますが、ButterKnifeのバインド仕様上、publicになり矛盾します。
他の理由については他のサイトを参考にしてみてください。
ハンガリアン記法は否定・肯定組（vim vs emacs風）など検索するといろいろでるのでみてるだけでも面白いと思います。要は時と場合により使い分けると良いです。

## Android-Kotlinのコーディング規約
m-prefix,s-prefixをつけるという記載はどこにもありません。
android-javaの場合に慣例的によく使っていただけなんです。なのでこれから新規でkotlinでandroidアプリを作る場合はそもそもプレフィックスをつけることはないんです。（間違えてつける人はいるのかも）

## convert java to kotlin
javaでprefixをつけてた人はAndroidStudio環境でkotlinへ自動変換する機能を使うとm-prefix,s-prefixが残った状態になります。

#### before java
```
public class Book {
    
    private int mId;
    private String mTitle;
    private int mPrice;
    
    public Book(final int id,final String title, final int price){
        mId = id;
        mTitle = title;
        mPrice = price;
    }
}
```
#### after convert java to kotlin
```
class Book(private val mId: Int, private val mTitle: String, private val mPrice: Int){

}
```
大分残念な事になっています。

# m-prefixとs-prefixを除去する

皆さんお得意の正規表現で一発置換します。AndroidStudioでも正規表現が使えます。
正規表現の記載はどの言語もだいたい共通です。個人的にはrubyでよく使います。

AndroidStudioの正規表現構文リファレンス(IntelliJ IDEAだけど同じ)
https://www.jetbrains.com/help/idea/2016.2/regular-expression-syntax-reference.html#d1540635e834

## 一発置換実行

m-prefixを一括置換します。（s-prefixの場合は(m)を(s)に変更してください）

```
検索文字：([\s|\t]+)(m)([A-Z])([a-z]+)
置換文字：$1\L$3$4
```
画像のとおり、Match case(大文字小文字区別)、Regex(正規表現を使う)は必須でチェックを入れてください。
対応ファイルは基本kotlinファイルのみで良いため、File maskには*.ktを入れると良いです。

<img width="792" alt="kotlin.png" src="https://qiita-image-store.s3.amazonaws.com/0/109862/f8b743dd-54c4-08d6-f649-9733dc0b40a9.png">

細かい説明はいらないと思いますので、一応キャプチャ機能だけ説明します。
検索文字で()を利用するとその該当文字をキャプチャ（再利用）できます。一つ目の()が$1で...のような形です。正規表現知ってるけどキャプチャ機能は存じ上げない人が結構いるので知らなかった人は試してみると便利ですよ。

## 気をつけましょう
mId → id　などidが他のローカル変数や予約語などと被る場合に上手く動かないので一括置換しても変換後にリグレッションテストしたほうがいいです。置換対象を個別に確認した方が安心です。コンパイルは通るが実行時に不具合またはエラーが発生する可能性があります。

# 統括
kotlinに変換した場合以外にもjavaからprefix消したいときも使えるのでぜひ一度お試しください。
AndroidStudioであまり使われていないというか使えていない正規表現。場合によっては開発効率上がるのでぜひ積極的に使ってみてください！

# 余談
現在アサインしているプロジェクトのコードをjava→kotlinに全変換しました。最初はゴールがあるのかどうかもわからず対応し続け、実際のところ12営業日ほどでなんとか対応できました。（リリースで一度失敗してjavaに戻した経緯あり。トラウマ）
ただ自動コンバート機能だけでは到底できず、プロジェクトが大きい（コード量が多い）ほどエラーが無数にでます。8000エラーほどでましたがkotlinならではのnon-null系のエラーもそうですがコード修正が色々あり大変でした。ただkotlinの関数型仕様は非常に使い勝手が良く変更してよかったなと思ってます。
よいkotlinライフを！