Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [oop] Rozbijanie klas
Forum PHP.pl > Forum > PHP > Object-oriented programming
sajegib
Witam!

Mam taki pytanko do szanownego grona.

Załóżmy, że mam malutki czat oparty na OOP, do którego napisałem następujące klasy

  1. class database
  2. {
  3. //operacje na bazie, select, insert, update, same zapytania i zwracanie wyniku
  4. // dane docierające tutaj są już wyfiltrowane pod kątem SQLI itd.
  5. }
  6.  
  7. class chat
  8. {
  9. public function get_messages()
  10. {
  11.  
  12. //pobieram wiadomosci z bazy, zwracam tablice z wynikiem z bazy
  13. }
  14.  
  15. public function add_message()
  16. {
  17. // $this->validate();
  18. //dodaje wiadomosci po uprzednim wyescapowaniu
  19. }
  20.  
  21. public function validate()
  22. {
  23. //filtruje dane pod kątem sqli itd.
  24. }
  25.  
  26. }



to taki ogólny szkic, nie patrzcie na błędy, moje pytanie dotyczy raczej architektury całości smile.gif

Teraz moje pytanie:
1. czy rzeczą pożądaną jest, by metoda validate była umieszczona w klasie chat, czy też powinienem stworzyć osobną klasę z metodami filtrującymi dane?
A może nie ma to żadnego znaczenia?
Gdyby było to coś większego, z pewnością zrobiłbym całą klasę walidującą (zawierałaby wtedy wiele metod)

2. Czy ma sens robić klasę zawierającą tylko jedną metodę?
Jak 'powinno się robić' i dlaczego?
PrinceOfPersia
Cytat
1. czy rzeczą pożądaną jest, by metoda validate była umieszczona w klasie chat, czy też powinienem stworzyć osobną klasę z metodami filtrującymi dane?

to pewnie zależy od konkretnej sytuacji, ale jakbyś stworzył osobną klasę (albo choćby zestaw funkcji - nie bądźmy zbyt oop na siłę, bo to niezdrowe wink.gif, to byś mógł ponownie użyć kodu walidacji do innych projektów/modułów niż tylko ten jeden czat.

Cytat
2. Czy ma sens robić klasę zawierającą tylko jedną metodę?

to zależy.
skowron-line
Single responsibility principle
Ja bym w tą stronę szedł.
  1. class database
  2. {
  3. public function __construct()
  4. }
  5.  
  6. class message
  7. {
  8. public function write($message)
  9. public function read()
  10. }
  11.  
  12. class validate
  13. {
  14. public function not_empty()
  15. public function email()
  16. public function is_valid()
  17. }
  18.  
  19. class chat
  20. {
  21. public function __construct(Database $db, Validate $validate)
  22. public function send($message)
  23. {
  24. // validacja
  25. // zapis
  26. }
  27. public function receive()
  28. }
sajegib
O to mi chodziło, dzięki!
q3trm

1. Załóżmy, że mam do pobrania z formularza plik($_FILES) oraz jakąś opcję($_POST), czy odebrać te dane w jednej klasie?

  1. class DataForm
  2. {
  3. protected $file;
  4. protected $option;
  5.  
  6. public function __construct()
  7. {
  8. $this ->file = $_FILES['file'];
  9. $this ->option = $_POST['option'];
  10. }
  11. }


2. Atrybuty $file i $option zrobić statycznymi, czy lepiej przekazywać je za pomocą delegacji?
sajegib
  1. public function __construct($_FILES['file'], $_POST['option'])
  2. {
  3. $this->file = $_FILES['file']'
  4. $this->option = $_POST['option'];
  5. }
q3trm
Cytat(sajegib @ 28.04.2013, 20:19:20 ) *
  1. public function __construct($_FILES['file'], $_POST['option'])
  2. {
  3. $this->file = $_FILES['file']'
  4. $this->option = $_POST['option'];
  5. }


Super globalnych nie można deklarować jako parametrów metod.
sajegib
przy tworzeniu obiektu:

  1. $post = $_POST.....
  2. $files =$_FILES...
  3. $x = new DataForm($post, $files);
q3trm
Ciągle mam uczucie, że powinno się to rozdzielić na dwa kontrolery. Niby dane z jednego formularza, ale POST i FILES niewiele mają ze sobą wspólnego, każda pójdzie odrębną strukturą klas(patrząc na UML).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.