Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> metody statyczne czy instancyjnye, czy jedno ma jakąś przewagę nad drugim?
Rozpalacz
post 13.01.2015, 13:36:54
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Witam,

tak się zastanawiam jaka jest wyższość klas/metod instancyjnych nad statycznymi. Czy ma ktoś dobry przykład że lepiej zastosować gdzieś klasę/metodę instancyjną niż statyczną? Bo chyba wszystko można zrobić statycznie...
Go to the top of the page
+Quote Post
Crozin
post 13.01.2015, 13:55:15
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Wtedy taki kod jest kompletnie bez sensu, bo klasa staje się niczym innym jak synonimem dla przestrzeni nazw. Nie da się utworzyć dwóch obiektów o różnych wartościach.

Generalnie w OOP trzeba się dosyć mocno nagłowić by znaleźć uzasadniony przypadek dla użycia statycznych metod/właściwości.

Ten post edytował Crozin 13.01.2015, 13:55:59
Go to the top of the page
+Quote Post
MESSIAH :)
post 13.01.2015, 14:47:30
Post #3





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Metoda statyczna
  1. <?php
  2. Class Static0 {
  3.  
  4. public static $counter = 0;
  5.  
  6. public static function incrByTwo()
  7. {
  8. self::$counter = self::$counter + 2;
  9. }
  10. }
  11.  
  12. Class Static1 extends Static0 {
  13.  
  14. public static function incrByOne()
  15. {
  16. self::$counter = self::$counter + 1;
  17. }
  18.  
  19. public static function incrByTwo()
  20. {
  21. parent::incrByTwo();
  22. }
  23. }
  24.  
  25. $time_start = microtime(true);
  26. for($i=0;$i<100000;$i++) {
  27. Static1::incrByOne();
  28. Static1::incrByTwo();
  29. }
  30.  
  31. echo Static0::$counter ;
  32. $time_end = microtime(true);
  33. $time1 = $time_end - $time_start;
  34. ?>
  35. Total execution time is <?php echo $time1;?>
  36. Used memory: <?php echo memory_get_usage();?>

Metoda non-static:
  1. <?php
  2.  
  3. Class Static0 {
  4.  
  5. public $counter = 0;
  6.  
  7. public function incrByTwo()
  8. {
  9. $this->counter = $this->counter + 2;
  10. }
  11. }
  12.  
  13. Class Static1 extends Static0 {
  14.  
  15. public function incrByOne()
  16. {
  17. $this->counter = $this->counter + 1;
  18. }
  19.  
  20. public function incrByTwo()
  21. {
  22. parent::incrByTwo();
  23. }
  24. }
  25.  
  26. $time_start = microtime(true);
  27. $obj = new Static1();
  28. for($i=0;$i<100000;$i++) {
  29. $obj->incrByOne();
  30. $obj->incrByTwo();
  31. }
  32.  
  33. echo $obj->counter ;
  34.  
  35. $time_end = microtime(true);
  36. $time1 = $time_end - $time_start;
  37. ?>
  38.  
  39. Total execution time is <?php echo $time1;?>
  40. Used memory: <?php echo memory_get_usage();?>

Jak widać w tym teście metoda statyczna jest szybsza. Ja jestem zwolennikiem tej metody dlatego ją stosuje.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 13.01.2015, 14:54:58
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Polecam: http://webmastah.pl/php-go-home-static-youre-drunk/
Go to the top of the page
+Quote Post
MESSIAH :)
post 13.01.2015, 15:21:44
Post #5





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Na tej stronie jak sam tytuł mówi autor pisał artykuł pod wpływem alkoholu. Twierdzi, że static powinien umrzeć - jedno stwierdzenie się nasuwa. Jeśli autor jest zawodowym znawca i profesjonalnym php'owcem niech przebuduje wszystkie frameworki, cms i tym podobne i niech pousuwa static. Skoro frameworki używają static to chyba nie w celu pogorszenia jakości skryptu.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 13.01.2015, 15:53:09
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


O jakich static'ach mówisz? O Fasadach w Laravelu? O innych ciekawych tworach które mają tylko ułatwiać życie aby nie tworzyć sztucznie dostępu do czegoś co już jest?

Podaj przykłady dlaczego Static jest lepsze od non-static. Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie. Więc ihmo wychodzi na 0.
Go to the top of the page
+Quote Post
MESSIAH :)
post 13.01.2015, 15:55:55
Post #7





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


http://alembic-dev.com/php-static-vs-instance-benchmark/

Dziwne bo w testach static wykazuje mniejsze zużycie pamięci o około 1%
Cytat
Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie

Jak mam to rozumieć? Jeśli wprowadzę klasę z wartościami statycznymi wtedy zajmują one miejsce w RAM? A jeśli zastosuje non-static to wtedy wartości zostaja umieszczone w RAM i mają wielkość 0b? Dziwne bo według mnie każdy znak zajmuje miejsce w RAM.

Ten post edytował MESSIAH :) 13.01.2015, 16:00:58


--------------------
Go to the top of the page
+Quote Post
by_ikar
post 13.01.2015, 16:07:08
Post #8





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(MESSIAH :) @ 13.01.2015, 14:47:30 ) *
Jak widać w tym teście metoda statyczna jest szybsza. Ja jestem zwolennikiem tej metody dlatego ją stosuje.


tzn szybsza w czym? Twój test u mnie wygląda tak: https://dl.dropboxusercontent.com/u/3624937...-non-static.png

Nie bardzo widzę kolosalną różnicę między szybkością, nawet jeżeli non static wypada lepiej.

To że ludzie jeżdżą pasatem, wcale nie znaczy że lamborghini aventador jest gorszym samochodem. Po prostu pasat jest tańszy. Podobnie jest IMO z static, dużo łatwiej wykorzystać singletona, niż jakoś sensownie rozplanować aplikacje która będzie wykorzystywać IoC/DI.

A powiedz mi jeszcze, co jest łatwiej testować?
Go to the top of the page
+Quote Post
MESSIAH :)
post 13.01.2015, 16:59:08
Post #9





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Cytat(Pyton_000 @ 13.01.2015, 15:53:09 ) *
O jakich static'ach mówisz? O Fasadach w Laravelu? O innych ciekawych tworach które mają tylko ułatwiać życie aby nie tworzyć sztucznie dostępu do czegoś co już jest?

Podaj przykłady dlaczego Static jest lepsze od non-static. Kwestia wydajności jest tutaj średnim argumentem, bo static zajmuje pamięć, a non-static nie. Więc ihmo wychodzi na 0.

Kolega chyba źle wkleił kody które podałem lub ma stara wersję PHP. Przeprowadziłem jeszcze raz testy i zwiększyłem liczbe pętli oto wyniki:
Static:
9000000 Total execution time is 5.2813019752502 Used memory: 130240
NoStatic:
9000000 Total execution time is 5.7793300151825 Used memory: 130528
Jak więc wydzimi static jest szybsze i nie pożera pamięci. Jesli już piszemy o samochodach to nie marka jest ważna a prędkość i pojemność. Kto by nie chciał samochodu 10 osobowego z ogromnym bagażnikiem, który osiąga 100km w 0,5s? Jeśli juz porównujesz ststic vs nostatic do marka vs marka wniosek nasuwa sie tylko jeden = kto używa nostatic woli markę a kto używa static woli prędkość i pojemność. Dziękuję, do widzenia.


--------------------
Go to the top of the page
+Quote Post
piotrooo89
post 13.01.2015, 20:57:19
Post #10


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




Przepraszam z góry z kolokwializmy.
Pytanie jest w stylu "robić kupę" czy "sikać", nie da sie tego jednoznacznie określić poprostu zależy od potrzeby.

@MESSIAH z całym szacunkiem ale Twoje testy nie dowodzą absolutnie nic. Wydaje mi sie że dalej jesteś w erze Athlona 1.7 i jak reprezentujesz rekord z bazy np. poprzez ActiveRecord pattern ja sobie nie umiem wyobrazić tego, no chyba że jak to w środowisku programistów PHP się przyjęło stosujesz AOP (array oriented programming), sorry ale może lepiej właśnie czasem pomyśleć o patternach i dobrych praktykach niż mierzyć wszystko co do nanosekundy bo później w światku IT programiści PHP postrzegani są jak "lewary".


--------------------
Go to the top of the page
+Quote Post
by_ikar
post 13.01.2015, 21:06:57
Post #11





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(MESSIAH :) @ 13.01.2015, 16:59:08 ) *
Kolega chyba źle wkleił kody które podałem lub ma stara wersję PHP. Przeprowadziłem jeszcze raz testy i zwiększyłem liczbe pętli oto wyniki:
Static:
9000000 Total execution time is 5.2813019752502 Used memory: 130240
NoStatic:
9000000 Total execution time is 5.7793300151825 Used memory: 130528
Jak więc wydzimi static jest szybsze i nie pożera pamięci. Jesli już piszemy o samochodach to nie marka jest ważna a prędkość i pojemność. Kto by nie chciał samochodu 10 osobowego z ogromnym bagażnikiem, który osiąga 100km w 0,5s? Jeśli juz porównujesz ststic vs nostatic do marka vs marka wniosek nasuwa sie tylko jeden = kto używa nostatic woli markę a kto używa static woli prędkość i pojemność. Dziękuję, do widzenia.


Wkleić źle kod, tak żeby zużywał mniej pamięci? Ciekawe wnioski ;)

Powiadasz że 288 bajtów jest wyciekiem pamięci, tak poważnym, aby utrudniać sobie testy jednostkowe? Jak wygląda u ciebie testowanie takich statycznych aplikacji, masz na to jakiś złoty środek, czy testów nie robisz wcale ?
Go to the top of the page
+Quote Post
piotrooo89
post 13.01.2015, 21:09:55
Post #12


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




@by_ikar akurat testy statycznych metod są proste możesz pokryć cały kod. 288 to większe zużycie - nie wyciek smile.gif


--------------------
Go to the top of the page
+Quote Post
Dejmien_85
post 15.01.2015, 15:57:30
Post #13





Grupa: Zarejestrowani
Postów: 251
Pomógł: 23
Dołączył: 23.04.2013

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


Cytat(piotrooo89 @ 13.01.2015, 21:09:55 ) *
@by_ikar akurat testy statycznych metod są proste możesz pokryć cały kod.


Normalnie mam ochotę wrzucić to na demotywatory (albo kwejka). wink.gif

Od kiedy to statyczne twory, które posiadają jeden stan i są dostępne GLOBALNIE są łatwe do testowania?

Oj, kolego, chyba jeszcze nie słuchałeś opowieści starych rzemieślników mówiących na prawo i lewo, że ze "statyką" to trzeba ostrożnie postępować? wink.gif

Czyżbyś zapomniał o tym, że jeśli są dostępne globalnie, to z każdego miejsca możesz zmienić ich stan, a wtedy automatycznie zmienia się on
we wszystkich miejscach aplikacji i może wywołać efekty uboczne we wszystkich tych miejscach?

Ja się zgodzę, że jakiś mały helperek, typu hashPassword(), który zwraca hasha jest łatwy do testowania. Ale jeśli
w metodzie statycznej znajdzie się choć troszkę logiki, albo jakieś zmienne, wtedy powiedzieć mogę jedynie: "Z Bogiem, chłopcze - może pomoże". ; )

Disclaimer: Metody statyczne mają swoje dobre strony, zdarza mi się ich używać.

Cytat(Pyton_000 @ 13.01.2015, 14:54:58 ) *


Nie ma to jak przedstawić używanie grzebienia na głowie łysego i powiedzieć, że grzebień jest złym narzędziem do czesania łysych... Takie coś zrobić może jedynie Geniusz! ; )

Ten post edytował Dejmien_85 15.01.2015, 16:55:30
Go to the top of the page
+Quote Post
piotrooo89
post 16.01.2015, 09:17:43
Post #14


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




Cytat(Dejmien_85 @ 15.01.2015, 15:57:30 ) *
Ja się zgodzę, że jakiś mały helperek, typu hashPassword(), który zwraca hasha jest łatwy do testowania. Ale jeśli
w metodzie statycznej znajdzie się choć troszkę logiki, albo jakieś zmienne, wtedy powiedzieć mogę jedynie: "Z Bogiem, chłopcze - może pomoże". ; )


Zgadzam się w 100%, o właśnie takie testy mi chodziło, prosty metod bibliotecznych, fabryk. Testy jednostkowe dla takich rzeczy są proste. Nigdy nie stosowałem logiki w statycznych polach/metodach więc nawet nie pomyślałem o czymś takim.


--------------------
Go to the top of the page
+Quote Post
nrm
post 7.02.2015, 12:44:57
Post #15





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


Kontynuując temat zapalny (zawsze z tego jakieś hejty się rodzą biggrin.gif ) jakim są metody statyczne: http://webmastah.pl/jak-programowac-obiekt...ach-ten-static/


--------------------
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: 29.03.2024 - 16:44