【初心者にやさしい】CS(コンピューターサイエンス)基礎の基礎の学習：関数

# CS(コンピューターサイエンス)基礎の基礎
現在、CS基礎の基礎を一から学んでいるので、その学習成果のアウトプットに、、、

## 今回は「関数」

### 1. 関数とは
　関数とは、 __データを入力し、演算し、結果を出力するためのひとまとまりの処理のこと__ を指します。プログラミングを進めていくと、自ずと複雑な処理を記述していく必要性にも見舞われます。そのような時に、その複雑な処理をひとまとめにしておくことができれば、「 __可読性__ 」や「 __保守性__ 」を大きく高めることにつながります。

### 2. 関数の使い方
　関数は原則として「名前をつけて定義」します。その際に必要な事項が以下の３つです。

　__①関数名と出力時のデータ型__　![関数の基本的な使い方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/d0c74073-201c-72f9-635b-9ffee8435a48.png)
　上のコードを見てください。1行目にある「triangleArea」というのが「関数名」です。基本的に関数を使うときは、このように名前をつけて宣言します。そして受け取ったデータをもとに演算した結果を出力する際、どのデータ型で出力するのかを「double」という記述で指定しています。こうすることで、結果を「double型」で出力するということを指定できました。

　__②引数とデータ型__　![関数の基本的な使い方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/d0c74073-201c-72f9-635b-9ffee8435a48.png)
　 __「引数」とは関数の内部と外部を繋いでデータの受け渡しを担ってくれる「橋渡し」のような役割を果たす__ ものです。「このデータを使って関数内で演算子してください」という目的で渡すデータを「 __実引数__ 」、関数側で仮の値として受け取り、演算に使用するためのデータを「 __仮引数__ 」と言います。上のコードで言えば、「3,5」が実引数、「int weight, int height」が仮引数です。
　ここでのデータ型とは、仮引数をどのデータ型にして演算に使用するのかを定めるために必要となります。そのため、「int weight」などのように仮引数の前にデータ型を記述しているのです。

　__③関数内の処理内容__![関数の基本的な使い方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/d0c74073-201c-72f9-635b-9ffee8435a48.png)
　これは、上のコードで言うと、「width * height / 2」の部分です。受け取ったデータをもとにして実際に演算する部分です。演算結果に対して「return」と記述することにより、結果を返すことができます。この時に、 __演算結果として返されるデータを「戻り値」__ と言います。
![引数と戻り値について　図解.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/5eec66e9-90b2-6315-4e03-cd2f81b937e4.png)

:::note warn
※ちなみに、①と②で「データ型」の指定が必要と書きましたが、これは「静的型付け言語」の場合に必要な工程となります。静的型付け言語は、処理の実行前にデータ型の指定が必要となるからです。一方、動的型付け言語の場合は、処理の実行中に自動的にデータ型を指定してくれるため、自ら記述する必要はありません。「静的型付け言語」は「JavaやC言語、TypeScriptなど」、「動的型付け言語」は「Ruby,PHP,Pythonなど」が挙げられます。
:::

### 3. 名前空間(関数の複雑化に対応)
　基本的な関数の使い方としては、上に示した通りですが、プログラムを書き進めていくと、同じ名前の関数や変数を複数の箇所で使用しなければならない場面などが出てくることになると思います。そのような時に、ただ同じように書き進めていくのでは、可読性や保守性が落ちていってしまいます。
　そこで、便利なのが __「名前空間」__ です。 __「名前空間」とは、関数や変数を必要なものだけひとまとめにパッケージ化し、そのパッケージに名前をつけてグルーピングするというもの__ です。こうすることで、同じ関数名の衝突などを避けることができると同時に、この名前空間ではどのような処理が行われるのかを一発で理解できるようにもなり、よりスムーズな開発へと進めることができます。
![名前空間.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/9097ddfb-4e7c-f04e-4faa-babed85b10f8.png)
　上のコードでは、「perimeter」と「area」という関数が複数あったり、「side」という変数が複数あったりしていますが、それぞれが名前空間ごとにグルーピングされているため、しっかりと整理されていますね。
　複雑になればなるほど、こうした名前空間によるグルーピングは大切になってきます。
　この名前空間は、「クラス」とも呼ばれます。そして、クラス内で使用される関数を「メソッド」と呼び、クラス内で定義された変数を「メンバ」などと呼びます。

### 4. ライブラリ
　世の中には、 __色々な関数をまとめてパッケージ化してくれているもの__ が存在します。それらを __「ライブラリ」__ と言います。ライブラリはデフォルトでそれぞれの言語に収録されている場合もあれば、第三者によって提供される場合もあります。これらのライブラリを利用することにより、一から関数を記述しなくても少ない記述で実行できるようになります。
　例えば、多くの言語で「数字に関する関数をまとめたライブラリ」として __「Mathライブラリ」__ が存在します。以下の図はRubyに用意されているMathライブラリの中の関数(=メソッド)をまとめたものです。
![Rubyの便利なメソッド群.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/d0d64ff0-7529-3245-dbcb-99cf93a09ce0.jpeg)
　「even?」や「floor」など数字に対して使用するメソッドが「Mathライブラリ」に含まれます。
　こうしたライブラリの使用は、プログラムが複雑になればなるほど重宝します。

### 5. 関数に関する追加知識 
　 __①関数は「命名方法」に気を付ける必要がある__
![名前重要.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/9d80a387-e82e-c9bd-fa73-011b251d12ca.jpeg)
　プログラミングの原則に __「名前重要」__ というものがあります。名前をつけることは、「自分の理解度を示す」とともに「開発者同士の会話を円滑にする」ことにつながります。そのため、関数への命名の仕方にも気を配る必要があります。
　一目見て、その関数が「何をどうする関数なのか」を理解できるように命名しましょう。

　 __②コンピューターでの「関数」と数学での「関数」の違い__
　数学では、例えば「f(x) = 3x + 5」のように関数を定義し、xを引数のようにして個別の値を受け取って計算を行うというように使いますよね。コンピューターにおける関数でもここまでは似ていますが、コンピューターにおける関数は何も数値のみの演算にとどまりません。例えば、「文字列を2つ受け取り、それらを足して結果を返す」というような処理も行うことができます。
![関数で文字列を扱おう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/85eda8de-e10b-217a-8379-9d1b907069a6.png)
　上のコードでは、文字列として「Taro」と「Tanaka」を渡し、それらを関数内で足し合わせ、結果を返すという処理を組んでいます。

### 6. 学び
　この関数を学んだことで、 __「データ型」の大切さ__ をあらためて学びました。私は元々動的言語である「Ruby」の学習から開始したので、そのときはデータ型をあまり意識する必要がありませんでした。しかし、「Recursion」での学習で静的言語でのコーディングも体験したことで、データ型を強く意識する必要性が理解できました。
　やはり基礎が大切なのだと改めて実感できました。