連絡先帳などの単純なWebサイトのプログラミングに適した(ニート)アーキテクチャは何ですか?


28

単純なWebサイト、たとえば連絡先を追加、削除、更新できる連絡先帳を作成するindex.phpとき、ユーザーがログインしていない場合はパスワードを入力し、正しいパスワードを入力した場合はユーザーに入力するファイルを作成しますセッションを割り当て、連絡先と特定のことを行うことができます。

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

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

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

回答:


67

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

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

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

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

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

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

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

操作ルーチン図

共通のフレームワーク操作ルーチンは次のとおりです。

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

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

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


3
そのイメージを作るために何を使用しましたか?すばらしい回答です!
マークトムリン

3
私の答えの肯定的な評価をありがとう!ほんとうにありがとう!この答えは、私が以前に自分自身で実施した、さまざまなオープンソースWebアプリケーションフレームワークの分析の結果です。イメージの作成方法と使用されているソフトウェアに興味がある人のために、イメージはInkscape 0.48およびGIMP 2.6.10を使用して作成されました。問題ありません。2つのレイヤーを使用します。1つはテキストを含む長方形用、もう1つは影(ぼやけた黒い長方形)用です。残りは理解できたと思う?

1つの質問、「連絡先」コントローラーを3つのファイルに分割する理由は何ですか。それらを1つのcontacts.phpに結合するだけできれいになりませんか?あなたがしなければならないのは、ルータからアクションパラメータを渡すことです。ビューがテンプレートとロジックをアクションごとに1つのファイルに混在させない限り、「連絡先」ビューにも同じことが言えます。私はPHPであまり開発していません(私は主にPythonで働いています)が、すべてのフレームワークがこのアプローチを使用しているとは限りません。それ以外の場合は、+ 1が優れた記事になります。
エヴァンプライス

2

どのような質問をすればよいか、どのソリューションが利用できるかを知るために、Martin Fowlerの「Patterns of Enterprise Application Architecture」の本をお勧めします 。彼のWebサイトを読むと、本の内容を知ることができます。

この本はすでにかなり古い(IT分野で)が、多くの原則がまだ有効であるか、学ぶためにそれらを学ぶ必要があることに注意してください。(それは理にかなっていますか?)

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


2

まず、よく開発されたプロジェクトを見てください。Wordpressはコード構造の非常に優れた例です。理解しやすいですが、多くの「プラグ」を提供します。そのため、ワードプレスは「プラグイン」を介して簡単に評価できます。

第二に、アーキテクチャを確認する非常に簡単な方法は、単体テストを書くことです。たとえば、クラス「Card Deck」に「shuffle()」メソッドがある場合、定義済みサイズ(5枚のカード1,2,3,4,5)のCard Deckを作成し、shuffleを呼び出して、結果の簡単な方法(id 1,4,2,5,3)

プロジェクトクラス全体をインスタンス化せずに実行できる必要があり、テストは非常にクリーンである必要があります。

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

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

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


1

大規模プロジェクトに適したアーキテクチャはMVC(Model View Controller)です:http : //en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

ただし、他のプログラマがそれを理解するかどうかは、まったく別の問題です。MVCは複雑になる可能性があり、小さなプロジェクトでは時々やり過ぎです。その利点の1つは、簡単に拡張できることです。


それはパターンであり、アーキテクチャではありません。
ハーフダン

この場合、それらは同じものであると主張します。この2つをどのように区別しますか?また、私が投稿したウィキペディアのページの最初の行を読んでください。
クリスラプランテ

1
私の経験から、MVCは複雑ではなく、小規模プロジェクトでも非常に便利です。ただし、これはパターンであり、アーキテクチャ全体ではないことに同意します。
ダニーヴァロッド

MVCはパターンであり、アーキテクチャ自体ではありませんが、アーキテクチャの一部と見なすことができます。結局、それほど複雑ではありません。

1

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

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

コンポーネントの分類が特定されたら、Tierに基づいて分類を特定する必要があります。典型的なWebアプリケーションには、View Tier、Model Tier、およびController Tier(MVC)があります。もちろん、より複雑なアプリケーションもあります。(ほとんどの実際のアプリケーションは、これが単純であるよりも複雑です)。

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


私は、リソース指向設計とアクティビティ指向設計の違いに深く入っていません。余談ですが、私はその質問についてはよくわかりませんでした。しかし個人的には、デザインの明確さ(新しい開発者が基礎となるコンポーネントとデザインをどれだけ簡単に理解できるか)に関しては、リソース指向アーキテクチャの方が優れています。開発者は、フォルダ階層を見るだけで、参加するリソース全体とサブリソースを理解でき、各リソースの操作も均一です。

1

良いアーキテクチャと悪いアーキテクチャがありますが、特効薬はありません。アーキテクチャは、現在の、そして非常に可能性のある将来の要件に適合していなければなりません。

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


1

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

他の極端な位置に良い感じを得るために、シーサイドを見てみましょう


1

大規模なプロジェクトの構成方法がわからない場合は、優れたPHPフレームワークの1つを使用して、他のプロジェクトの設計/アーキテクチャを借用する必要があります。CakePHP、CodeIgniter、またはSymfonyをお勧めします。これらはすべて、Web開発で適切に機能するモデル、ビュー、コントローラー、MVCパターンを実装します。これらはすべてかなり軽量で学習しやすいものです。

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


0

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

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

0

本番コードを書く前に2週間(夜:)かかり、この本を読んでください。プログラミングアーキテクチャ、慣習、パッキングについての長い間あなたの心を変えます。

アジャイルの原則、パターン、および実践C#by Prentice Hall

例はC#ですが、読みやすく、正しいコード構文の書き方ではなく、プログラマーとしての考え方です。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.