本記事は、投稿者が勉強したことをアウトプットするために書いたものです。記事の内容が間違っている可能性がございますことをご了承ください。また、記事の知識はそのすべてを網羅しているわけではありません。参考文献を最後に乗せていますので、完璧に学びたい方はそちらを参考に。
#抽象化とは何ぞや
抽象化とは、思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は捨て去る方法である。
なるほどなるほど。
もっと簡単に言うとおそらく、**一番大事なところだけに注目して、他はとりあえずほっとく**という事なのでしょう。 そして最も気になるのは、この抽象化という思想がなぜプログラミングにおいて重要なのかという点です。
#抽象化はなぜプログラムで重要なのか 取り敢えず下記のコードを見てみましょう。 (投稿者が現時点で一番学んでいるのがJavaScriptなので、それで書いています。)
function drawsquare() {
let ctx = document.getElementById('cvs').getContext('2d');
ctx.fillStyle="red";
ctx.fillRect(10, 10, 100, 100);
}
これがどういったことをしているコードか分かりますでしょうか? すでにある程度JavaScriptを学んでいる方や、ほかのプログラミング言語をやっている方なら分かるかもしれません。
でも、ほかの多くの人には分からないと思います。
ですが、最初の行の`drawsquare()`を見れば、何をしたいかなんとなく分かります。 「drawsquare」を直訳すると「正方形を描く」です。
**ああこれは正方形を描きたいプログラムなんだな、と分かります。** **これが抽象化です。**
**「一番大事なところだけに注目して、他はとりあえずほっとく」**、です!
全てのコードを読まなくても、最初の一行を読むだけ。 それで何をするためのコードなのか瞬時に理解できます。
#理解しやすいプログラムは生産性を上げるということ プログラムというものは一回書いて終わりというものではありません。
アップデートを行うためにコードを書き足したり書き換えたり。 必要なくなったコードを削除したり。 それらと整合性を保つためにプログラムの他の部分を書き換えたり。
頻繁にファイルを開いて、プログラムを読みます。 プログラマーは基本チームで開発するので、他人が書いたコードも読みます。
二つのコードを見比べてみてください。 もし初めて見るプログラムだったとき、どちらの方が理解しやすいでしょうか。
・ひとつ目のコード
function 関数名() {
//数百行~数千行のひたすら長いコード
// ~
// ~
// ~
// ~
// ~
}
・ふたつ目のコード
function 関数名() {
function わかりやすい名前() {
//数十行程度のコード
// ~
}
function わかりやすい名前() {
//数十行程度のコード
// ~
}
function わかりやすい名前() {
//数十行程度のコード
// ~
}
// ~
// ~
// ~
}
ふたつ目の様に機能ごとに詳しく分割してあるコードの方が遥かに分かりやすいはずです。
プログラムの抽象化は、こういったコードの分割にも使用できます。 これをすることで、コードの読みやすさがさらにアップすることでしょう。
#抽象化すればプログラムの中身が分からなくても何とかなる **もう一つ、プログラムの抽象化による恩恵があります。 それは、プログラムの中身を理解できなくてもその使い方を簡単に理解できるという事です。**
JavaScriptを書くときにお世話になるコードがいくつもあります。 これはその一部なのですが……
Math.floor(数値を入れる); //数値の小数点以下を切り下げて整数にする
Math.ceil(数値を入れる); //数値の小数点以下を切り上げて整数にする
Math.random(); //0 以上 1 未満の疑似乱数を取得する
これらのコードは、この一行を入れるだけでその機能通りの数値をポンと出してくれます。
プログラムを少しかじった方なら分かると思いますが、 **プログラムとは非常に単純な命令を多く組み合わせることで、複雑な機能を作ることができるものです。**
この三つのコードも、私たちの知らない裏で複雑かつ大量のコードが動いているはずです。 でも、私たちはこの一行を描くだけでこの機能を活用できます。 **このプログラムの中身が分からなくても。**
英単語の意味も非常に分かりやすいですよね。 それぞれMath.floor(数学.床)、Math.ceil(数学.天井)、Math.random(数学.ランダム)です。
これこそ抽象化の思考そのものである、 **一番大事なところ(プログラムの機能)だけに注目して、他(プログラムの中身)はとりあえずほっとく**なのです。
#参考文献 Webアプリケーションサービス:[Recursion](https://recursionist.io/) Facebook社のガチエンジニアが作った、日本語でコンピューターサイエンスを学べるサービス。