ずっとこの記事を書こうと思っていたのですが、なかなか時間が取れませんでした。これは、その方法を説明することを目的としたものではありません。優れたスケーラブルな Web アプリケーションを開発する方法に少しでも光を当てることができれば幸いです。
私は 2 ~ 3 年開発に携わってきました。最初に作ったプログラムを振り返ると、本当に自分で書いたとは思えません。今では、sourceForge (http: //sourceforge.net/) は私のより成熟した作品の 1 つであり、コードはさまざまなクラスと関数に分割されています。データベースの構造も非常に明確です。サイトのさまざまな部分は他の部分から独立しています。
しかし、このサイトは完璧ではありません。もう一度書かなければならない場合は、オブジェクトまたは関数ライブラリを通じて HTML 層とデータベース層をより明確に区別するつもりです。
多くのマネージャーが自分のアイデアをチャートの形で表現することを好むことがわかりました。ここでもそれを提供します。このシステムの考え方は、ロジックを表層から分離することです。つまり、複雑なものはすべて「API/データ アクセス層」にプッシュダウンされます。
セキュリティチェックやアップデートなどのコードについては、HTML層に置かない方が良いです。これらの理論上のコードはAPI層に入れる必要があります。 HTML レイヤーは単純な関数呼び出しを行い、配列、オブジェクト、または私のお気に入りのデータベース結果セットを返すだけです。
この図では、HTML インターフェイスは API レイヤーを直接呼び出すか、HTML ツール ライブラリ (ポップアップ ウィンドウの生成など) を呼び出します。これらのライブラリはデータベース抽象化レイヤーを通じてデータベースを呼び出すことができます (つまり、何らかの優れたデータベースにバインドする必要はありません)。
基本ポイント
スマートシステムには以下の基本ポイントがあります:
1.データベースに依存しない
2.プレゼンテーション層の独立
3.簡単に変更できます
4.オブジェクト指向、または少なくとも関数ライブラリ呼び出しに分割する
これらは私が考えたものです。上記に加えて、他にもポイントがあるはずです。フォーラムで提案してください。
上記の点について以下で詳しく説明します。
1.データベースの独立性
設計時には、サイトにかかる負担がどれほど大きいかわからない場合があります。そのため、MS Access などの軽量データベースにバインドできないことを覚えておく必要があります。したがって、データベースを変更する場合は、あまり多くの変更を加える必要がなく、これが理想的です。
PHP を使用する場合、さまざまなデータベースの関数呼び出しが異なるため、使用するデータベースに応じて異なるコーディングを行う必要があります。この状況を変えるには、PHPLib などのデータベース抽象化レイヤーや他者が開発したライブラリを使用できます。
2.プレゼンテーション層の独立性
本当に巨大で複雑なアプリケーションを開発したい場合は、コピーアンドペーストの作業を大幅に減らすために、データベースのインターフェースについて考え始める必要があります。たとえば、携帯電話ユーザーがアクセスできるように、サイトを WAP 対応にする必要があります。アプリケーションが適切に設計されている場合は、すべてのデータベース アクセス オブジェクトを呼び出すための軽量の WAP プレゼンテーション層を作成するだけで済みます。ただし、アプリケーション システムが適切に設計されていない場合は、それを書き直す必要があるため、 HTML バージョンと WAP バージョンを同時に。
たとえば、SourceForge サイトを開発するとき、多数のユーザーがバグやタスクなどを送信しました。当初、私たちはすべて Web インターフェイスを通じて実行できるように設計しました。その後、何人かの人々からの圧力を受けて、データベースの表示に XML インターフェイスを使用することにしました。サイトのコア ロジックをプレゼンテーション層から分離することに成功しました。 SourceForge の現在のバグ追跡ツールとその他のツールは、HTML ライブラリ クラスとデータベース クラスという 2 つの異なるライブラリを使用します。データ クラスは入力値が有効かどうかを確認し、セキュリティ検出を処理する責任を負いますが、プレゼンテーション層は成功/失敗に基づいて true または false を返すだけです。 簡単にするために、この例は完全なオブジェクト モデルに基づくものではありませんが、基本クラスと、他のオブジェクトがこれらの基本クラスをどのように拡張するかを説明する必要があります。しかし、この例はいくつかの概念を確立するのに役立つと思います。
HTMLクラスの例
//データベースに接続
require("database.php");
//よく使われるHTMLヘッダー/フッター
require("html.php");
//データアクセスライブラリクラス
require( "bug_data.php");
echo site_header("ページタイトル");
echo "
バグを更新しています
";
if (bug_data_update($field1,$field2,$field3)) {
echo "
更新に失敗しました!
";
} else {
echo "
バグは正常に更新されました
";
//グローバルエラー文字列を表示します
echo $フィードバック;
}
echo site_footer();
?>
データアクセスライブラリの例
/**
* 更新データベースのバグを制御します
* データの有効性とセキュリティをチェックし、成功した場合は true を返します。
* 失敗した場合は false を返します
*
*
*/
function bug_data_update ($field1,$field2,$field3) {
//グローバル文字列、エラーを返す
global $フィードバック
//$field1 と $field2 が必要です
if (! $field1 || !$field2) {
$フィードバック="フィールド 1 とフィールド 2 は必須です";
return false
}
//ユーザーが更新する権利があることを確認します
if (!user_isadmin()) {
$フィードバック= "バグを更新するには管理者である必要があります";
return false
}
//これでバグを更新できるようになります
$result=db_query("UPDATE bug ".
"SET field2='$field2',".
"field3='$field3' ".
"WHERE");
//ステートメントが正常に実行されたかどうかを確認します
if (!$result) {
//update failed
return false
} else {
return;本当 ;
}
}
?>3.変更は簡単です
もちろん、アプリケーション全体で絶対 URL を使用することはありませんが、色、要素名、フォント、その他の可能なオプションの選択は絶対的なものではなく、構成内に含める必要があります。ファイルを作成し、それをすべてのページに含めます。サイトのスタイルも自己完結型である必要があります。そのため、すべてのページにコピーして貼り付ける必要はありません。通常、HTML を関数に入れて、必要なときに呼び出すことができます。
データベースのパスワード、データベース接続などもデータベース抽象化レイヤーに配置されます。
4.オブジェクト指向/関数型
プロセス処理をさまざまな関数呼び出しに分割できます。各呼び出しは 1 つのことを行いますが、他の関数を呼び出して結果を返すだけで済む場合もあります。
良い例は、ユーザーがログインしているかどうかをすべてのページでチェックすることです。オブジェクトや関数を使用しない場合、認証システムが変更されたときに、ライブラリ内の関数呼び出しを変更するだけでなく、各ページで変更を加える必要があります。コードを作成する前に、そのコードをサイト内で複数回使用する場合は、ライブラリに移動する必要があることを考えてください。 何か追加することはありますか?
思いつかなかった点もあるかと思いますが、ご意見をお願いします。特に、大規模で複雑なアプリケーションを作成しましたが、再度作成する必要がある場合、どのようなシステムを構築するのか、どのような変更を加えるのかを知りたいと思っています。
上記では、ソフトウェア アーキテクチャの内容も含めて、PHP におけるソフトウェア アーキテクチャとスマート アーキテクチャの使用方法を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。