# 13.1 プロジェクトのプラン
何をするにしてもプランを作成することは大切です。我々がブログシステムを開発する前にも、プロジェクトのプランを作ることは同じように重要です。ディレクトリ構造をどのように設定するか、プロジェクト全体のプロセス図をどのように理解するか、アプリケーションの実行プロセスを我々が理解した時、以降のコーディングの設計についても相対的に容易になるはずです。
## gopath及びプロジェクトの設定
指定したgopathがファイルシステムの普通のディレクトリ名だったとしましょう。当然、自由に一つのディレクトリ名を設定することができます。次にこのパスをGOPATHに追加します。GOPATHは複数のディレクトリを含んでもよいと前にご紹介しました：windowシステムでは環境変数を設定します；linux/MacOSシステムではターミナルに`export gopath=/home/astaxie/gopath`コマンドを入力するだけです。しかし、gopathというソースディレクトリには３つのディレクトリpkg、bin、srcがあることを保証しなければなりません。作成した新しいプロジェクトのソースコードはsrcディレクトリの下に置きます。現在暫定的に我々のブログディレクトリをbeeblogと呼ぶことにしましょう。下はwindow下での環境変数とディレクトリ構造のスクリーンショットです：

![](images/13.1.gopath.png?raw=true)

図13.1 環境変数GOPATHの設定

![](images/13.1.gopath2.png?raw=true)

図13.2 ワーキングディレクトリは$gopath/srcの下にあります

## アプリケーションプログラムのプロセス図
ブログシステムはモデル-ビュー-コントローラという設計モードにもとづいています。MVCはアプリケーションプログラムのロジック層とプレゼンテーション層を分離する構造方式です。実践の中で、プレゼンテーション層からGoの中で分離されているので、あなたのウェブページにはほんの少しのスクリプトを含めるだけでかまいません。

- モデル（Model）はデータ構造を表します。通常ではモデルクラスはデータベースのデータを取り出し、挿入し、更新するといった機能を含みます。
- ビュー（View）はユーザの情報を表示する構造およびスタイルです。ひとつのビューは通常一つのウェブページとなります。しかし、Goにおいては、一つのビューはページのいち部分であってもかまいません。例えば、ヘッダ、フッタ等です。これはRSSページや他の種類の"ページ"であってもかまいません。Goが実装するtemplateパッケージはすでに非常によくView層での一部の機能を実現しています。
- コントローラ（Controller）はモデル、ビュー及びその他の任意のHTTPリクエストが必要としているリソース間の仲介を処理し、ウェブページを生成します。

下の図はプロジェクトの設計においてフレームワークのデータのがどのようにシステム全体を流れているか表しています:

![](images/13.1.flow.png?raw=true)

図13.3 フレームワークのデータフロー

1. main.goはアプリケーションの入り口です。ブログを実行する上で必要となる基本的なリソースを初期化し、情報を設定し、ポートを監視します。
2. ルーティング機能はHTTPリクエストを検査し、URLおよびmethodによって誰(コントローラ層)がリクエストのリソースへのリダイレクトを処理するかを決定します。
3. もしキャッシュファイルが存在した場合、通常のプロセスを迂回して実行し、ブラウザに直接送信されます。
4. セキュリティチェック：アプリケーションプログラムのコントローラがコールされる前にHTTPリクエストと任意のユーザが送信したデータがフィルタにかけられます。
5. コントローラがモデル、コアライブラリ、補助関数および特定のリクエストに必要となるその他のリソースにおける任意の処理をロードします。コントローラは主に業務ロジックの処理に責任を負います。
6. ビュー層において出力された内容はWebブラウザのコンテンツに送信されます。もしキャッシュが起動されていた場合、ビューはまずキャッシュされ、以降の通常のリクエストにおいて利用されます。

## ディレクトリ構造
上のアプリケーションプログラムのプロセス設計にもとづいて、ブログのディレクトリ構造の設計は以下のようになります：

	|——main.go         入り口ファイル
	|——conf            設定ファイルと処理モジュール
	|——controllers     コントローラの入り口
	|——models          データベースの処理モジュール
	|——utils           補助関数ライブラリ
	|——static          静的ファイルディレクトリ
    |——views           ビューライブラリ

## フレームワーク設計
ブログの迅速な作成を実現するため、上のプロセス設計に従って最小化されたフレームワークを開発します。フレームワークにはルーティング機能、RESTをサポートしたコントローラ、自動化とテンプレートの適用、ログシステム、設定管理等が含まれます。

## 概要
この節ではブログシステムにおいてGOPATHを設定するところからディレクトリの作成といった基礎情報までをご紹介しました。フレームワークの構造がMVCモードを採用することや、ブログシステムのデータフローの実行プロセスについても簡単にご紹介しました。最後にこれらのプロセスを通じてブログシステムのディレクトリ構造を設計しました。ここまでで、フレームワークの基本的な作成が完了しました。以降のいくつかの節ではひとつひとつ実装していきます。
## links
   * [目次](<preface.md>)
   * 前へ: [ブログシステムの作成](<13.0.md>)
   * 次へ: [カスタム定義のルータの設計](<13.2.md>)
