Was ist eine gute (saubere) Architektur bei der Programmierung einer einfachen Website, z. B. eines Kontaktbuchs?


28

Wenn ich eine einfache Website erstelle, z. B. ein Kontaktbuch, in dem ich Kontakte hinzufügen, löschen und aktualisieren kann, erstelle ich eine index.phpDatei, in der ein Benutzer, wenn er nicht angemeldet ist, aufgefordert wird, ein Kennwort einzugeben, und wenn er das richtige Kennwort eingibt, muss er ein Kennwort eingeben eine Sitzung zugewiesen und kann bestimmte Dinge mit den Kontakten tun.

Ich habe zwei Dateien:

  1. Das erste ( contacts.php) dient zum Anzeigen des HTML-Codes. Über dem HTML-Code füge ich die zweite Datei ein und erstelle die Klasse.
  2. Das second ( contacts_class.php) enthält alle Methoden zum Hinzufügen, Löschen und Aktualisieren.

Ich denke, das ist in Ordnung, aber wie soll ich es tun, wenn es um die Umsetzung eines großen Projekts geht? Muss ich Ordner für jede Seite erstellen und Dateien darin ablegen (wie oben, HTML und Klasse) und wie soll ich das tun? Was ist eine gute und gepflegte Architektur, um große Projekte zu erstellen, die jeder andere Programmierer perfekt verstehen würde?

Antworten:


67

Sie haben eine sehr interessante und grundlegende Frage aufgeworfen. Die Frage nach der großen Projektarchitektur und der Ordnerstrukturorganisation (die der Architektur untergeordnet ist).

Heutzutage ist der häufigste Ansatz zum Erstellen der CMS-Framework-Architektur die Verwendung von MVC-Mustern. Es gibt einige gute Artikel zum Erstellen eigener MVC-Frameworks. Eines davon ist das Erstellen eines MVC-Frameworks mit PHP .

MVC steht für Model, View, Controller. Sie können diese Ansätze beliebig nennen - MVC, HMVC, MVP. Das Wesentliche ist, die einzelnen Komponenten Ihres Systems zu isolieren. Der "Controller" ruft die Daten aus dem "Model" ab und sendet sie an "View", wodurch das endgültige HTML gerendert wird. Sie haben bereits das "V" in Ihr contacts.phpund "MC" in Ihr implementiert contacts_class.php. Sie haben also die Ansicht vom Modell und der Steuerung getrennt. Jetzt können Sie ganz einfach Ihre "Ansicht" ändern und andere Teile intakt lassen.

Ich rate Ihnen nicht, blindlings dem MVC-, MVP- oder was auch immer "MV" -Muster zu folgen. Es geht um Angemessenheit, Wirksamkeit und Geschmack.

Die allgemeine dynamische Website-Anwendung kann folgende Komponenten enthalten:

  • Der Einstiegspunkt, sagen wir index.php
  • Die Hilfsbibliotheken / Klassen
  • Der Anforderungsrouter
  • Die Module, Komponenten oder Controller
  • Die Template Engine oder vielleicht einzelne Views

Die echte Webanwendung kann andere Komponenten wie Event-Handler, Event-Dispatcher und Hooks enthalten, dies sind jedoch tatsächlich Nuancen. Nun, lassen Sie mich es so präsentieren, wie ich es präsentieren möchte:

Das Betriebsroutinendiagramm

Die allgemeine Framework-Betriebsroutine lautet wie folgt:

  1. Die Browseranforderung wird direkt an die ausführbare Datei / script ( index.php) des Einstiegspunkts gesendet .
  2. Das Einstiegspunktskript lädt die Hilfsbibliotheken, Klassen und führt eine weitere Initialisierung unserer Programmierumgebung durch.
  3. Die URL wird an die Anforderungsrouterinstanz übergeben. Dieser Schritt kann der Teil von Schritt 2 sein.
  4. Der Anforderungsrouter analysiert die URL und sendet die Operation an eine bestimmte Komponente, ein bestimmtes Modul oder einen bestimmten Controller.
  5. Die Komponente (oder der Controller) verarbeitet die weitergeleitete Anforderung und sendet die Daten an die Ansicht, die gerendert werden soll.

Die entsprechende Projektordnerstruktur ist im Diagramm dargestellt.

Ich würde vorschlagen, dass Sie untersuchen, wie die anderen Frameworks implementiert werden. Die empfohlenen CMS / Frameworks sind zunächst CodeIgniter, OpenCart, Joomla 1.5 und Tango CMS.


3
Was hast du benutzt, um dieses Bild zu machen? Gute Antwort!
Mark Tomlin

3
Vielen Dank für die positive Bewertung meiner Antwort! Ich weiß das wirklich zu schätzen! Diese Antwort ist das Ergebnis einer Analyse verschiedener Open-Source-Frameworks für Webanwendungen, die ich zuvor für mich selbst durchgeführt habe. Für diejenigen, die daran interessiert sind, wie das Image erstellt wurde und welche Software verwendet wird, wurde das Image mit Inkscape 0.48 und GIMP 2.6.10 erstellt. Kein Problem damit. Verwenden Sie einfach zwei Ebenen: eine für die Rechtecke mit Text, eine für die Schatten (die verschwommenen schwarzen Rechtecke). Ich denke du verstehst den Rest?

Eine Frage, warum würden Sie die "Kontakte" Controller in 3 Dateien trennen. Wäre es nicht sauberer, sie in einer contact.php zu kombinieren? Sie müssen lediglich einen Aktionsparameter vom Router übergeben. Dasselbe gilt für die "Kontakte" -Ansichten, es sei denn, Ihre Ansicht kombiniert Vorlagen und Logik für jede Aktion in einer Datei. Ich entwickle nicht viel in PHP (ich arbeite hauptsächlich in Python), aber ich hoffe, dass nicht alle Frameworks diesen Ansatz verwenden. Ansonsten +1 für eine großartige Beschreibung.
Evan Plaice

2

Um eine Vorstellung davon zu bekommen, welche Fragen zu stellen sind und welche Lösungen zur Verfügung stehen, empfehle ich das Buch Patterns of Enterprise Application Architecture von Martin Fowler. Sie können sich einen Überblick über die Inhalte des Buches verschaffen, indem Sie seine Website lesen

Bitte beachten Sie, dass das Buch bereits ziemlich alt ist (im IT-Bereich), aber viele Prinzipien immer noch gültig sind, oder Sie sollten sie lernen, um daraus zu lernen. (Hat das Sinn gemacht?)

(Software) Architektur ist ein sehr breites Thema. Erwarten Sie keine Silberkugel, sondern immer mehr Fragen und Zweifel, bis Zeit und Geld ausgehen und Sie sich an die bisher beste Lösung halten müssen.


2

Schauen Sie sich zunächst ein gut entwickeltes Projekt an. Wordpress ist ein sehr gutes Beispiel für die Codestruktur: Es ist einfach zu verstehen, bietet aber eine Menge "Plug". So ist WordPress einfach per "Plug-In" zu testen.

Zweitens besteht eine sehr einfache Möglichkeit, Ihre Architektur zu überprüfen, darin, einen Komponententest zu schreiben. Wenn die Klasse "Kartendeck" beispielsweise eine "shuffle ()" - Methode hat, müssen Sie in der Lage sein, ein Kartendeck mit einer vordefinierten Größe (dh 5 Karten 1, 2, 3, 4, 5) zu erstellen, shuffle aufzurufen und in zu überprüfen einfache möglichkeit das ergebnis (id 1,4,2,5,3)

Sie müssen in der Lage sein, dies zu tun, ohne die gesamten Projektklassen zu instanziieren, und der Test muss sehr sauber zu lesen sein.

Wenn Sie dies nicht tun können, müssen Sie Ebenen zwischen Klassen hinzufügen und sie neu strukturieren, bis Sie eine einfache Möglichkeit finden, dies zu tun.

Dann wiederholen Sie diesen Schritt für alle Kernklassen Ihres Projekts.

Last but not least: Eine gute Architektur könnte in weniger wichtigen Klassen "faul" sein (es ist eine Frage der Wirtschaftlichkeit: Sehr gut gestaltete Dinge kosten in der realen Welt zu viel).


1

Eine gute Architektur für Großprojekte ist MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Ob andere Programmierer das verstehen würden, ist jedoch völlig anders. MVC kann komplex werden und ist bei kleinen Projekten manchmal zu viel des Guten. Einer der Vorteile davon ist, dass es sich leicht skalieren lässt.


Das ist ein Muster, keine Architektur.
Halfdan

Ich würde argumentieren, dass sie in diesem Fall ein und dasselbe sind. Wie würden Sie die beiden unterscheiden? Lesen Sie auch die allererste Zeile der Wikipedia-Seite, die ich gepostet habe.
Chris Laplante

1
Nach meiner Erfahrung ist MVC nicht komplex und auch in kleinen Projekten sehr nützlich. Ich stimme jedoch zu, dass es sich um ein Muster und nicht um eine ganze Architektur handelt.
Danny Varod

MVC ist ein Muster, keine Architektur an sich, kann aber als Teil der Architektur betrachtet werden. Und es ist doch nicht so kompliziert.

1

Wenn ich Ihre Frage richtig verstehe, sprechen Sie über die Projektordnerstruktur und nicht im Wesentlichen über eine Architektur. Wenn mein Verständnis stimmt, lesen Sie weiter. Wenn Sie Ihre Frage bearbeiten oder einen Kommentar abgeben, bearbeite ich meine Antwort entsprechend.

Beim Entwerfen einer Anwendung müssen wir nach Beantwortung einiger grundlegender Fragen wie (was? Und wem?) Die Komponenten identifizieren und sie basierend auf Funktionalität \ Zuständigkeiten klassifizieren. Es gibt zwei Hauptwege, die ich kenne. Sie können Komponenten anhand von Anwendungsfällen (wie Login, Suche usw.) oder anhand von Ressourcen (Objekte ..) klassifizieren. Der erste Weg heißt aktivitätsorientiert und der zweite heißt ressourcenorientiert. Herkömmlicherweise klassifizieren die meisten Anwendungen Komponenten auf der Grundlage von Aktivitäten (da Designer dies beim Übergang von der Problemdomäne zur Lösungsdomäne als einfach empfanden). Aber ich schweife ab.

Sobald die Komponentenklassifikation identifiziert ist, müssen wir die Klassifikation basierend auf Ebenen identifizieren. Eine typische Webanwendung verfügt über View Tier, Model Tier und Controller Tier (MVC). Natürlich könnte es auch komplexere Anwendungen geben. (Die meisten realen Anwendungen sind komplexer als dies unkompliziert ist).

Nachdem ich diese beiden Taxonomien identifiziert habe, erstelle ich Ordner der obersten Ebene, die die einzelnen Ebenen identifizieren. (Benutzeroberfläche, Controller, Dienste, Dienstprogramme usw.). Unter jedem übergeordneten Ordner erstelle ich untergeordnete Ordner basierend auf Funktionen oder Ressourcen (Projekt - / EditProject - / SearchProject usw.). Idealerweise wird die funktionale Klassifizierung mehrstufig sein.


Ich bin nicht näher auf die Unterschiede zwischen ressourcenorientiertem und aktivitätsorientiertem Entwerfen eingegangen. Abgesehen vom Abschweifen war ich mir bei dieser Frage nicht ganz sicher. Wenn es jedoch um die Klarheit des Designs geht (wie leicht ein neuer Entwickler die zugrunde liegenden Komponenten und das Design verstehen kann), ist die ressourcenorientierte Architektur besser. Wenn ein Entwickler nur die Ordnerhierarchie betrachtet, kann er die gesamten beteiligten Ressourcen und Unterressourcen verstehen, und die Operationen auf den einzelnen Ressourcen sind ebenfalls einheitlich.

1

Es gibt gute und schlechte Architekturen, aber keine Silberkugeln. Eine Architektur muss an die aktuellen und höchstmöglichen zukünftigen Anforderungen angepasst sein.

Eine gute Richtlinie wäre, sicherzustellen, dass jeder Teil der Anwendung mit minimaler Auswirkung auf die anderen Teile geändert werden kann und dass jeder Teil über automatisierte vollständige Abdeckungseinheits- und Integrationstests verfügt.


1

Bei der Architektur geht es darum, sicherzustellen, dass Sie sich langfristig weiterentwickeln können. Bei größeren Anwendungen gehört dazu, Kompromisse zwischen der Unabhängigkeit mehrerer Mitarbeiter und der Vermeidung von Doppelarbeit (DRY) zu schließen, damit das Projekt flexibel bleibt. PHP-Projekte konzentrieren sich in der Regel darauf, Dinge unabhängig zu machen und weisen eine große Menge an Duplikaten auf.

Werfen Sie einen Blick auf Seaside, um ein gutes Gefühl für die andere Extremposition zu bekommen


1

Wenn Sie nicht wissen, wie man ein großes Projekt strukturiert, sollten Sie das Design / die Architektur anderer mit einem von mehreren guten PHP-Frameworks ausleihen. Ich würde CakePHP, CodeIgniter oder Symfony empfehlen. Alle implementieren ein Model, View, Controller, MVC-Muster, das in der Webentwicklung gut funktioniert. Sie sind alle recht leicht und leicht zu erlernen.

Sobald Sie eines dieser Frameworks kennengelernt haben, können Sie möglicherweise Ihre eigene Struktur für Ihr bestimmtes Projekt entwerfen. Wenn Sie jedoch gerade erst anfangen, würde ich mich auf die Arbeit anderer verlassen und das Rad neu erfinden.


0

MVC ist die am häufigsten verwendete Architektur, die nachweislich die meisten Probleme löst. Eine gute Architektur hat die folgenden Eigenschaften (und mehr, oder natürlich)

  1. Es kann einheitlich getestet werden
  2. Trennung von Bedenken
  3. Mehrere Personen können ohne Kollision daran arbeiten.
  4. Es kann problemlos erweitert werden
  5. Es kann skalierbar sein. Bei großen Projekten wird die Skalierbarkeit ein wichtiges Anliegen sein. Checkout Kohana Framework, das gut geschrieben ist und sich sehr gut skalieren lässt

0

Bevor Sie einen Produktionscode schreiben, nehmen Sie sich 2 Wochen (Nächte :) Zeit und lesen Sie dieses Buch. Es wird Ihre Meinung über Programmierarchitektur, -praktiken und -pakete für eine lange Zeit ändern.

Agile Prinzipien, Muster und Praktiken C # von Prentice Hall

Beispiele sind in C #, aber sie sind leicht zu lesen. Es geht nicht darum, wie man die richtige Codesyntax schreibt. Es geht darum, wie man als Programmierer denkt.

Ich verspreche Ihnen, dass Sie es an Ihrem zugänglichsten Ort auf Ihrem PC speichern und Sie werden erstaunt sein, dass Sie programmiert haben, ohne es zu wissen. Es wird dein Denken verändern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.