独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【フレームワーク】フレームワーク入門

ここではプログラミングにおけるフレームワークについて解説していきます。

一般的なフレームワーク

フレームワークという言葉は、プログラミング用語ではなく、様々な業界で用いられている用語です。
フレームワークは日本語では枠組みという意味をもちますが、多くの場合は「思考の枠組み」として用いられます。

よく知られているフレームワークの例としてはPCDAサイクルがあります。
PDCAは、Plan, Do, Check, Actの頭文字をとったものです。
PDCAサイクルは業務改善でよく用いられているフレームワークです。
特定の業務について、今よりも効率を上げて業務の質を上げたいとします。
その時、何の情報もない状態で改善策を考えるよりも、事前に計画を立てて計画に従って作業を行い、どこに問題があるのかを振り返りながら改善を進める方が改善が上手く可能性が高いです。
業務改善を効率よく行うために、PDCAサイクルというフレームワークを使用します。

他にも、経営やマーケティングの分野でも多くのフレームワークがあります。
経営やマーケティングで使用されるフレームワークには、SWOT分析、3P分析、4C分析などがあります。
ゼロから戦略や対策を考えるよりも、フレームワークという枠組みにそって考えることで、有効な戦略や対策を立てやすくなります。

プログラミングとは直接の関係はありませんが、フレームワークという言葉の意味として理解しておきましょう。

プログラミングにおけるフレームワーク

プログラミングにおけるフレームワークも、枠組みという意味では先に説明したものと同じです。
プログラミングの場合は主に開発の効率化を目的としてフレームワークを使用します。
予め作成されている枠組みに当てはめて開発をすることで、少ないコード量で開発を行うことができ、結果として開発効率が上がります。

フレームワークのメリット

開発効率が上がる

フレームワークを使うことの最大のメリットは開発効率が上がることでしょう。
どのフレームワークも、ほとんどの場合、フレームワークを使わずに開発するよりも少ないコード量でプログラムを書くことが可能になります。
対象のフレームワークを初めて使う場合は、覚えることが多いため、短期的にみると開発効率は落ちるかもしれません。
しかし、慣れてくれば開発規模が大きくなるほど開発効率が上がります。

品質を統一しやすくなる

フレームワークを導入すると、命名規則やコードの書き方に縛りが出てきます。
これは自由度が下がるという点ではデメリットと捉えることもできますが、開発者の人数が増えてもコードの書き方にばらつきが出にくいという点においては、品質を統一できる点においてメリットになります。

フレームワークのデメリット

学習コストが増える

フレームワークを使う場合、元となるプログラミング言語の知識と、プラスでフレームワークの知識が必要になります。
一度知識を身につけてしまえば効率よく開発ができますが、初めて使うフレームワークの場合、そのフレームワークの特徴やルールを覚える必要があり、学習コストがかかります。

プログラミングの知識がつきにくい

個人的にはフレームワークを使用することのデメリットはこれが大きいかもしれません。
フレームワークは書き方を覚えてしまえば効率よく開発できるのがメリットですが、逆に言うとルールさえ覚えてしまえばフレームワークの仕組みやプログラミング言語の深い知識がなくても開発ができてしまいます。
初心者のうちからフレームワークを使った開発ばかりをしていると、フレームワークの仕組みやメリットを知らないままでプログラマーとしてのスキルが上がらない可能性があります。
フレームワークは非常に便利で強力なツールですが、同時に仕組みなども学習する習慣を身に付けると良いでしょう。

様々なフレームワーク

ここでは具体的なフレームワークをいくつか紹介します。

CSSフレームワーク

  • Bootstrap
    classの指定だけで簡単に見た目の整ったレイアウトを作ることができるフレームワークです。

JavaScript

  • iQuery
  • Vue.js

Javaフレームワーク

PHPフレームワーク

Rubyフレームワーク

他にも言語ごとに様々なフレームワークが存在します。

代表的なフレームワークの機能

ここでは特定のフレームワークに依存しない、多くのフレームワークでサポートされる機能をいくつか紹介します。

DI

Dependency Injectionの略です。
直訳すると依存性の注入という意味です。
オブジェクト指向をサポートしているプログラミング言語Java,PHPなど)のフレームワークで実装されていることの多い機能です。
多くのオブジェクト指向の言語では、クラスを元にnewというキーワードを使ってオブジェクト(インスタンス)を生成します。
しかし、ソースコード上に直接newを使ってオブジェクトを作成するコードを書くと、クラス間の依存関係が強くなり、プログラムの柔軟性は低下します。
そこで、プログラムの柔軟性を高めるため、ソースコード上に直接newを書かずに、設定ファイルやアノテーションを用いることで変数に自動的にオブジェクトを注入する機能がDIです。
DIの機能を使うことで、クラス間の依存関係を弱くし、プログラムの柔軟性を高めることができます。

AOP

Aspect Oriented Programmingの略。
直訳するかアスペクト指向プログラミングです。
辞書的に説明すれば、横断的な機能を抜き出してプログラムに適用する手法。
例えば、メソッド(関数)を呼び出す前と呼び出した後にログの出力をしたいとします。
これを普通に実現しようとした場合、メソッドの呼び出しの前後にログを出力する処理を入れ込む必要があります。
プログラムの規模が大きくなるとそれなりに大変な作業です。
このような処理は、オブジェクト指向を活用してどれだけ上手くまとめても解決できません。
ロギング(ログの出力)意外にも、エラーの処理、トランザクション処理も同じ問題があります。
これを解決してくれるのがAOPです。

バリデーション

バリデーションは妥当性チェックのことで、主に画面で入力された値のチェックなどで使用します。
多くのシステムでは、IDやパスワード、名前や数値など画面上から様々な値を入力します。
ユーザーはどんな値を入力するかわからないので、入力値をチェックする必要があります。
例えば、
・ネールアドレスの入力欄なのにメールアドレスの形式になっていない
・電話番号の入力で桁数が合わない
・数値の入力欄に文字が入力されている
・入って欲しくない記号の文字が入っている
など、入力時に不正な値が入る可能性はたくさんあります。
これらをチェックする処理を手動で書こうとすると、入力値を受け取った後、多くの条件分岐を書かなくてはいけません。
そのような入力チェック処理を書かずとも、簡単な設定だけで入力チェックを行ってくれるのがバリデーションです。
Webアプリケーション用のフレームワークで実装されていることが多いです。

マッピング

マッピングとは紐付けの意味です。
例えばWebアプリケーションに特化したフレームワークの場合、URLマッピングという機能を持ったフレームワークが多いです。
URLマッピングとは、「このURLでアクセスされた時にこのメソッドが呼ばれる」という紐付けをする機能です。
フレームワークによってマッピングの方法は変わりますが、アノテーションを使ってマッピングしたり、メソッドの命名規則マッピングしたりします。

他にもO/Rマッピングなどがあります。
O/RマッピングはObject RDB マッピングです。
現在多くのシステムではデータを管理するのにRDB(リレーショナルデータベース)を使用します。
RDBでは表形式でデータを管理し、レコードという単位でデータを保存します。
一方、オブジェクト指向型のプログラミング言語ではオブジェクトという単位でデータを扱います。
このオブジェクトとRDBのデータの保持の仕方に差異があります。
インピーダンスミスマッチ)
この差異をうまく紐づけして、オブジェクト⇒RDBRDB⇒オブジェクト間を自動でデータのセット、取得をしてくれるのがO/Rマッピングです。

また、画面に入力されたデータを自動でオブジェクトにセットする仕組みが用意されたフレームワークもあります。

画面・オブジェクト間、RDB・オブジェクト間など、異なる要素の値の取得やセットを手動で行わなくても裏で自動的に実行してくれる仕組みがマッピングの機能です。

ソースコードの自動生成

フレームワークによっては設定からソースコードを自動的に生成してくれるような仕組みもあります。
例えば、プログラムからDBを操作する際にテーブルごとにDAOやEntityと呼ばれるクラスを作成することがあります。
これらのファイルを手動で作成するのは手間がかかりますが、フレームワークによってはコマンド一つでテーブルの構造から自動的にクラスを作成したりします。
逆にEntityの構造からテーブルを自動で作成できるものもあります。

デザインパターンとかリフレクションとか

システム開発フレームワークを利用する利点の1つは、中でどういう仕組みが働いているのかを知らなくても、ある程度書き方さえ覚えてしまえばプログラムが書けてしまう事にあります。
しかし、書き方を知っていても、中で何が起きているのかを知らないと、エラーが発生したときに対処することが難しくなります。
何より、既存のフレームワークを拡張して新しいフレームワークを作成といった応用ができません。
フレームワークがどのように作られていて、中で何が起きているかを知ることで、応用力が身に付くと言えます。

オブジェクト指向言語ではデザインパターンと呼ばれる設計に対する概念があります。
フレームワークを使って開発をしているとデザインパターンを意識する場面は少ないですが、フレームワーク自体の中身では様々なデザインパターンが使われていることが多いです。
デザインパターンを学習しても実際にそのようなクラス設計を現場で使う機会は少ないかもしれません。
しかし、デザインパターンを学習することで、フレームワークの中身でどのようなクラス構造になっているかがイメージしやすくなり、フレームワークの理解を助けます。

もう一つ、フレームワークを知るうえで欠かせない機能としてリフレクションがあります。
リフレクションとは、辞書的に説明すればプログラムでプログラムを動的に操作する機能のこと。
具体的には、文字列で受け取った値でインスタンスを作成したりメソッドを呼び出したりできる機能です。
例えば、Javaの場合だとインスタンスを作成する場合、

new A();

のようにクラス名を直接書き込む必要がありますが、 リフレクションを使うと

Class.newInstance("A");

のように書くことができます。
リフレクションの書き方の場合は文字列で受け取っているので、メソッドの引数などにすることで、動的に作成するインスタンスを変更できるようになります。
リフレクションを使うとこのように、ソースコードにハードコーディングしなくてもインスタンスの作成やメソッドの呼び出しが可能になります。
コードをあまり書かなくてもいい感じに動いてくれるフレームワークの内部ではこのような仕組みが働いているのです。

フレームワークがどのような技術で作られているのかを知ることで、内部の動きをイメージしやすくなり、エラーやトラブルが起きた時にも対処がしやすくなります。

何を学習すべきか

フレームワークプログラミング言語ごとにたくさんの種類があります。
また、どのフレームワークを使用するかはプロジェクトごとによって異なります。
そして流行のフレームワークは時代によって変わってきます。
そのため、明確にこれを習得すべきと言えるフレームワークはありません。

しかし、先に説明したようにどのフレームワークでも提供されている機能はある程度共通しています。
そのため、何か1つのフレームワークを身に付けることで、2つ目以降のフレームワークの習得は容易になってきます。