Jaka jest dobra (czysta) architektura w programowaniu prostej strony internetowej, np. Książki adresowej?

28

Kiedy tworzę prostą stronę internetową, np. Książkę kontaktów, w której mogę dodawać, usuwać i aktualizować kontakty, tworzę index.phpplik, w którym użytkownik, jeśli nie jest zalogowany, jest proszony o podanie hasła, a jeśli wpisze prawidłowe hasło, jest przypisał sesję i może robić pewne rzeczy z kontaktami.

Mam dwa pliki:

  1. Pierwszy ( contacts.php) służy do wyświetlenia kodu HTML. Powyżej kodu HTML dołączam drugi plik i tworzę klasę.
  2. Druga ( contacts_class.php) zawiera wszystkie metody dodawania, usuwania i aktualizacji.

Myślę, że to w porządku, ale jak mam zrealizować duży projekt, jak mam to zrobić? Czy muszę tworzyć foldery dla każdej strony i umieszczać w nich pliki (takie jak powyżej, HTML i klasa) i jak mam to zrobić? Jaka jest dobra i schludna architektura do budowania dużych projektów, którą każdy inny programista zrozumiałby doskonale?

dzień dobry
źródło

Odpowiedzi:

67

Podniosłeś bardzo interesujące i fundamentalne pytanie. Pytanie dotyczące architektury projektu na dużą skalę i organizacji struktury folderów (która jest drugorzędna w stosunku do architektury).

Obecnie najczęstszym podejściem do budowania architektury frameworka CMS jest użycie wzorca MVC. Istnieje kilka dobrych artykułów na temat budowania własnych środowisk MVC, jednym z nich jest Zbuduj środowisko MVC za pomocą PHP .

MVC oznacza Model, Widok, Kontroler. Możesz nazywać te podejścia jak tylko chcesz - MVC, HMVC, MVP. Istotą jest izolowanie poszczególnych elementów systemu. „Kontroler” pobiera dane z „Modelu” i wysyła je do „Widoku”, który wyświetla ostateczny kod HTML. Zaimplementowałeś już „V” w swoim contacts.phpi „MC” w swoim contacts_class.php. Więc odizolowałeś widok od modelu i kontrolera. Teraz możesz łatwo zmienić „Widok”, pozostawiając nienaruszone inne części.

Nie sugeruję, abyś ślepo podążał za wzorem MVC, MVP lub czymkolwiek innym „MV”. Jest to kwestia stosowności, skuteczności i smaku.

Wspólna dynamiczna aplikacja internetowa może zawierać takie składniki, jak:

  • Powiedzmy, że punkt wejścia index.php
  • Biblioteki / klasy pomocnika
  • Router żądania
  • Moduły, komponenty lub kontrolery
  • Silnik szablonów lub może pojedyncze widoki

Prawdziwa aplikacja internetowa może zawierać dowolne inne komponenty, takie jak procedury obsługi zdarzeń, dyspozytorzy zdarzeń i zaczepy, ale w rzeczywistości są to niuanse. Cóż, pozwól mi przedstawić to tak, jak chcę to przedstawić:

Schemat procedury działania

Wspólna procedura operacyjna ramowa, jak następuje:

  1. Żądanie przeglądarki jest wysyłane bezpośrednio do punktu wejścia wykonywalnego / script ( index.php).
  2. Skrypt punktu wejścia ładuje biblioteki pomocnicze, klasy i dokonuje dalszej inicjalizacji naszego środowiska programistycznego.
  3. Adres URL jest przekazywany do instancji routera żądania. Ten krok może być częścią kroku 2.
  4. Router żądający analizuje adres URL i przekazuje operację do określonego komponentu, modułu lub kontrolera.
  5. Komponent (lub kontroler) przetwarza skierowane żądanie i wysyła dane do renderowanego widoku.

Odpowiednia struktura folderów projektu jest pokazana na schemacie.

Sugerowałbym, abyś zbadał, w jaki sposób wdrażane są inne ramy. Zalecane CMS / frameworki na początek to CodeIgniter, OpenCart, Joomla 1.5 i Tango CMS.

ezpresso
źródło
3
Czego użyłeś do zrobienia tego obrazu? Świetna odpowiedź!
Mark Tomlin
3
Dziękuję za pozytywną ocenę mojej odpowiedzi! Bardzo to doceniam! Ta odpowiedź jest całkowicie wynikiem analizy różnych platform aplikacji internetowych typu open source, którą przeprowadziłem wcześniej dla siebie. Dla tych, którzy są zainteresowani sposobem utworzenia obrazu i używanym oprogramowaniem, obraz został utworzony za pomocą Inkscape 0.48 i GIMP 2.6.10. Nie ma z tym problemu. Wystarczy użyć dwóch warstw: jednej dla prostokątów z tekstem, jednej dla cieni (niewyraźne czarne prostokąty). Chyba rozumiesz resztę?
Jedno pytanie, dlaczego miałbyś podzielić kontrolery „kontaktów” na 3 pliki. Czy nie byłoby czystsze połączenie ich w jeden kontakt. Php. Wszystko, co musisz zrobić, to przekazać parametr działania z routera. To samo można powiedzieć o widokach „kontaktów”, chyba że widok ten łączy szablony i logikę w jeden plik dla każdej akcji. Nie robię dużo dev w PHP (pracuję głównie w Pythonie), ale mam nadzieję, że nie wszystkie frameworki używają tego podejścia. W przeciwnym razie +1 za świetny opis.
Evan Plaice,
2

Aby dowiedzieć się, jakie pytania należy zadać i jakie rozwiązania są dostępne, polecam książkę Patterns of Enterprise Application Architecture autorstwa Martina Fowlera. Możesz dowiedzieć się, co jest w książce, czytając jego stronę internetową

Należy pamiętać, że książka jest już dość stara (w świecie IT), ale wiele zasad jest nadal obowiązujących lub powinieneś nauczyć się z nich uczyć. (Czy to ma sens?)

(Oprogramowanie) Architektura to bardzo szeroki temat, nie oczekuj srebrnej kuli, ale zawsze więcej pytań i wątpliwości, dopóki nie zabraknie czasu i pieniędzy i będziesz musiał trzymać się najlepszego rozwiązania.

Eee nie
źródło
2

Przede wszystkim spójrz na dobrze opracowany projekt. Wordpress jest bardzo zgrabnym przykładem struktury kodu: jest prosty do zrozumienia, ale oferuje wiele „wtyczek”. Tak więc Wordpress jest łatwy do oszacowania poprzez „wtyczkę”.

Po drugie, bardzo łatwym sposobem na sprawdzenie architektury jest próba napisania testu jednostkowego. Na przykład jeśli klasa „Talia kart” ma metodę „shuffle ()”, musisz być w stanie utworzyć talię kart o zdefiniowanym rozmiarze (tj. 5 kart 1,2,3,4,5), wywołać losowanie i zweryfikować w łatwy sposób wynik (id 1,4,2,5,3)

Musisz być w stanie to zrobić bez tworzenia instancji wszystkich klas projektu, a test musi być bardzo czysty do odczytania.

Jeśli nie możesz tego zrobić, musisz dodać warstwy między klasami, zrestrukturyzować je, aż uzyskasz łatwy sposób.

Następnie wykonaj ponownie ten krok dla wszystkich podstawowych klas swojego projektu.

I na koniec: dobra architektura może być „leniwa” na niezbyt podstawowych zajęciach (to kwestia oszczędności: bardzo dobrze zaprojektowane rzeczy kosztują zbyt wiele w prawdziwym świecie).

daitangio
źródło
1

Dobra architektura dla projektów na dużą skalę to MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Jednak to, czy inni programiści zrozumieją, to zupełnie inna sprawa. MVC może się komplikować i czasami jest nadmiar w przypadku małych projektów. Jedną z jego zalet jest to, że łatwo się skaluje.

Chris Laplante
źródło
To wzór, a nie architektura.
halfdan
Twierdziłbym, że w tym przypadku są jednym w tym samym. Jak rozróżnisz te dwa? Przeczytaj także pierwszą linię, którą opublikowałem na stronie Wikipedii.
Chris Laplante,
1
Z mojego doświadczenia wynika, że ​​MVC nie jest skomplikowane i jest bardzo przydatne w małych projektach. Zgadzam się jednak, że jest to wzór, a nie cała architektura.
Danny Varod,
MVC to wzorzec, a nie architektura per se, ale można ją uznać za część architektury. I wcale nie jest to takie skomplikowane.
1

Jeśli dobrze rozumiem twoje pytanie, mówisz o strukturze folderów projektu, a nie o architekturze. Jeśli moje rozumowanie jest prawidłowe, czytaj dalej; w przeciwnym razie edytuj swoje pytanie lub dodaj komentarz, a ja odpowiednio zmienię swoją odpowiedź.

Projektując aplikację, po udzieleniu odpowiedzi na kilka podstawowych pytań, takich jak (co? I do kogo?), Musimy zidentyfikować komponenty i sklasyfikować je na podstawie funkcjonalności / obowiązków. Są dwa główne sposoby, które znam. Możesz klasyfikować komponenty na podstawie, wykorzystywać przypadki, które obsługują (takie jak logowanie, wyszukiwanie itp.) Lub klasyfikować na podstawie zasobów (obiekty ...). Pierwszy sposób nazywa się zorientowanym na działanie, a drugi nazywa się zorientowanym na zasoby. Tradycyjnie większość aplikacji klasyfikuje komponenty na podstawie działań (odkąd projektanci uznają to za łatwe, przy przenoszeniu z domeny problemu do domeny rozwiązania).

Po zidentyfikowaniu klasyfikacji komponentu musimy zidentyfikować klasyfikację na podstawie poziomów. Typowa aplikacja internetowa będzie miała warstwę widoku, warstwę modelu i warstwę kontrolera (MVC). Oczywiście mogą być też bardziej złożone aplikacje. (większość aplikacji w świecie rzeczywistym jest bardziej złożona niż ta prosta).

Po zidentyfikowaniu tych dwóch taksonomii utworzę foldery najwyższego poziomu, identyfikujące poszczególne poziomy. (Interfejs użytkownika, kontroler, usługi, narzędzia itp.). Pod każdym folderem wysokiego poziomu utworzę foldery podrzędne na podstawie funkcjonalności lub zasobów (Projekt - / EditProject - / SearchProject itp.). Idealnie funkcjonalna klasyfikacja będzie wielopoziomowa.

uncaught_exceptions
źródło
Nie wdałem się głębiej w różnice między projektowaniem zorientowanym na zasoby a projektowaniem zorientowanym na aktywność. Oprócz dygresji nie byłem bardzo pewien tego pytania. Ale osobiście, jeśli chodzi o przejrzystość projektu (jak łatwo nowy programista może zrozumieć podstawowe komponenty i projekt), architektura zorientowana na zasoby jest lepsza. Patrząc tylko na hierarchię folderów, programista może zrozumieć wszystkie uczestniczące zasoby i zasoby podrzędne, a operacje na każdym z zasobów są również jednolite.
1

Są dobre i złe architektury, jednak nie ma srebrnych kul. Architektura musi być dostosowana do obecnych i wysoce możliwych przyszłych wymagań.

Dobrą wskazówką byłoby, upewnij się, że każdą część aplikacji można zmienić przy minimalnym wpływie na inne części oraz że każda część ma zautomatyzowane testy pełnego zasięgu i testy integracji.

Danny Varod
źródło
1

Architektura polega na zapewnieniu dalszego rozwoju w dłuższej perspektywie. W przypadku większych aplikacji obejmuje to kompromisy między uniezależnianiem rzeczy, dzięki czemu wiele osób może pracować jednocześnie i unikanie powielania (DRY), dzięki czemu projekt może pozostać sprawny. Projekty PHP zwykle koncentrują się na uczynieniu rzeczy niezależnymi i mają dużą ilość powielania.

Aby uzyskać dobre wyczucie drugiej skrajnej pozycji, spójrz na Seaside


źródło
1

Jeśli nie wiesz, jak zbudować duży projekt, powinieneś pożyczyć projekt / architekturę innych, używając jednego z kilku dobrych frameworków PHP. Poleciłbym CakePHP, CodeIgniter lub Symfony. Wszystkie z nich implementują model, widok, kontroler, wzór MVC, który działa dobrze w tworzeniu stron internetowych, wszystkie są dość lekkie i łatwe do nauczenia.

Gdy poznasz jedną z tych platform, możesz być w stanie zaprojektować własną strukturę dla konkretnego projektu, ale jeśli dopiero zaczynasz, stanę na pracy innych, a nie na nowo.

j0k
źródło
0

MVC jest najczęściej stosowaną architekturą, co do której dowiedziono, że rozwiązuje większość problemów. Dobra architektura będzie miała następujące funkcje (i więcej, orcourse)

  1. Może być testowany jednostkowo
  2. Rozdzielenie obaw
  3. Wiele osób będzie mogło nad nim pracować bez kolizji.
  4. Można go przedłużyć bez większego problemu
  5. Może być skalowalny. W przypadku dużych projektów głównym problemem będzie skalowalność. Checkout Framework Kohana , który jest dobrze napisany i można go bardzo dobrze skalować
Wstydnik
źródło
0

zanim napiszesz kod produkcyjny, zajmij 2 tygodnie (noce :) i przeczytaj tę książkę. Na długo zmieni zdanie na temat architektury programowania, praktyk i pakowania.

Zwinne zasady, wzorce i praktyki C # by Prentice Hall

Przykłady są w C #, ale są łatwe do odczytania, nie chodzi o to, jak napisać poprawną składnię kodu, chodzi o to, jak myśleć jako programista.

Obiecuję, że zapiszesz go w swoim najbardziej dostępnym miejscu na komputerze i będziesz zaskoczony, że programujesz, nie wiedząc o tym. Zmieni twoje myślenie.


źródło