Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][oop] Architektura aplikacji, grupy/profile i odpowiedne dla nich modele/widoki
jastu
post
Post #1





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

Ostrzeżenie: (0%)
-----


Witam
problem opiszę na przykładzie :
- mamy w bazie rekord który dla różnych profili użytkownika wyświetla inne kolumny

Gdzie powinno się znaleźć zapytanie o rekord ?
- czy w klasie ModelUserProfil dziedziczącej po klasie ModelUser (chyba nie) ?
( tutaj mamy tylko kod do operacji na danych użytkownika )
- czy w klasie ModelDane która odpowiada za dane które chcemy uzyskać (raczej tak) ?
( wtedy trzeba do ModelDane przekazać informacje o profilu bierzącego użytkownika )
- czy w klasie ViewDane który generuje odpowiedni widok dla bierzącego usera (zdecydowanie tak) ?
( przekazujemy informacje o profilu użytkownika do widoku i na tej podstawie wyświetlamy tylko własciwe dla użytkownika dane, ale pobieramy zawsze komplet danych )

3 rozwiązanie chyba najlepsze, tylko w ModelDane zawsze byśmy pobierali te same dane, a nie każdy profil wymaga pobrania danych dla rekordu z 3 tabel (po np. jeden z profili wymaga danych z jednej tabeli) - co wtedy z wydajnością ?

Jak rozwiązujecie to u siebie ?
pzdr
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Ja pomyślał bym nad fabryką i DAO dla obiektów reprezentujących wyświetlane dane. Szkoda trochę wydajności, żeby w większości przypadków (odwołania przeciętnych użytkowników) wykonywać potrójnego joina. Najlepiej widać to na pseudo-kodzie.
  1. <?php
  2. class UserData {
  3. public function getSomething() {}
  4. }
  5.  
  6. class ModData extends UserData {
  7. public function getSomethingMore() {}
  8. }
  9.  
  10. class AdminData extends ModData {
  11. public function getSomethingElse() {}
  12. } 
  13.  
  14. class DataDAOFactory {
  15. public static function getDAO(User $u) {
  16. if ($u->isAdmin()) {
  17. return new AdminDataDAO();
  18. } else if ($u->isMod()) {
  19. return new ModDataDAO();
  20. } else {
  21. return new UserDataDAO();
  22. }
  23. }
  24. }
  25.  
  26. interface DataDAO {
  27. public function getUserData(User $u);
  28. }
  29.  
  30. class UserDataDAO implements DataDAO {
  31. public function getUserData(User $u) {
  32. // Pobierasz dane dla zwykłego użytkownika
  33. return new UserData();
  34. }
  35. }
  36.  
  37. class ModDataDAO implements DataDAO {
  38. public function getUserData(User $u) {
  39. // Pobierasz dane dla moderatora
  40. return new ModData();
  41. }
  42. }
  43.  
  44. class AdminDataDAO implements DataDAO {
  45. public function getUserData(User $u) {
  46. // Pobierasz dane dla administratora
  47. return new AdminData();
  48. }
  49. }
  50. ?>

Tyle, że z tym rozwiązaniem jest jeden problem: dużo klas. Przyda się, jeżeli w tym DAO będziesz miał więcej operacji zależnych od typu użytkownika. Jeżeli będziesz miał tylko jedną metodę, może to być strata czasu. Wtedy można utworzyć uniwersalne DAO, w którym dokonasz wyboru zapytania po uprawnieniach (tak jak w fabryce wyboru DAO). Wypada wtedy fabryka i dwie klasy DAO. Widok możesz wybrać po typie obiektu z danymi albo uprawnieniach użytkownika.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 19:00