Zmienne lokalne i sprawdzanie argumentów |
Zmienne lokalne i sprawdzanie argumentów |
14.11.2017, 13:12:45
Post
#1
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) |
W sumie dwa pytania:
1. Czy używacie specjalnych zmiennych lokalnych wewnątrz funkcji żeby zwiększyć czytelność kodu? Zamiast:
Coś takiego:
W książce "Kod doskonały" autor pisze, że jest to dobry zwyczaj bo jest jasne co jest wartością zadaną a co wyjściową. Ale zastanawiam się jak to jest w praktyce. 2. Czy sprawdzanie argumentów funkcji ma zawsze sens? Przykładowo
Na ogół tak robię zakładając, że nie ma sensu wykonywać jakiś operacji jeżeli nie ma na czym tego wykonać (wartość równa null). Ale może to niepotrzebne komplikowanie kodu gdyż (jak zakładam) PHP nie będzie wykonywać operacji na pustych danych? Cały czas mam na myśli właśnie takie małe, dość proste funkcje a nie bardziej złożone gdzie kontrola argumentów jest po prostu konieczna. Ten post edytował Brick 14.11.2017, 13:18:23 -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
14.11.2017, 13:21:01
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
1. zależy od kontekstu. Ja używam zazwyczaj tylko jak potrzebuję oryginalną zmienną gdzieś jeszcze. I kod też od razu zamiast return $string, return some();
2. Wiesz że jest PHP 7 i to co opisałeś załatwia się bezpośrednio? https://seld.be/notes/php-versions-stats-2017-2-edition Według statystyk packagist PHP 7 to już prawie 70% wszystkich wersji. Może pora przestać udawać że nie istnieje? -------------------- |
|
|
14.11.2017, 13:40:57
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
1. Każdy sobie jak woli.
2. Tu type hint załatwia sprawę.Oczywiście PHP7. |
|
|
14.11.2017, 22:19:54
Post
#4
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) |
A jak nie macie na serwerze dostępnej wersji PHP 7? Niestety trafiają mi się takie serwery (np. na jakiejś uczelni).
Nie bierzecie takich zleceń? A w czasach gdy nie było PHP 7 to jak robiliście? Sprawdzaliście czy nie? Ciekawy jestem czy PHP wykona jakąś dodatkową pracę jeżeli zmienna nie będzie pusta a sama funkcja będzie dość rozbudowana tj wiele będzie wykonywać wiele różnych operacji na tej zmiennej. -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
15.11.2017, 06:43:19
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 828 Pomógł: 225 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) |
To zalezy od rozbudowania kodu.
Jeżeli masz bardzo dużo zmiennych których trzeba sprawdzić, to oczywiście taka funkcja będzie potrzebna. Ale czasem nawet w wersjach starszych wystarczy: isset($string) ? $string : 'brak_stringa'; A co do wersji PHP, szczególnie uczelnie powinny mieć aktualne wersje PHP, jeżeli nie mają należy im to zgłosić, zwykle administratorzy uczelnianych serwerów zabierają się do pracy gdy jest takie zapotrzebowanie. Znam to z autopsji. |
|
|
15.11.2017, 08:49:10
Post
#6
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Ogólnie metoda powinna sprawdzać to co dostaje w myśl zasady "Nigdy nie wierz użytkownikowi", więc jeśli nie masz silnego typowania np. string, array, int to ta, trzeba to sprawdzać ręcznie wg. wymogów metody. A jak to juz wedle widzimisię. Ale wygodne jest np. użycie lib: https://github.com/beberlei/assert
|
|
|
15.11.2017, 11:01:44
Post
#7
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) |
Chodzi mi o przypadek w którym wartość w argumencie w ogóle nie jest wymagana, tzn prawidłowe działanie funkcji też jest takie że nic nie zwraca. Czyli np string wsadowy może być pusty i wtedy funkcja zwróci pusty wynik. I to jest ok tylko czy te wszystkie operacje które wykona na pustym stringu będą jakimś obciążeniem dla serwera?
Może trzeba by zapytać twórców PHP jak to właściwie działa ... Ciekawa ta biblioteka beberlei/assert. Używa się tego tylko do pisania testów czy normalnie w produkcji? Co do wersji PHP na serwerach to różnie z tym bywa. Z mojego doświadczenia wynika że im większa uczelnia tym większa bezwładność i biurokracja. Są takie które zaktualizują a są takie w których odpowiedź jest "nie przewidujemy obecnie aktualizacji" i tyle. Zresztą czasem od razu w specyfikacji zapytania ofertowego jest określona wersja PHP. Są też firmy, które mają swoje serwery i wychodzą z założenia że jak działa to nic nie trzeba ruszać (poza aktualizacjami bezpieczeństwa). No i zadają proste pytanie: "A na starszej wersji PHP to da się zrobić? Jak się da to o co chodzi?". Trochę zjeżdżam z tematu ale chyba nie ma sensu zakładać nowego wątku choć zagadnienie ciekawe. -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
15.11.2017, 11:10:44
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
beberlei/assert normalnie na prod. właśnie żeby nie robić ifów, po prostu pakujesz wartość i jak coś nie gra to rzuca wyjątkiem.
Co do sprawdzania powiem jeszcze raz, sprawdzaj zawsze bo jesli oczekujesz string jako input to tak ma być, a każda inna powoduje jakąś akcję albo exception, albo zwrot domyślnego return. |
|
|
15.11.2017, 12:53:11
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 440 Pomógł: 6290 Dołączył: 27.12.2004 |
Cytat function convertString($input_string) { $converted_string = $input_string; $converted_string = doSomething($converted_string); return $converted_string; } W książce "Kod doskonały" autor pisze, że jest to dobry zwyczaj bo jest jasne co jest wartością zadaną a co wyjściową. Ale zastanawiam się jak to jest w praktyce. Przyklad co podales, to powinien wygladac w ogole tak:
zas to co zrobiles tutaj $converted_string = $input_string; to juz totalna bzdura. Musiales zle zrozumiec co napisali w ksiazce zas co do przykladu: Cytat function convertString($string) { if ($string) { $string = doSomething($string); } return $string; } To unikaj zagniezdzen i koncz funkcje jesli nie ma racji bytu reszta logiki, np:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
15.11.2017, 14:25:07
Post
#10
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) |
Dzięki za odpowiedzi.
W książce chodziło trochę o inny przypadek, gdy argument funkcji nazywa się inputValue i potem w ciele funkcji robi się na nim różne działania i na końcu jest zwracana zmienna, dalej nazywająca się inputValue. To jest jasny przypadek, że tak nie powinno się robić bo wprowadza w błąd. Ale zastanawiałem się czy ma sens pójście krok dalej czyli trochę sztuczne dodatkowe nazywanie zmiennych. W moim przykładzie "doSomething" jest oczywiście bardziej złożoną procedurą, więc użycie zmiennej robi się konieczne. No ale chyba macie rację, takie kombinowanie sztuczne z nazwami nie ma sensu. -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
15.11.2017, 14:28:39
Post
#11
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
A to też zależy. Bo np metodlogia pracy z valueObject zakłada że każda modyfikacja produkuje nowy element.
Więc np:
To oczywiscie bardzo szkicowy przykład i pozostawia wiele do życzenia ale chodzi o koncept. |
|
|
15.11.2017, 14:34:25
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 440 Pomógł: 6290 Dołączył: 27.12.2004 |
Cytat ale chodzi o koncept. A mozesz wyjasnic jasniej ten koncept? Bo ja szczerze nie zrozumialem, zas kod co tu masz to bym napisal poprostu tak:
Od biedy tak:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
15.11.2017, 14:47:22
Post
#13
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Value Object czyli że każda modyfikacja obiektu prowadzi do utworzenia nowego obiekktu.
Tutaj to jest dość prosty przykład. Ale mając dużo większą logikę w metodzie rozbicie wejścia na kilka zmiennych opisujących ich stan da nam obraz kiedy i gdzie zmienia się stan naszej zmiennej wejściowej. |
|
|
15.11.2017, 14:49:14
Post
#14
|
|
Grupa: Moderatorzy Postów: 36 440 Pomógł: 6290 Dołączył: 27.12.2004 |
Cytat Value Object czyli że każda modyfikacja obiektu prowadzi do utworzenia nowego obiekktu. Ja to wiem (bylismy na tej samej sesji ). Nie wiem jednak jak ma sie do tego twoj kod, temu pytam
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
15.11.2017, 15:07:15
Post
#15
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Tak że transformacja generuje nowy zestaw danych. Chodzi po prostu o rozróżnianie co jest czym.
Nie mówię też że zawsze i wszędzie takie podejście bo tutaj w przypadku takim co podałem faktycznie nie ma to sensu bo metoda jest do ogarnięcia. Ale jesli już metoda ma wielkość ekranu to robi się bardziej zawile. |
|
|
15.11.2017, 15:17:44
Post
#16
|
|
Grupa: Moderatorzy Postów: 36 440 Pomógł: 6290 Dołączył: 27.12.2004 |
No dobrze, ale niewazne czy masz ValueObject czy poprostu tekst, to przy bardzo zawilym kodzie, odpowiednie nazewnictwo zmiennych ma znaczenie tak czy siak
takze zmierzam do tego, ze uzywanie ValueObject nie wymusza na nas zmieniania nazw zmiennych. Zmiana nazw zmiennych jest potrzebna dla czytelnosci tylko, prosty przyklad
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
Wersja Lo-Fi | Aktualny czas: 29.03.2024 - 06:28 |