Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php] optymalny zapis
S3L41N
post 2.08.2010, 17:34:30
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.12.2007

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


Witam, poszukuję optymalnego sposobu na zapis poniższej funkcji (metoda w klasie, której nie wklejam):

  1. public function __get($key)
  2. {
  3. if (isset($this->$key))
  4. $value = $this->$key;
  5. elseif (isset($this->data[$key]))
  6. $value = $this->data[$key];
  7. else
  8. $value = NULL;
  9. return $value;
  10. }


Gdyby w isset() można było dokonać przypisania, to całość sprowadzałaby się do:

  1. public function __get($key)
  2. {
  3. return (isset($value = $this->$key) OR isset($value = $this->data[$key])) ? $value : NULL;
  4. }


Niestety się nie da. Ma ktoś może jakiś pomysł jak to zoptymalizować?
Go to the top of the page
+Quote Post
zelu
post 2.08.2010, 17:40:06
Post #2





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


  1. return isset( $this->key ) ? $this->key : ( isset( $this->data[$key] ) ? $this->data[$key] : NULL );
Go to the top of the page
+Quote Post
Wicepsik
post 2.08.2010, 17:41:55
Post #3





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


  1. return $this->$key ? $this->$key : ($this->data[$key] ? $this->data[$key] : null);


--------------------
Go to the top of the page
+Quote Post
zelu
post 2.08.2010, 17:49:39
Post #4





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Cytat(Wicepsik @ 2.08.2010, 18:41:55 ) *
  1. return $this->$key ? $this->$key : ($this->data[$key] ? $this->data[$key] : null);


Twoja wersja zwróci Notice'y jeżeli nie będzie któreś z wartości smile.gif

Pozdro
Go to the top of the page
+Quote Post
S3L41N
post 2.08.2010, 17:52:59
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.12.2007

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


No zgadza się, isset()-y celowo dałem. Dzięki za pomoc Panowie.
Go to the top of the page
+Quote Post
Crozin
post 2.08.2010, 17:54:55
Post #6





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

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


Od kiedy to optymalny równa się maksymalnie krótki i nieczytelny?
  1. if (isset($this->$key)) {
  2. return $this->$key;
  3. } else if (isset($this->data[$key])) {
  4. return $this->data[$key];
  5. }
  6.  
  7. return null;
Nie kombinuj tam gdzie nie potrzeba.

EDIT: Ogólnie to masz paskudną strukturę danych.

Ten post edytował Crozin 2.08.2010, 17:55:36
Go to the top of the page
+Quote Post
zelu
post 2.08.2010, 18:02:56
Post #7





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Cytat(Crozin @ 2.08.2010, 18:54:55 ) *
Od kiedy to optymalny równa się maksymalnie krótki i nieczytelny?



A to inna sprawa. Zapis typu ?: jest wolniejszy niz zwykly if - else, wiec Twoje rozwiązanie jest najlepsze smile.gif Źle się zasugerowałem postem kolegi smile.gif

Pozdro
Go to the top of the page
+Quote Post
skarabe.pl
post 2.08.2010, 18:13:28
Post #8





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


Cytat(zelu @ 2.08.2010, 19:02:56 ) *
A to inna sprawa. Zapis typu ?: jest wolniejszy niz zwykly if - else (...)


Czemu?
Go to the top of the page
+Quote Post
zelu
post 2.08.2010, 18:14:22
Post #9





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Nie wiem dlaczego tak jest winksmiley.jpg Tak wynikało z moich testów winksmiley.jpg
Go to the top of the page
+Quote Post
skarabe.pl
post 2.08.2010, 18:21:08
Post #10





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


Cytat(zelu @ 2.08.2010, 19:14:22 ) *
Nie wiem dlaczego tak jest ;) Tak wynikało z moich testów ;)

Trochę bez sensu, no ale :)
Go to the top of the page
+Quote Post
Fifi209
post 2.08.2010, 18:24:53
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(skarabe.pl @ 2.08.2010, 18:21:08 ) *
Trochę bez sensu, no ale smile.gif

Dlaczego bez sensu? Czy coś co jest mniej czytelne, musi być wydajniejsze? smile.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
croc
post 2.08.2010, 18:32:49
Post #12





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


Cytat(zelu @ 2.08.2010, 10:02:56 ) *
A to inna sprawa. Zapis typu ?: jest wolniejszy niz zwykly if - else, wiec Twoje rozwiązanie jest najlepsze smile.gif

Wątpię - a nawet jeśli, to co z tego? Tworzysz grę, która ma śmigać w 60 FPS? Panowie, nie popadajcie w paranoję. Zapis ? : jest tu jak najbardziej w porządku.
Go to the top of the page
+Quote Post
skarabe.pl
post 2.08.2010, 18:47:27
Post #13





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


Cytat(fifi209 @ 2.08.2010, 19:24:53 ) *
Dlaczego bez sensu? Czy coś co jest mniej czytelne, musi być wydajniejsze? :)

Nie nie nie nie - czytelność jest kwestią gustu, bez sensu jest tylko to, że zapis:
  1. $var = condition ? true : false;

który znaczy dokładnie to samo co:
  1. if (condition) {
  2. $var = true;
  3. } else {
  4. $var = false;
  5. }

może być wolniejszy od tego drugiego. Tak przy okazji - nie wyobrażam sobie zapisania skryptu typu:
  1. $zmienna_1 = isset($_POST['zmienna_1']) ? $_POST['zmienna_1'] : '';
  2. $zmienna_2 = isset($_POST['zmienna_2']) ? $_POST['zmienna_2'] : '';
  3. $zmienna_3 = isset($_POST['zmienna_3']) ? $_POST['zmienna_3'] : '';
  4. /* ... */
  5. $zmienna_100 = isset($_POST['zmienna_100']) ? $_POST['zmienna_100'] : '';

W taki sposób:
  1. if (isset($_POST['zmienna_1'])) {
  2. $zmienna_1 = $_POST['zmienna_1'];
  3. } else {
  4. $zmienna_1 = '';
  5. }
  6. if (isset($_POST['zmienna_2'])) {
  7. $zmienna_2 = $_POST['zmienna_2'];
  8. } else {
  9. $zmienna_2 = '';
  10. }
  11. if (isset($_POST['zmienna_3'])) {
  12. $zmienna_3 = $_POST['zmienna_3'];
  13. } else {
  14. $zmienna_3 = '';
  15. }
  16. /* ... */
  17. if (isset($_POST['zmienna_100'])) {
  18. $zmienna_100 = $_POST['zmienna_100'];
  19. } else {
  20. $zmienna_100 = '';
  21. }

nawet w tej, w sposób oczywisty mniej wydajnej wersji:
  1. $zmienna_1 = '';
  2. if (isset($_POST['zmienna_1'])) {
  3. $zmienna_1 = $_POST['zmienna_1'];
  4. }

Dla mnie to pierwsze jest znacznie bardziej czytelne. Ale jak już napisałem - kwestia gustu.
Go to the top of the page
+Quote Post
Crozin
post 2.08.2010, 18:51:01
Post #14





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

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


Zacznijmy od tego, że jak masz taką konstrukcję to jest coś nie tak z Twoimi umiejętnościami. Ale rozumiem, że to tylko na potrzeby przykładu.

Jeszcze tak raz podkreślę: nie szukaj wydajności w takich miejscach - to, że zyskasz 0.00000213 sekundy nic Ci nie da.
Go to the top of the page
+Quote Post
zelu
post 2.08.2010, 18:54:30
Post #15





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


W Twojej wersji jak najbardziej zapis skrócony jest sensowniejszy. Kwesta kompromisu pomiędzy czasem wykonania a przejrzystością kodu. Poza tym rozchodzi się o czas rzędu 3E-6 smile.gif Więc strasznie dużej straty na tym nie ma. Niemniej jednak takowa występuje.

Jednak przy pierwotnym problemie w tym temacie zapis Crozina wydaje mi się najsensowniejszy. Szybszy i jednak bardziej przejrzysty niż zagnieżdżanie ?:

Pozdro
Go to the top of the page
+Quote Post
skarabe.pl
post 2.08.2010, 18:54:57
Post #16





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


Cytat(Crozin @ 2.08.2010, 19:51:01 ) *
Jeszcze tak raz podkreślę: nie szukaj wydajności w takich miejscach - to, że zyskasz 0.00000213 sekundy nic Ci nie da.

Spoko spoko - nie ja podniosłem kwestię wydajności. Ale to trochę tak jak z ++$i zamiast $i++ - nikt nikomu nie każe przeglądać wszystkich swoich skryptów i zamieniać jedno na drugie. Ale nie zaszkodzi, jeśli to pierwsze wejdzie w krew (i szablony kodu :)).
Go to the top of the page
+Quote Post
S3L41N
post 2.08.2010, 23:30:23
Post #17





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.12.2007

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


No dobrze, ważna jest czytelność kodu, a czy poniższy zapis jest nieczytelny?
  1. public function __get($key)
  2. {
  3. return (isset($this->$key) ? $this->$key :
  4. (isset($this->data[$key]) ? $this->data[$key] :
  5. NULL;
  6. }

Jeżeli ktoś posiada konkretną wiedzę czy i jeśli tak to kiedy wskazane jest używanie skróconego zapisu za pomocą ternary operator-a będę niezmiernie wdzięczny za wytyczne.
Go to the top of the page
+Quote Post
Fifi209
post 2.08.2010, 23:53:27
Post #18





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(skarabe.pl @ 2.08.2010, 18:47:27 ) *
Nie nie nie nie - czytelność jest kwestią gustu, bez sensu jest tylko to, że zapis:
Dla mnie to pierwsze jest znacznie bardziej czytelne. Ale jak już napisałem - kwestia gustu.

Jeżeli robisz to w sposób, który przedstawiłeś na forum to nie skomentuję...
Co do wydajności - wrzuć sobie w pętlę z 100 tysięcy raz, wyciągnij czasy, podaj czas średni i porównaj - może się mylimy... smile.gif Ja nie idę w zapartego, że jest tak jak My piszemy i nie podważam za wszelką cenę Twoich teorii.
Cytat(skarabe.pl @ 2.08.2010, 18:54:57 ) *
Ale to trochę tak jak z ++$i zamiast $i++ - nikt nikomu nie każe przeglądać wszystkich swoich skryptów i zamieniać jedno na drugie.


No i tutaj byś się zdziwił, jest różnica czy używasz ++$i czy $i++
Miłego czytania


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
kapuch
post 3.08.2010, 00:00:41
Post #19





Grupa: Zarejestrowani
Postów: 389
Pomógł: 69
Dołączył: 26.04.2010
Skąd: Łódź

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


Cytat(fifi209 @ 3.08.2010, 00:53:27 ) *
No i tutaj byś się zdziwił, jest różnica czy używasz ++$i czy $i++
Miłego czytania

wystarczy ze wklepie echo winksmiley.jpg
  1. $i = 0;
  2. echo $i++; // 0
  3. echo $i; // 1
  4. echo ++$i; // 2


Ten post edytował kapuch 3.08.2010, 00:01:40


--------------------
Nie chce "Pomógł", aktualna ilość (69) w pełni mnie satysfakcjonuje :)
Go to the top of the page
+Quote Post
Fifi209
post 3.08.2010, 00:02:41
Post #20





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(kapuch @ 3.08.2010, 00:00:41 ) *
wystarczy ze wklepie echo winksmiley.jpg
  1. $i = 0;
  2. echo $i++; // 0
  3. echo $i; // 1
  4. echo ++$i; // 2

No i moim zdaniem jest to BARDZO duża różnica i jeżeli ktoś nie widzi tej różnicy lub o tym nie wie, znając życie przyleci na forum i będzie pytał: Dlaczego mi skrypt źle działa?


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 12.06.2025 - 11:43