システム
ずっとこの記事を書こうと思っていたのですが、なかなか時間がありませんでした。これは、その方法を説明することを目的としたものではありません。優れたスケーラブルな 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ヘッダー/フッター
//データアクセスライブラリclass
require ("bug_data.php");
echo site_header("ページタイトル");
echo "
バグを更新中
"; ) {
echo "
アップデートに失敗しました!
"; else {
echo "
バグは正常に更新されました
";えー() ;
?>
データアクセスライブラリの例
/**
* 更新データベースのバグを制御します
* データの有効性とセキュリティをチェックし、成功した場合は true を返します。
* 失敗した場合は false を返します
*
*
*/
function bug_data_update ($field1,$field2,$field3) {
//グローバル文字列、エラーを返す
global $フィードバック;
//$field1 と $field2 が必要です
if (!$field1 || !$field2) {
$フィードバック="フィールド 1 とフィールド 2 が必要です" ;
return false
}
//ユーザーが更新する権利があることを確認します
if (!user_isadmin()) {
$フィードバック="バグを更新するには管理者である必要があります";
/ /バグを更新できるようになりました
$result=db_query("UPDATE bug ".
"SET field2='$field2',".
"field3='$field3' ".
"WHERE id=' $field1'" );
//ステートメントが正常に実行されたかどうかを確認します
if (!$result) {
//更新に失敗しました
return false;
} else {
return true;
}
}
? >
3 .変更は簡単です
もちろん、アプリケーション全体で絶対 URL を使用することはありませんが、色、要素名、フォント、その他の可能なオプションの選択は絶対的なものではなく、構成内に含める必要があります。ファイルを作成し、それをすべてのページに含めます。サイトのスタイルも自己完結型である必要があります。そのため、すべてのページにコピーして貼り付ける必要はありません。通常、必要なときに呼び出せる関数に HTML を入れます。
データベースパスワード、データベース接続などについても、データベース抽象化レイヤーに配置されます。
4.オブジェクト指向/関数型
プロセス処理をさまざまな関数呼び出しに分割できます。各呼び出しは 1 つのことを行いますが、他の関数を呼び出して結果を返すだけで済む場合もあります。
良い例は、ユーザーがログインしているかどうかをすべてのページでチェックインすることです。オブジェクトや関数を使用しない場合、認証システムが変更されると、ライブラリ内の関数呼び出しを変更するだけでなく、すべてのページで変更を加える必要があります。コードを作成する前に、そのコードをサイト内で複数回使用する場合は、ライブラリに移動する必要があることを考えてください。 何か追加することはありますか?
思いつかなかった点もあるかと思いますが、ご意見をお願いします。特に、大規模で複雑なアプリケーションを作成しましたが、再度作成する必要がある場合、どのようなシステムを構築するのか、どのような変更を加えるのかを知りたいと思っています。