自己紹介
Lancers(ランサーズ) Advent Calendar 2018の14日目を務めます、ランサーズ新卒の松原です。
普段はCREチームにて、管理画面を直したり、ユーザーからのお問い合わせの内容を元に、ユーザーの要望に応えるべく、カリカリ実装しています。
(↓みてね↓)
管理画面チラ見せ♡ナイトに登壇しました!
概要
社会人になってから9ヶ月経ちましたが、コードレビュー時にいつもつっこまれがちなのがコードの書き方や変数名。
個人開発の時は、正直なところ動けばいいや〜!と思っていましたが、大規模なサービスや複数人で開発しているプロジェクトの場合、可読性・保守性の観点から、たしかにコードの書き方がとても重要だと感じるようになりました。
社会人になって一番学んだことなので、今回はそれをテーマに、スコープと変数について書きます。
スコープを意識する
スコープとは
変数やメソッド、クラスが使える範囲のこと
スコープが大きいと?
一つの変更によって他の多くの場所を修正しなければならなくなったり、デバッグ時に調べる対象が増える。(使える=依存している=保守性に影響を与える)
スコープを意図的に小さくする
覚えていなければいけないことや注意しなければならない範囲も減る
スコープを小さくする方法
ローカル変数の場合
-
変数は使用する直前で宣言する
-
メソッドに抽出する
→共通処理をメソッドに抽出し、そこでローカル変数を定義する -
リファクタする場合は、ローカル変数ごとにうまく別メソッドに移動させる
→変数自体を知る必要がなくなる -
一時的に利用する変数のスコープをループ内に閉じ込める
インスタンス変数、クラス変数、メソッド、クラスの場合
下記の項目では下にいくにつれてスコープが長くなる。意識的に短くスコープを設定する
private
そのクラスからしかアクセスできない
protected
そのクラスと、継承しているクラスからしかアクセスできない
public
どこからでもアクセス可能
メソッドの引数
必要最小限の情報にすると引数に対しての依存が小さいコードになるので◎
名前の付け方
変数名
ローカル変数はスコープを意識
メソッド内などで一時的に宣言される変数は慣習に従ったほうがわかりやすい
(for文で使用するiなど。)
スコープが短い場合、名前を短くしたほうがわかりやすいので短くてもよい
グローバル変数、クラス変数、インスタンス変数はわかりやすい名前
ローカル変数と比べると変数のスコープが長い=宣言した場所から離れた場所でも使うことが多い。
パッと見て変数の意味がわかりやすい名前にすることが重要。
何のために何をしている変数なのかわかりやすくするなど、意味を正しく表現する。
※なおメソッドの引数名はわかりやすく簡潔に
名前から機能がわかるメソッド名にする
メソッドでは処理を行うので「動詞」、または「動詞+目的語」になっていることが多い
具体例
Before
### After →**saveRestrictionForUserForm**に変更しました!どういう場合→ ユーザーフォームから変更するときに(ForUserForm)
何を→ 制限するという状態を(Restriction)
どうする→ 保存する(save)
※限定的な時に使用するメソッドだったのでいつ使うものなのか明確にしました
Before
### After →**setBelongIdAndBelongToUser**に変更しました!何を→belong_idとBelong_to = "User"といった必要な値を(BelongIdAndBelongToUser)
どうする→設定する(set)
※このメソッド自体は値を設定するだけで保存はしないので、最初に命名していたsaveは適切ではなかったです
名前だけで何を行うのかわかるクラス名
変数名やメソッド名よりも粒度が大きいので適切で良い名前をつけることが重要。
いい名前が思い浮かばなかった時は設計を疑う
1つのクラスに複数の責務を押し込んでいたり役割が曖昧だったりしているかも
参考
※リーダブルコードは今読んでいる途中なので、近いうちに読み切ります🔥🔥