Fringe81 Advent Calendar 2019の24日目、本日はクリスマスイブですね!
1年間を通して気にしていたことを若干ポエム的な感じで書きます。
2019年は意識的に注意していたワードがあります。それは 共通化 です。
意識しすぎたせいで、人の話を聞く時に 共通化 というワードが出てくると、話の内容よりもどんなコンテキストで共通化を使っているのかが気になる感じになりました。
「こことここは似ているんで共通化します!」
「(その共通化はどういう意味だ?)」
みたいな感じですね。
ソフトウェアの世界、特にオブジェクト指向の世界では 抽象化 というワードがあります。
最近は意識的に抽象化というワードを使っています。
僕が考える共通化・抽象化を定義したいと思います。といっても以下の影響が多分にあります。
共通化
AとBから同じモノ・コトを見つけて、異なるモノ・コトを引くこと。
例えば関数だと、関数自体が同じモノ・コトになり、異なるモノ・コトが引数として現れます。
抽象化
AとBから同じモノ・コトを見つけて、異なるモノ・コトを引き、概念を導き出し命名すること。
最初は共通化と同じですが、最後が違いますね。
__概念を導き出し命名すること__が本当に重要だと思っています。
この行為ができていれば、その行為に対する名称を共通化と呼ぼうが抽象化と呼ぼうがどちらでも良いとも思っています。
ただ共通化から導き出されたアウトプットは、重複を排除するために同じ処理を関数に切り出しすことが大半になるのではと思います。
なので、共通化とはちょっと違うぞってことを意識付けできるように、敢えて抽象化という言葉を使うように僕はしています。
抽象化できれば、クラスに格上げできる余地も出てくるので。
概念が導き出せない場合は、所謂Helperみたない便利な箱を作るしか手はなくなると思います。
重複排除
最近は概念を導き出せない場合は別に纏めなくてもよいとさえ思ってきています。
ソースコード上重複しているから・似ているから纏めるのではなくて、意味として同じだから纏める、みたいな感じですね。
まぁただ、僕も共通部分をprivateな関数に纏めたりします。その時に関数の命名に苦労することがあります。
そういう場合は概念が導き出せていないのでしょうね。
同じことを何回もしたくないっていうのがエンジニアだと思うので、どうしても重複排除をしたくなる欲求は湧くと思います。
その時に概念を導き出せれば良いのですが、導き出せない場合は本当にその重複排除は必要かを自分に問いただすキッカケになります。
最後に
共通化と抽象化って似ているけどちょっと違いますね。
ちなみに、今回僕が定義した意味と辞書的な意味はもしかしたら違うかもしれません。調べてないけど。
ある言葉の意味を全ての人の中で同じ理解にすることは不可能だと思っています。
ただ、同じ理解に近づけることは可能だと思っているので、言葉に敏感になっていきましょう!
プログラミングってある事象をソースコードに再定義する行為なので、言葉の理解を近づけるのは大切です!
では良いクリスマスイブを!!