アプリケーション開発に使われる、フレームワークとは?
目次
- はじめに
- プログラミングでよく聞くフレームワークとは?
- なぜフレームワークが使われるのか?
- フレームワークを学び、使う上で必要な知識
- フレームワークで必要な知識(概要)
- オブジェクト指向プログラミングについて
- アーキテクチャパターンについて
- アーキテクチャパターンを構成する要素(M、V、P、C)について
- MVCについて
- MVPについて
- MVCPについて
- 学習方法について
- 最後
はじめに
はじめまして バックエンドエンジニアのonoです。今回は、プログラミングを勉強する方は一度は聞いたことがあるであろうフレームワークについてご紹介します。
学生時代にPHPのフレームワークについて勉強していましたが、当初はフレームワークを理解するには何が必要で何を学べばいいのかわかりませんでした。
そこで、「フレームワークについて参考書や先生から見聞きして興味はあるけどどういう方法で学べがよいのか」「プログラミングで使用されているフレームワークを全体的に知りたい」など、これから学ぶ方の力、きっかけになればと思い、今回の記事を書いていこうと思います。
プログラミングでよく聞くフレームワークとは?
フレームワークとはいったいどういうものなのか、できるだけわかりやすく説明していきます。
簡単に説明すると、フレームワークとは「開発をする上で必要な機能などの枠組みが揃っているもの」です。
プログラマーではない方でもわかるように、フレームワークをプラモデルに例えてみると、下記のような図になります。
プラモデルにはキットと一緒に組立説明書というものが入っており、その説明書の通りに組んでいけば誰でも完成させることができます。
このように1からなにか用意する必要がないので、フレームワークのみで開発することができます。
なぜフレームワークが使われるのか?
フレームワークのメリットとデメリットについて考えてみました。 記載してみると、やはりメリットの方が大きく、なぜフレームワークが使われるのかを紐解くことができます。
フレームワークを使うメリット
・1から開発する必要がなくなる。
・ファイルなどを追加する場合に、基本的にはどの場所に置くかが決まっており、どこに何があるかがわかる。
・開発途中で合流した場合、フレームワークの使い方と言語をを知っていればすぐに戦力になれる。
・フレームワークにセキュリティ対策がされており、ある程度は担保されている。
フレームワークを使うデメリット
・フレームワークで使用されている言語だけを知っていても使用することが難しい。
・フレームワークごとに使い方が違うので、そのフレームワークごとに覚えないといけない。
フレームワークを学び、さらに使用する上で必要な知識とは?
フレームワークで必要な知識(概要)
ここからはフレームワークを学ぶ上でどのような知識が必要になるか書いていきます。
フレームワークには共通して必要となる知識があります。
それは「オブジェクト指向プログラミング」というものです。
フレームワークでは「オブジェクト指向プログラミング」を用いて作られている為、この考えを学ぶことがフレームワークの理解につながっていきます。
オブジェクト指向プログラミングについて
このオブジェクト指向プログラミング自体を聞いたことない方向けに簡単に説明をしますと、
「プログラミングの構造としてオブジェクトというものに置き換え、扱う記述のこと」を指します。
ここでいう「オブジェクト」とはクラスのインスタンスであり、関連する(親クラス、子クラスなどの)データがまとまったものです。
オブジェクト指向プログラミングには4大要素というがものあります。
4大要素については以下の通り。
オブジェクトが持っているプロパティを、外部のクラスから直接書き換えられないようにすることです。
抽象化
オブジェクトを分類化し、その中で共通しているものを見つけだすことです。
継承
共通して使うであろうメソッドなどを親クラスとして作成し、この親クラスを継承することで、継承したクラスは親のメソッドを使用できるようになります。
継承をすることで同じメソッドを個々のクラスに書く必要がなくなり、一つのクラスにまとめることできるようになります。
多様性(ポリモーフィズム)
共通したメソッドを呼び出した際に、呼び出された子クラスによって異なる振る舞いを(クラスによって結果が変化)することを指します。
これらはオブジェクト指向プログラミングを学ぶ上でとても重要です。
そして今回は、オブジェクトを扱う上で特に必要になってくる「カプセル化」を重点的に説明していきます。
オブジェクトからメソッドやプロパティを呼び出す際に、そのメソッドやプロパティの公開・非公開によって呼び出すことができるか、できないかが変わってきます。
メソッドやプロパティを作成する際、public、protected、privateといったようにそのメソッドやプロパティの扱いに対しての設定が必要になってきます。
public 公開 (どこでもアクセス可能)
protected 限定公開 (自クラスと継承したクラスだけアクセス可能)
private 非公開 (自クラスのみアクセスが可能)
上記を、アクセス修飾子といいます。
自分が作成するメソッドやプロパティにはどのような設定をしようかなど色々考えることが必要になってきます。
例として、自クラスしか使わないメソッドやプロパティがあったとします。その場合他クラスでは使われないため、そのメソッドやプロパティをpublicまたはprotectedにするのは設定的におかしいですよね。またコードの安全面的にもまずいため、この場合privateにします。
外部からそのメソッドやプロパティを変更されたくないといった(オーバーライドで処理を上書きされたくない)場合にもprivateにします。
基本はまず、privateに設定。他クラスで使う場合などにはpublicまたはprotectedしたほうがよいかを考えます。
参考リンク一覧 【C#入門】カプセル化とは?アクセス修飾子の種類と使い方を紹介
アーキテクチャパターンについて
続いてはフレームワークでよく使われているアーキテクチャパターンについて説明していきます。
このアーキテクチャパターンとはPHP、Ruby、Rust、Javaなどの多くの言語のフレームワークに使われています。
アーキテクチャパターンとは、書いてあるとおりパターンです。
実装をする際にみんな同じパターンでコードを書くことで、そのコードをどこに置くなど管理がしやすい、またコードを読む際にも何をやっているのかがわかりやすくなります。
では、どのようなアーキテクチャパターンがあるかというと・・・
MVC、MVP、MVCP
この3つとなっています。
3つ以外にもアーキテクチャパターンありますが今回はこちらをピックアップしていきます。
この文字だけでは何を意味しているのかわからないと思うので、順番に説明していきますね。
アーキテクチャパターンを構成する要素(M、V、C、P)について
Model
ModelとはContorllerから渡されたデータなどを処理するなど、ビジネスロジックを担当しています。
View
Viewとは受け取ったデータを表示したり、時にはユーザーから入出力されたデータをPresenterなどに渡す役割になっています。
Controller
Controllerとはユーザーからの入力に基づいてViewとModelを制御する役割になっています。
Presenter
PresenterとはViewの表示をする際に必要となるものをModelに問い合わせに行き、Modelから受け取ったデータをViewへ渡す役割となっています。
Controllerがない場合ModelとViewの橋渡しをしています。
条件によってはPresenterがビジネスロジック部分を担当することもあります。
これから紹介するアーキテクチャパターンの名称は、上記の頭文字をとったものです。
MVCについて
MVCはそれぞれが完全に分離されており、開発をする際には機能ごとに分担作業が可能です。
また、分離されていることで一部コードを変更する際の影響箇所が少なくなります。
動作 ユーザーから送られてきたデータをControllerが受け取り、Modelにデータの問い合わせを行い、そのデータをViewへ渡し、Viewが表示をしたものをユーザーへ返すという動作になっています。
Webサイトは基本このMVCが使われています。ユーザーはURLをクリックした人、そこからControllerにいき、ページに必要なデータをModelが用意し、ControllerがそのデータをViewへ渡し、サイトが見えるという形です。
MVPについて
MVCのContllerと基本は変わらず、データの問い合わせ等の制御をする役割がPresenterに変わっただけになります。
ただし、Controllerとの違いはユーザーから直接ではなく、Viewからこのデータが欲しいとPresenterへリクエストをする点です。
動作 ユーザーが操作によって入出力されたデータをViewがPresenterに要求し、PresnterがModelにデータを問い合わせし、そのデータをPresnterがViewに渡す、Viewが渡されたデータなどをユーザーに表示するいう動作になっています。
MVCPについて
MVCPとはMVCにPresenterが追加された感じになっています。
MVCではControllerからViewに対して制御などをしていましたが、ControllerからPresenterにデータを渡すことでViewの制御をPresenterが行っています。
動作 ユーザーから送られてきたデータControllerが受け取り、Modelにデータを問い合わせ行い、そのデータをContollerからPresenterに渡し、PresenterがViewのためにデータの整形を行い、Viewに整形したデータを渡し表示がされます。
学習方法について
ここまででフレームワークについて色々な情報を一気に説明しましたが、文字だけの学習ではフレームワークを覚えることは難しく、フレームワークを実際に触ってみないと深く理解することはできません。
自分自身、フレームワークに何度も触り、繰り返しやったことで覚えることできました。
ここで「勉強したいけど、何のフレームワークに触ればいいのかわからない」と思った方、学習用で適している既存フレームワークは・・・残念ながら、無いです。
フレームワークをこれから学ぼうとする人が既存のフレームワークを触っても、理解するには他に覚えることが多すぎるからです。
そこで、自分から提案するのは「今学んでいる言語でフレームワークを1から作ってみる!」です。
ここで提案しているフレームワークは、「既存並に便利なものを作るというわけではなく、簡易的なフレームワークを作る」ということです。
まさに、実践しながら学んでいく、ですね!
最後
自分自身も初めて勉強したときは、正しく理解できていたとは言えない状態でした。
(アーキテクチャパターンをMVCとして書くはずがContollerにビジネスロジックを書いてコードレビューで指摘されたこともあります。)
フレームワーク学習経験者の自分からは、以下の2点を最後のアドバイスとしてみなさんにお伝えして終わりたいと思います。
その1:アーキテクチャパターン、オブジェクト指向プログラミングを学習する際には、オブジェクト指向プログラミングを優先して学ぼう!
その2:アーキテクチャパターンも元はオブジェクト指向プログラミングに合わせて作られたパターンになっているため、最低限これらの知識を得ることでフレームワークの理解度はあがる!(と思う!)