web-dev-qa-db-ja.com

シンプルなウェブサイトをプログラミングする際の優れた(きちんとした)アーキテクチャとは何ですか。連絡帳?

簡単なウェブサイトを作成するとき連絡先を追加、削除、更新できる連絡先帳、index.phpユーザーがログインしていない場合にパスワードの入力を要求され、正しいパスワードを入力すると、セッションが割り当てられ、連絡先と特定のことができるファイル。

2つのファイルがあります。

  1. 最初 (contacts.php)は、表示されるHTMLコード用です。 HTMLコードの上に2番目のファイルを含めて、クラスを作成します。
  2. 二番目 (contacts_class.php)には、追加、削除、更新のためのすべてのメソッドが含まれています。

大丈夫だと思いますが、大きなプロジェクトを実装する場合、どうすればいいですか?すべてのページのフォルダーを作成し、その中にファイルを配置する必要がありますか(上記のように、HTMLとクラス)、どのように実行する必要がありますか?他のすべてのプログラマーが完全に理解できる大規模なプロジェクトを構築するための優れた、きちんとしたアーキテクチャとは何ですか

28
good_morning

あなたは非常に興味深く、根本的な質問をしました。大規模なプロジェクトアーキテクチャとフォルダ構造の編成(アーキテクチャの二次的なもの)に関する質問。

今日、CMSフレームワークアーキテクチャを構築するための最も一般的なアプローチは、MVCパターンの使用です。独自のMVCフレームワークの構築に関する優れた記事がいくつかあります。そのうちの1つは PHPでMVCフレームワークを構築する です。

MVCは、モデル、ビュー、コントローラーの略です。これらのアプローチは、MVC、HMVC、MVPなど、好きなように呼ぶことができます。本質は、システムの個々のコンポーネントを分離することです。 「コントローラー」は「モデル」からデータを取得し、「ビュー」に送信して、最終的なHTMLをレンダリングします。 contacts.phpには「V」、contacts_class.phpには「MC」がすでに実装されています。これで、モデルとコントローラーからビューが分離されました。これで、他のパーツをそのままにして、「ビュー」を簡単に変更できます。

MVC、MVP、またはその他の「MV」パターンを盲目的にフォローすることはお勧めしません。それは適切さ、効能、味の問題です。

一般的な動的Webサイトアプリケーションには、次のようなコンポーネントが含まれる場合があります。

  • エントリポイント、たとえばindex.php
  • ヘルパーライブラリ/クラス
  • リクエストルーター
  • モジュール、コンポーネント、またはコントローラー
  • テンプレートエンジンまたは単一のビュー

実際のWebアプリケーションには、イベントハンドラー、イベントディスパッチャー、フックなどの他のコンポーネントが含まれる場合がありますが、これらは実際にはニュアンスです。まあ、私がそれを提示したい方法でそれを提示させてください:

The operation routine diagram

次のような共通フレームワーク操作ルーチン:

  1. ブラウザのリクエストは、エントリポイントの実行可能ファイル/スクリプト(index.php)に直接送信されます。
  2. エントリポイントスクリプトは、ヘルパーライブラリ、クラスを読み込み、プログラミング環境の初期化を実行します。
  3. URLはリクエストルーターインスタンスに渡されます。このステップは、ステップ2の一部にすることができます。
  4. 要求ルーターはURLを解析し、操作を特定のコンポーネント、モジュール、またはコントローラーにディスパッチします。
  5. コンポーネント(またはコントローラー)はルーティングされた要求を処理し、レンダリングするビューにデータを送信します。

対応するプロジェクトフォルダ構造を図に示します。

他のフレームワークの実装方法を調査することをお勧めします。最初に推奨されるCMS /フレームワークは、CodeIgniter、OpenCart、Joomla 1.5、Tango CMSです。

67
ezpresso

どのような質問をするか、どのようなソリューションを利用できるかを理解するには、Martin Fowlerによる Patterns of Enterprise Application Architecture の本をお勧めします。 彼のWebサイトを読む で、本の内容を理解できます。

この本は(ITランドで)かなり古くなっていますが、多くの原則がまだ有効であるか、学習する必要があることに注意してください。 (それは意味がありましたか?)

(ソフトウェア)アーキテクチャは非常に幅広いテーマであり、特効薬を期待するのではなく、時間とお金がなくなるまで、常により多くの質問と疑問を抱き、これまでのところ最高のソリューションを使用する必要があります。

2
Erno

まず、よく開発されたプロジェクトを見てみましょう。 Wordpressはコード構造の非常にきちんとした例です。理解するのは簡単ですが、多くの「プラグ」を提供します。したがって、wordpressは「差し込む」。

次に、アーキテクチャを確認する非常に簡単な方法は、単体テストを作成することです。たとえば、「カードデッキ」クラスに「shuffle()」メソッドがある場合、事前定義されたサイズのカードデッキ(つまり、5枚のカード1、2、3、4、5)を作成し、shuffleを呼び出して、簡単な方法で結果(ID 1,4,2,5,3)

プロジェクトクラス全体をインスタンス化せずにそれを実行できる必要があり、テストは非常にクリーンで読みやすくなければなりません。

それができない場合は、簡単な方法が得られるまで、クラス間にレイヤーを追加し、それらを再構築する必要があります。

次に、プロジェクトのすべてのコアクラスに対してこの手順を繰り返します。

最後に重要なことですが、優れたアーキテクチャは、それほどコアではないクラスでは「怠惰」になる可能性があります(経済の問題です。非常によく設計されたものは、現実の世界ではコストがかかりすぎます)。

2
daitangio

大規模なプロジェクトに適したアーキテクチャはMVC(モデルビューコントローラー)です: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

ただし、他のプログラマがそれを理解するかどうかは、まったく別の問題です。 MVCは複雑になる可能性があり、小規模なプロジェクトには過剰な場合があります。これの利点の1つは、簡単にスケーリングできることです。

1
Chris Laplante

私があなたの質問を正しく理解している場合は、プロジェクトのフォルダー構造について話しているのであって、本質的にアーキテクチャーについて話しているのではありません。私の理解が正しければ、読んでください。それ以外の場合は、質問を編集するかコメントを入力してください。それに応じて回答を編集します。

アプリケーションを設計するとき、(何を?そして誰に?)のようないくつかの基本的な質問に答えた後、コンポーネントを特定し、機能性\責任に基づいてそれらを分類する必要があります。私が知っている主な方法は2つあります。コンポーネントは、それらが処理するユースケース(ログイン、検索など)に基づいて分類したり、リソース(オブジェクト..)に基づいて分類したりできます。最初の方法はアクティビティ指向と呼ばれ、2番目の方法はリソース指向と呼ばれます。伝統的にほとんどのアプリケーションはアクティビティに基づいてコンポーネントを分類します(デザイナーがそれを見つけたので、問題ドメインからソリューションドメインに移行するのは簡単です)。

コンポーネントの分類が特定されたら、階層に基づいて分類を特定する必要があります。典型的なWebアプリケーションには、ビュー層、モデル層、コントローラー層(MVC)があります。もちろん、もっと複雑なアプリケーションもあるでしょう。 (実際のアプリケーションのほとんどは、この単純なものよりも複雑です)。

これら2つの分類法を特定した後、各階層を特定する最上位のフォルダーを作成します。 (UI、コントローラー、サービス、ユーティリティなど)。各高レベルのフォルダーの下に、機能またはリソース(Project-/ EditProject-/ SearchProjectなど)に基づいて子フォルダーを作成します。理想的には、機能分類はマルチレベルになります。

1

良いアーキテクチャと悪いアーキテクチャがありますが、特効薬はありません。アーキテクチャは、現在および高度に可能性のある将来の要件に適合する必要があります。

適切なガイドラインは、アプリケーションの各部分が他の部分への影響を最小限に抑えて変更できること、および各部分が完全なカバレッジユニットと統合テストを自動化していることを確認することです。

1
Danny Varod

大規模なプロジェクトを構築する方法がわからない場合は、いくつかの優れたPHP Frameworks。これらのうち、Web開発でうまく機能するモデル、ビュー、コントローラー、MVCパターンを実装します。これらはすべて、かなり軽量で学習しやすいものです。

これらのフレームワークの1つを理解すると、特定のプロジェクト用に独自の構造を構築できるようになるかもしれませんが、もしあなたが始めたばかりなら、私は他の人の仕事とホイールの再発明に立ち向かうでしょう。

1
Bryan Waters

アーキテクチャとは、長期的に開発を継続できるようにすることです。大規模なアプリケーションの場合、これには、複数の人が同時に作業できるように物事を独立させることと、プロジェクトが俊敏性を維持できるように重複(DRY)を回避することの間のトレードオフが含まれます。 PHPプロジェクトは、物事を独立させることに重点を置く傾向があり、大量の重複があります。

他の極端な位置の良い感じを得るには、 Seaside を見てください。

1

MVCは最も一般的に使用されるアーキテクチャであり、ほとんどの問題を解決することが証明されています。優れたアーキテクチャには、次の機能(およびその他の機能)があります。

  1. 単体テストが可能
  2. 関心事の分離
  3. 複数の人々が衝突することなくそれに取り組むことができます。
  4. あまり問題なく拡張できます
  5. スケーラブルにすることができます。大きなプロジェクトになると、スケーラビリティが大きな関心事になります。チェックアウト Kohana フレームワーク。よく書かれていて、非常によくスケーリングできます。
0
Shameer

量産コードを書く前に2週間(夜:)かかり、この本を読んでください。それは、プログラミングアーキテクチャ、慣習、およびパッケージ化について、長い間あなたの考えを変えます。

Prentice Hallによるアジャイル原則、パターン、およびプラクティスC#

例はC#にありますが、読みやすいのは正しいコード構文を記述する方法ではなく、プログラマーとして考える方法です。

私はあなたがあなたのPCのあなたの最もアクセスしやすい場所にそれを保存することを約束します、そしてあなたはあなたがそれを知らなくてもプログラミングしていることに驚かれることでしょう。それはあなたの考えを変えるでしょう。

0
Vlad