このサイトについて

11月28日(木),プログラミングの勉強会を開催します。エクセルの操作やスクレイピングをきっかけに学ぶ自動化のひみつ。

みんなのPython Webアプリ編 - 効率的なWebアプリケーション開発とは

みんなのPython Webアプリ編 - 効率的なWebアプリケーション開発とは

Python,プログラミングに興味のある方のためのFacebookグループ。Python関連グループとしてナンバーワン。

効率的なWebアプリケーション開発とは

これまでの章で、Webアプリケーション開発に必要な技術のうち基本的な部分を解説しました。この章では、より高度なWebアプリケーションを開発する上で、必要になる技術や手法について解説します。

Webアプリケーションの基本は文字列処理です。Webアプリケーションのプログラムでは、文字列の追加や置換、データ型の変換といった文字列処理の手法をたくさん使います。

アプリケーションにとって重要な要素である入力は、WebアプリケーションではWebブラウザなどから送られてくるリクエスト上にクエリ文字列として渡されます。クエリ文字列を分割してデータを取り出し、アプリケーションと本体となるプログラムの内部で処理をします。

また、Webアプリケーションの出力でもHTMLという文字列を使います。Webアプリケーションでは、処理の結果をHTMLを使って表示します。Webアプリケーションの内部では、処理の結果としてユーザに見せるHTMLを文字列として組み立て、レスポンスとして返します。

Webアプリケーションでデータを保存するためにはデータベースをよく利用します。データベースからデータを取り出したりデータを保存するためには、SQLを使ってデータベースと通信を行います。このSQLも文字列の一種です。取り出したいデータの条件や、保存したいデータをSQL文字列として組み立て、データベースに対して指示を与えます。

このように、Webアプリケーションでは多くの部分で文字列処理を行います。文字をつぎはぎする処理を積み重ねてゆくことで、原理的には、どんなに複雑なWebアプリケーションでも作り上げることができるはずです。

アプリケーションと開発効率

プログラムとは、処理を手順に沿って並べた文字列にすぎません。これは、ファイルの行数を数えるような単純なプログラムであっても、飛行機の運航を管理するような複雑なプログラムであっても同じことです。すべてのプログラムは、あらかじめ決められた手続きを、プログラムに書かれた手順に沿って実行しているにすぎません。

Webアプリケーションの基本はテキスト処理です。Webアプリケーションはとてもシンプルな原理で動いているため、単純な処理の積み重ねであらゆることができるように思えてきます。

Webアプリケーションで実行する処理の多くは文字列の切り貼りです。出力に使うHTMLもデータベースとの通信に使うSQLも、全部1つのプログラムの中に埋め込んでしまう方が便利に思えます。事実、初期のWebアプリケーションのほとんどはそのような素朴な手法で作られていました。単純な処理をするWebアプリケーションでは、そのような素朴な手法がうまく機能しました。Pythonのようなスクリプト言語には、文字列を扱うための強力な機能が多く搭載されています。また、データベースとの接続など、豊富な機能を提供する標準モジュールを使えば、とても手軽にWebアプリケーションを作ることができます。

素朴な手法の問題点

Webアプリケーションのプログラムで必要となる文字列の切り貼りを、その場で順番に行う。これをここでは素朴な手法という言葉で呼びましょう。これまでのサンプルプログラムでは、このような手法を使ってプログラムを作ってきました。最初に作った、単純な出力だけを行うWebアプリケーションでは特に問題があるようには見えません。

サンプルプログラムの後半になると、だんだんとプログラムの見通しが悪くなってきています。UIとなるフォームをWebアプリケーションから出力したり、データベースとの通信を行い始めると、Pythonのコード以外の文字列がたくさんプログラムに入り込んでしまっています。

このようなプログラムではプログラムの変更をするとき、変更すべき場所を探し出すのが大変になります。Webアプリケーションに機能を追加したいとき、不具合を直したいときは、HTMLやSQLのような文字列をかき分けて、該当するPythonのコードをいちいち見つけ出さなければなりません。

また、コードだけが修正されるとは限りません。今の状態でさえ、いろいろな種類の文字列が交じってしまっています。Webアプリケーションをもっと凝ったデザインするときや、専門のデザイナーにデザインを頼むときに、どのようなことが起こるか想像してみるとよいでしょう。

Webアプリケーションの歴史の初めのころは、素朴な手法を使って開発が行われていました。しかし、このような手法も程なく壁に行き当たります。Webアプリケーションに対する要求が大きくなり、より複雑な機能を持ったWebアプリケーションを作る必要が出てきたのです。そうなると、不具合の修正や機能追加がだんだんと行いづらくなり、うまく開発が進まなくなってきたのです。

モジュール化、クラス化による開発の効

素朴な手法を使ったプログラミングでは、文字列処理などを積み重ねていくことでプログラミングを行います。これはちょうど、レンガを積み上げて建築をするようなものです。レンガを積み上げていけば、小屋や小さな家くらいは簡単に作れるかもしれません。しかし、巨大なビルを作るには、レンガを積むような手法を使うのではなく、もっと効率の良い、他の手法が必要です。

Webアプリケーションに限らず、プログラムには多くの「似通った処理」があります。似通った処理の性質をよく分析して、処理をまとめることによって、似通った処理を繰り返しコードとして書かなくてよいことになります。Pythonでは、そのような処理をモジュールやクラスとしてまとめることが多いはずです。

Webアプリケーションで扱うテキストはたいてい一定のルールを持っています。たとえば、Webアプリケーションの出力となるレスポンスにはヘッダと本文という2つの部分があります。ヘッダも本文もどちらも文字列です。本文の文字列は、どのような結果をユーザに見せたいかによって大きく変化します。ヘッダには表面に現れないいろいろな情報を記載しますが、記載する情報の多くはおのずと決まるような値が多いため、プログラムで自動的に生成することができます。

このような性質に注目して、Responseという名前のクラスを作りました。レスポンスを共通して扱うクラスを作ったことで、プログラムがよりシンプルになりました。Webアプリケーションで実行する共通した処理をクラスとしてまとめたことで、プログラムに重複部分がなくなり、プログラム全体がスッキリと短くなったわけです。

レスポンスだけでなく、データベースと通信を行うときに利用するSQLもルールを持った文字列です。SQL文字列を作るときのルールをうまく分析し、クラスにすることができればどうなるでしょうか。プログラムに埋め込まれたSQL文字列がきれいになくなり、プログラムはさらにスッキリするはずです。実際、近年のWebアプリケーションの開発ではO/Rマッパーといわれるクラスの一種が活用されています。O/Rマッパーについては、この章でのちほど詳しく解説します。

役割分担による開発の効率化

Webアプリケーションの開発の中で最もやっかいなのがHTMLに相当する文字列です。HTMLには、数値や文字列といった情報だけでなく、テキストの大きさや位置、テキストの意味などを決める情報をタグ(エレメント)という形で記述します。このため、一般的なテキストに比べてHTMLは長くなりがちです。横幅が長くなるのも、Pythonのプログラムとしてはあまり嬉しくありません。

このような長いテキストを埋め込むと、プログラムはすぐにHTMLで埋め尽くされてしまいます。そのため、Webアプリケーションの出力として使うHTMLだけを外部に分離しておく、という手法がとられ始めました。プログラムとは別のファイルにHTML文字列を書いておき、必要に応じて読み込んで使うのです。このような仕組みはテンプレートエンジンと呼ばれています。高機能なテンプレートエンジンでは、単にHTMLファイルを読み込むだけでなく、内部にプログラムコードのようなものを埋め込めるものもあります。

HTML文字列をプログラムから外部に追い出すことによって得られる恩恵はいくつかあります。まず、長くなりがちなHTMLがプログラム上になくなることによって、プログラムがスッキリすることが一点。もう一点は、役割分担が明確になる、という点です。

たとえば、処理の結果として10個の数値を表示するWebアプリケーションを作るとします。10個の数値の表示方法はいろいろあります。横に並べるか、縦に並べるか。文字の大きさはどうするか。Webアプリケーションを作っている過程で、いろいろなパターンを試し、最も見やすい方法で表示することになるでしょう。

もしHTMLがプログラムに埋め込まれていたら、表示方法を変えるたびにプログラムの修正が必要になります。毎回、プログラムに埋め込まれているHTMLを修正するわけです。一方、10個の数字を作るという、Webアプリケーションの根本とも言える処理の部分は変更する必要がありません。一方、Webアプリケーションの出力として使うHTMLを分離しておけば、表示方法を変更したくなったら分離したHTMLだけを修正すればよくなります。

Webアプリケーションにはデータを作ったり処理する機能とデータを表示する機能という2つの大きな機能があります。このうちデータを表示する機能には頻繁に変更が加わります。頻繁に変更が加わる処理は分離しておいた方が効率的に開発ができます。Webアプリケーションの出力として使うHTMLを分離しておく、ということには、このような効能もあるのです。

近年のWebアプリケーションの開発では、このようにWebアプリケーションの処理内容を明確に分けて、役割分担をする、という手法が良く取られます。データを作ったり処理する機能はさらに2つに分けられることもあります。1つは、データベースとのやりとりが必要な部分です。もう1つは、リクエストを受け取ったり、データを加工する部分です。データベースに関わる部分をM(モデル)、表示に関わる部分はV(ビュー)、リクエストを受け取ったりデータを加工する部分をC(コントローラ)と呼んで分類することがあります。

素朴な手法を使っていたかつては、Webアプリケーションのすべての機能が数個のソースコードに雑然と並んでいました。近年のWebアプリケーションの開発では、プログラムの部品化を進め、役割分担を明確にするような手法がよく採用されます。そのような手法を使うことで、高度な機能を持ったWebアプリケーションをより素早く手軽に開発できるようになります。

この章では、近年よく利用される開発手法を具体的に見ていきながら、より高度なWebアプリケーションを効率よく開発するための方法について解説します。

みんなのブロックチェーン

ブロックチェーンの入門書を書きました。暗号やハッシュなどを含め,基礎からブロックチェーンの仕組みを学べる書籍です。いろんな方に「新しい技術を学ぶことの楽しさ」を感じ取ってくれたら著者として嬉しいです:-)。お金は技術的にどのように定義されるのか。

2014-09-03 15:00