Scrie o funcție în PHP 7+ care să verifice un număr natural


#41

Nu merge așa. Nu poți să faci o funcție care să arunce erori. Pe același principiu e subiectul meu anterior. Pe mine nu mă afecta problema, dar mă umplea de erori în logs. Nici nu trebuia precizat asta în cerințe. E clar.

Am spus fără funcții.


(Cosmin Popescu) #42

pai si @iamntz a folosit-o. Poti privi assert ca un fel de unit test


assert() is a language construct in PHP 7, allowing for the definition of expectations: assertions that take effect in development and testing environments, but are optimised away to have zero cost in production.


(Ionuț Staicu) #43

assert e doar pentru testare. :slight_smile:


#44

Mă refer la numărul de caractere al codului.

Presupunând că face cineva funcția, e așa greu să o și minificați cât se poate de mult ?

Am explicat mai sus. Nu este eficient și recomandat să scriem cât mai puțin cod când facem un script ? Eu zic că da. Vreau să văd cât de puține caractere puteți folosi în cod. Am dat și exemplu mai sus.


(Catalin Ionut) #45

Asta este o gandire extraordinar de gresita si in mod clar nerecomandata.
Noi scriem cod ca sa-l intelegem ca oamenii, cu nume cat mai descriptive si comentarii acolo unde trebuie.
Also nu are rost sa reinventezi roata atata timp cat uneltele sunt disponibile

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.


#46

Trimite un obiect în funcție.

Ce zice ? Eroare ? Nu e voie.


(Serghei Amelian) #47

Ce ziceai de funcţia mea? Eu nu văd nicio eroare.


(Serghei Amelian) #48

Numărul de caractere al codului? Sper că glumeşti :slight_smile:


(Ionuț Staicu) #49

Am mutat lucrurile într-un thread nou. A deviat instant de la discuția lui @matthers.


(Ionuț Staicu) #50

@serghei @Catalin-Ionut : am zis mai sus care-i ideea din spatele acestor reguli:


(Alex) #51

unul din primele chestii pe care le-am invatat a fost: @s@ nu.


#52

Puteam să-i cer orice inițiatorului ca să-i testez cunoștințele, inclusiv lucrul cu operatorul @.

Că e recomandat să nu-l folosești, nu știu ce să zic. Trimitem un mail la PHP, să le spunem să-l scoată în versiunea viitoare ?


(Alex) #53

notice-ul ala ca faci conversie din obiect in int n-are voie sa apara acolo. n-ai tratat cazul in care parametrul ala e obiect.

ps. daca-ti pun null o sa-mi spuna ca-i adevarat. si nu-i


(Alex) #54

dap. si cu ocazia asta ii sugeram sa scoata si toate metodele built in.


#55

Gândire greșită… ?

Era vorba despre testarea cunoștințelor PHP !

Atât timp cât este disponil în PHP, pune-ți mintea la contribuție, respectă cerințele și fă funcția. Nu a spus nimeni s-o și folosească.

Dar, dacă te concentrezi pe ce ai făcut acolo, îți dai seama că cuprinde lucruri din PHP care nu sunt atât de uzuale deși ele există. Sau sunt uzuale, dar nu în contextul pe care l-am cerut eu. Pare simplu, dar uite că nu e.

Și uite așa am ajuns la a cere o funcție pe care încă nu am primit-o. Tocmai pentru că dă bătăi de cap.

@serghei și @Cosmin_Popescu, verificați astea:

is_natural((object)['caught' => true]);

CheckIfIsNumber((object)['caught' => true])

Fără să genereze erori. E așa de complicat ?


(Serghei Amelian) #56

Bineînţeles că e complicat, nu e nevoie să fii arogant, că nu e cazul. Inconsistenţa dintre string si asignarea directă rămâne oricum validă.

function is_natural($nr = null)
{
    return $nr !== (object)$nr && $nr == (int)$nr && $nr >= 0 && $nr <= 9876543210;
}

(Cosmin Popescu) #57

Am actualizat raspunsul
Este perfect ok sa ne jucam. Eu sunt curios si de alte abordari :slight_smile:


(Andrei F.) #58

am facut si eu o incercare: https://3v4l.org/7VdUv

Am respectat si dorinta lui @Dexter de a minimiza codul functiei, desi mi s-a parut una dintre cele mai inutile si idioate cerinte.

Nu e cel mai scurt raspuns insa (cred ca) acopera toate cazurile mentionate pana acum. Inclusiv pe cele ale lui @iamntz pe care nu se supara ca le-am preluat (sper :smiley: )


(Cosmin Popescu) #59

Ma irita sa scriu fara spatii, indentari si alte chestii de coding style :))
Net beans ul meu avea intentia sa imi faca codul frumos, dar i-am dat peste nas ! :joy:


#60

Done:

unset($Dexter['arogant']);

Serghei, să ne înțelegem pe un lucru.

Indiferent dacă trimiți “123” sau 123, funcția trebuie să returneze true pentru că sunt într-adevăr numere naturale. Că unul este în format string și celălalt integer, este irelevant. Asta presupunând că e neclar pentru cineva.

Cât despre funcția ta, încă sunt probleme:

is_natural(2.0)

și

is_natural('2.0')

Returnează true.

@Cosmin_Popescu

CheckIfIsNumber('2.0')

returnează null, iar null nu este o valoare booleană.

PS: Văd că nimeni nu a luat în considerare și cerința ca codul să conțină cât se poate de puține caractere. Chiar vi se pare că nu este un aspect important ?