Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Usuwanie podstrony/innej treści, Jak to wykonać zgodnie z obiektowością?
kiler129
post
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Witajcie!
Krótko i na temat - postanowiłem z lekka uporządkować kod swojego CMSu i uczynić go bardziej obiektowym. W związku z tym sprawdziłem jaki wpływa na prędkość ma zbudowanie obiektu i wykonanie metody kontra wykonanie metody statycznej, wyniki z lekka mnie zaskoczyły:
  1. <?php
  2. class test {
  3. static public function get() { return array(); }
  4. }
  5.  
  6. class test2 {
  7. public function get() { return array(); }
  8. }
  9.  
  10. $s = microtime(true);
  11. for($i=0; $i<=1000; $i++) {
  12. $x = new test;
  13. $y = $x->get();
  14. unset($x, $y);
  15. }
  16. echo "Object: ".round((microtime(true)-$s), 4)." ms<br/>";
  17.  
  18. $s = microtime(true);
  19. for($i=0; $i<=1000; $i++) {
  20. $y = test2::get();
  21. unset($y);
  22. }
  23. echo "Static: ".round((microtime(true)-$s), 4)." ms<br/>";
  24.  
  25. /*
  26.  Object: 0.0036 ms
  27.  Static: 0.0037 ms
  28. */
  29. ?>


Różnica praktycznie żadna a wg teorii OOP wykonujemy akcję na danym obiekcie więc chyba najsensowniejszym podejściem jest taka organizacja obsługi podstron:
  1. <?php
  2. class subpage {
  3. protected $id = NULL;
  4. protected $validId = false;
  5.  
  6. function __construct($id=NULL) {
  7. if($id > 0 && textOperations::isInt($id)) { //basic validation
  8. $this->validId = true;
  9. $this->id = $id;
  10. } else {
  11. $this->validId = false;
  12. }
  13. }
  14.  
  15. public static getList() { }
  16. public function get() { }
  17. public function delete() { }
  18. public function save($arrayWithParams) { }
  19. }
  20.  
  21. $page = new subpage(134);
  22. $x = $page->get();
  23. $page->delete();
  24. unset($page);
  25. ?>


Jedna z metod (akurat w tym przykładzie) jest niezależna od id podstrony bo defakto odnosi się nie do jednej a do listy podstron.
Zastanawia mnie natomiast jedna kwestia - czy obiektowo poprawnie będzie rozwiązać to tak:
  1. <?php
  2. class subpage {
  3. public static getList() { }
  4. public static function get($id) { }
  5. public static function delete($id) { }
  6. public static function save($id, $arrayWithParams) { }
  7. }
  8.  
  9. $x = subpage::get(134);
  10. subpage::delete(134);
  11. ?>


Druga metoda jest wygodniejsza w użyciu, prędkością się nie różni ale nie wiem czy jest to do końca poprawne.
Z góry dzięki za odpowiedź (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Niestety nie są sensowne. Znalazłem kolejny błąd. Tworzenie obiektu nie jest częścią wywoływania metody - owszem, trzeba to zrobić, ale to robisz RAZ. Dlaczego zatem w pętli wliczasz do wywoływania metody czas tworzenia obiektu?

Cytat
Tutaj faktycznie logiczniej jest tworzyć obiekt i ew. zostawiać część metod statycznych.


Nie przekręcaj mojej wypowiedzi. Napisałem jasno, że metody statyczne powinniśmy tworzyć tylko wtedy, gdy wiemy co robimy, co oznacza, że 99% programistów nie powinno używać ich w ogóle. Nie mówię tu o braku umiejętności (chociaż z drugiej strony... (IMG:style_emoticons/default/smile.gif) ), ale o tym, że ich tak naprawdę w ogóle nie potrzebują. Twój problem akurat wybitnie należy do kategorii problemów, gdzie static nie ma żadnego logicznego uzasadnienia.

Cytat
A jeśli chodzi o klasy z wszystkimi statycznymi metodami to wydaje mi się, że ma to sens w wypadku gdy coś jest często używane w dużej ilości miejsc kodu gdzie przekazywanie uchwytu nie daje korzyści a jest upierdliwe (np. klasa do cache).


To źle Ci się wydaje. Argument "bo jest używane w dużej liczbie miejsc" to brednia do kwadratu, bowiem wtedy musiałbyś w ogóle przestać stosować obiektówkę do większości rzeczy. Co to w ogóle jest "uchwyt do klasy"? Z przykładem z cache też trafiłeś, jak kulą w płot - jest to jeden z fajniejszych tematów do modelowania obiektowego i robiąc tam wszystko statycznie byś go dokumentnie rozwalił.

Ogólnie powiem tak: znasz składnię, wiesz jak działają obiekty, klasy, elementy statyczne. Jednak to, że potrafisz dwie cegły spoić cementem, nie czyni jeszcze z Ciebie architekta. Umiesz używać klas i obiektów, natomiast o programowaniu obiektowym nie masz zielonego pojęcia. Co bym Ci radził na początek, to zostawienie CMS-a i rozpoczęcie od paru ćwiczeń, w trakcie których nie wolno Ci używać słów kluczowych global, static, extends (a i owszem) oraz metod, których nazwy zaczynają się od __, z wyjątkiem __construct() i __destruct(). Ba, powiem nawet więcej: modelując system, powinieneś wręcz zapomnieć o pojęciu klasy, bowiem jak sama nazwa programowanie obiektowe wskazuje, operujemy tu na obiektach i tylko na obiektach, a klasa to jedynie wygodny schemat do tworzenia obiektów o podobnych zadaniach. Co, że restrykcyjne? Nie, to jest istota programowania obiektowego ogołocona ze wszystkich ogłupiaczy. Dopiero gdy się tego nauczysz, będziesz wiedział, że cała reszta to zwykły lukier składniowy i pomoc, która jednak jest pomocą tylko wtedy, gdy znajduje się w doświadczonych rękach.
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: 4.10.2025 - 14:26