### *[アドベントカレンダー 2019年]* #### *6th December 2019*
## これ、完全に身内用やねんな。
## 外野さんは細かい突っ込みは無しで頼むんやで。
## そのレベル?的な内容から書いてるでな。
なんと今年は社内でアドベントカレンダーやりたいねーってなりました!
でも、取り組み自体初めてだからみんなリレーで思い思いのタイトルを日替わりでやることに。
なので僕はQiitaで久々に投稿してみます。
嬉しいことに、以前作ったヤ趣~~(ヤバみな趣き)~~溢れるコードを
後輩のA氏がアドベントの初日にリファクタリングしてくれました。
なので、もう一歩深めて記事を書いていこうかなって思います。
※※※別に悔しかったわけじゃねーし!こんなん平気だし!すごいとこ見せたいとか思ってねーし!だし!
例のリファクタリングコード
前のバトンを受け継いで...
この子は席替え用に作った子ですね。
当時いた16人の研修生に対して、座席番号をユニークに割り振る機能のコードです。
#!/bin/sh
readonly NUMBER_OF_TRINEE=16
selected_seats=()
NUM=0
for i in `seq $NUMBER_OF_TRINEE`
do
echo ENTERを押してくださいね。:
read
while true
do
NUMWK=`expr $RANDOM % $NUMBER_OF_TRINEE`
for i in ${selected_seats[@]}
do
if [ $i = $NUMWK ]; then
continue 2
fi
done
NUM=$NUMWK
break
done
selected_seats=("${selected_seats[@]}" $NUM)
#結果を表示
echo $NUM
done
echo 全員セットできました。
exit 0
僕がすごい雑に作ってたコードをA氏がリファクタリングしてくれたものが ↑ になります。
ここからのリファクタリングもまだ変数どうしようとか、課題も自身で上げてくれています。
さて、今回はこれをさらにリファクタリングする時に考えること、を考えてみましょう。
リファクタ? アブストラクト(抽象化)?
上からこのコードを見始めると "NUMBER_OF_TRAINEE" を起動時引数にすればいいじゃーん。
って気がしませんか?
僕はめっちゃ起動時引数にしたいです。
でも、これってリファクタリングじゃなくて抽象化(もしくは、それ以外の何か)になっちゃうんですよね。
ここでは思った通りにやってしまうと下記のような差が生まれます。
現在の機能:
「起動するとreadコマンドへのEnter毎に番号がユニークに出力される機能」
変更した後の機能:
「 起動時引数に母数を入れて 起動するとreadコマンドへのEnter毎に 母数までの 番号がユニークに出力される機能」
リファクタリングって大前提が「プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること」ですので、
こういう改変はリファクタリングのフェーズでやってはいけません。
仕様が変わることって影響が大きいから注意しなきゃいけないですね。
もちろん、仕様も自分で決められる時に改良することは良いことですが、
同じ既存コードの書き換えもシーンを切り分けて考えることが重要です。
つまり、今回は "リファクタリング" を行うって決めてるので、
・「起動するとreadコマンドへのEnter毎に番号がユニークに出力される機能」
という点を変更しないで考えてみましょう。
リファクタリングの観点
実はリファクタリングもどういう観点で実施するのか、
何のためのコードなのかによって種類があります。(僕はあると主張します。)
- 内容の純粋な整理(不要な変数消したり、各種名前を整えたり。)
- 計算回数を減らす -> 効率性がUP!
- 見え方、ぱっと見の分かり易さを向上する -> 保守性がUP!
- 新しい記法のトライアルで -> 結論が分かっている機能だからナレッジに転化しやすい
基本的に1.を実施後に2~4のいずれかを実施するイメージになりますね。
今回、A氏は1.の純粋な整理と言う観点ですごくきれいなコードにしてくれました。
なので、張り切って2~4を実施していきましょう。
### でも、この企画は...
アドベントカレンダーだから続きは他の日に書くね!!!
2, 3について個別の記事になるかなぁ、と言うイメージです。
ここまで読んでくれてありがとうございましたーヽ( ・∀・)ノ