Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Objektowe podejście do produktu, W jaki sposób najlepiej podejść do opracowywania klasy produktu
porady-it.pl
post 2.11.2007, 15:37:14
Post #1





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

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


Witam,

Chciałem się dowiedzieć czy mój tok myślenia odnośnie programowania obiektowego jest właściwy. Napisałem klasę do obsługi produktu jest to oczywiście mały zalążek tej klasy jednak nim zacznę pisać dalej chciałem się upewnić czy rozwiązania przyjmowane prze zemnie są prawidłowe.

  1. <?php
  2.  
  3. class product {
  4.  
  5. /**
  6.  * Uchwyt do bazy danych.
  7.  * 
  8.  * @var myPDO
  9.  */
  10. private $db;
  11.  
  12. /**
  13.  * Przechowuje identyfikator produktu.
  14.  * 
  15.  * @var int
  16.  */
  17. private $id;
  18.  
  19. /**
  20.  * Przechowuje nazwę produktu.
  21.  *
  22.  * @var string
  23.  */
  24. private $name;
  25.  
  26. /**
  27.  * Przechowuje cenę produktu.
  28.  * 
  29.  * @var float
  30.  */
  31. private $price;
  32.  
  33. /**
  34.  * Przechowuje listę parametrów przypisanych do produktu.
  35.  * 
  36.  * @var array
  37.  */
  38. private $parameters;
  39.  
  40. /**
  41.  * Konstruktor tworzy uhcwyt do bazy danych.
  42.  */
  43. public function __construct() {
  44. $this->db = myPDO::getInstance();
  45. }
  46.  
  47. /**
  48.  * Ustawia identyfikator produktu.
  49.  * 
  50.  * @access public
  51.  * @param int $id - identyfikator produktu
  52.  * @return void
  53.  */
  54. public function setID($id) {
  55.  
  56. $this->id = (int)$id;
  57.  
  58. //jeśli został przypisany identyfikator różny od zera 
  59. //pobieramy informacje z bazy danych
  60. if($id)
  61. $this->_getInfo();
  62. }
  63.  
  64. /**
  65.  * Ustawia nazwę produktu.
  66.  * 
  67.  * @access public
  68.  * @param string $name - nazwa produktu
  69.  * @return void
  70.  */
  71. public function setName($name) {
  72. $this->name = $name;
  73. }
  74.  
  75. /**
  76.  * Ustawia cenę produktu.
  77.  * 
  78.  * @access public
  79.  * @param float $price - cena produktu
  80.  * @return void
  81.  */
  82. public function setPrice($price) {
  83. $this->price = $price;
  84. }
  85.  
  86. /**
  87.  * Zwraca nazwę produktu.
  88.  * 
  89.  * @access public
  90.  * @return string
  91.  */
  92. public function getName() {
  93. return $this->nazwa;
  94. }
  95.  
  96. /**
  97.  * Zwraca cenę produktu.
  98.  * 
  99.  * @access public
  100.  * @return float
  101.  */
  102. public function getPrice() {
  103. return $this->price; 
  104. }
  105.  
  106. /**
  107.  * Zwraca identyfikator produktu.
  108.  * 
  109.  * @access public 
  110.  * @return int
  111.  */
  112. public function getID() {
  113. return $this->id;
  114. }
  115.  
  116. /**
  117.  * Pobiera informacje z bazy danych o produkcie.
  118.  *
  119.  * @access private
  120.  */
  121. private function _getInfo() {
  122.  
  123. $stmt = $this->db->query(' SELECT 
  124. *
  125.  
  126. FROM 
  127. '.PRODUCTS.
  128.  
  129. WHERE 
  130. id = '.$this->id);
  131.  
  132. $arrProduct = $stmt -> fetch(PDO::FETCH_ASSOC);
  133.  
  134. $stmt->closeCursor();
  135.  
  136. //przypisanie danych z bazy do zmiennych
  137. $this->name  = $arrProduct['name'];
  138. $this->price  = $arrProduct['price'];
  139. }
  140. }
  141. ?>


Pierwsze moje pytanie dotyczy samego pobierania danych produktu z bazy danych czy przyjęte rozwiązanie jest prawidłowe czy też można to rozwiązać w jakiś lepszy sposób questionmark.gif

Kolejna sprawa dotyczy aktualizacji danych produktu, gdzieś wyczytałem (niestety obecnie nie jestem w stanie określić źródła tych informacji), że dobrym podejściem jest aktualizacja danych produktu w bazie przy niszczeniu obiektu (pisząc odpowiednią funkcję w destruktorze). Czy rzeczywiście jest to dobre rozwiązanie questionmark.gif

Ten post edytował porady-it.pl 2.11.2007, 16:00:16


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
Helios
post 2.11.2007, 17:57:54
Post #2





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.07.2006

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


Ja bym dazyl do osiagniecia takiego mechanizmu:

  1. <?php
  2. $objProductManager = new ProductManager;
  3.  
  4. $objProductManager->addProduct(new Product('Ksiazka', 32.50, 300));
  5.  
  6. $objProduct = $objProductManager->getProductById(30);
  7.  
  8. print $objProduct->getName();
  9.  
  10. while($objProduct = $objProductManager->getProducts()){
  11. print $objProduct->getId();
  12. print $objProduct->getName();
  13. }
  14. ?>


Rozdzielilbym operacja na bazie danych/zrodla danych od jednostki elementarnej czyli produktu.
Manager przyjmuje obiekt produktu i go dodaje do bazy, manager zwraca obiekt produktu z bazy, na ktorym pozniej mozesz prowadzic dalsze operacje.

W OOP jestem poczatkujacy, ale tak to rozumuje.

Ten post edytował Helios 2.11.2007, 18:12:53
Go to the top of the page
+Quote Post
porady-it.pl
post 3.11.2007, 09:17:34
Post #3





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

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


Czyli rozumiem że w tym wypadku funkcja _getInfo która pobiera informacje z bazy o produkcie miała by zostać przerzucona do klasy ProductManager jako getProductById i mniej więcej miło by to wyglądać w następujący sposób:

  1. <?php
  2. class ProductManager {
  3.  
  4. public function getProductById($id) {
  5.  
  6. $stmt = $this->db->query(' SELECT 
  7. *
  8.  
  9. FROM 
  10. '.PRODUCTS.
  11.  
  12. WHERE 
  13. id = '.$id);
  14.  
  15. $arrProduct = $stmt -> fetch(PDO::FETCH_ASSOC);
  16.  
  17. $stmt->closeCursor();
  18.  
  19. $objProduct = new product();
  20.  
  21. $objProduct->setName($arrProduct['name']);
  22. $objProduct->setPrice($arrProduct['price']);
  23. $objProduct->setID($arrProduct['id']);
  24.  
  25. return $objProduct;
  26. }
  27.  
  28. }
  29. ?>


Mam jeszcze takie pytanko bowiem Ty w swoim przykładzie pokazywałeś że podstawowe dane produktu są przesyłane przez konstruktor, czy należy tak robić nawet w przypadku bardzo dużej ilości parametrów ?


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
skowron-line
post 3.11.2007, 10:15:58
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Wedlug mnie twoja metoda wybierajaca dane z bazy powinna zwrocic tablice na ktorej potem bedziesz operowal, a co do konstruktora to powinienes tam wsadzic tylko to co bedzie ci potrzebne przy tworzeniu obiektu klasy


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
porady-it.pl
post 8.11.2007, 10:54:25
Post #5





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

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


Rzeczywiście zgadzam się z Tobą że lepszym rozwiązaniem będzie zwracanie tablicy. Tak się zastanawiam czy przydakiem obiekt "product" nie będzie już zbędny, gdyż zwrócone dane w postaci tablicy mogę bezpośrednio przekazać do szablonu np. smarty gdzie dane te zostaną wyświetlone. Czy w takim wypadku tworzenie obiektu "product" nie zatraca sensu ? W jakim przypadku obiekt "product" może się przydać ?

Ten post edytował porady-it.pl 8.11.2007, 10:55:13


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
Cysiaczek
post 8.11.2007, 11:17:16
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




W oczywsity sposób - nie musisz pisać kod SQL za każdym razem. Lepszym rozwiązaniem jest stosowanie obiektu Product i productsManager.
Wtedy sam Product to odzwierciedlenie tabeli/tabel bazy danych i operacje na niej, natomiast productsManager, jak nazwa wskazuje - zarządza obektami typu Product. Może zawierać metody np, takie (one nie sa statyczne - tylko tak się zapisuje): productsManager::getAsArray(), productsManager::getProducts(), productsManager::addToCollection() itp.

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 04:10