Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Jak vyvíjet komfotrněji?

Nová verze Nette 2.3.7 přináší spoustu vylepšení, jedno z nich si ale rychle zamilujete. Jsou to chybové hlášky, které se vám pokusí napovědět, pokud uděláte překlep.

Určitě jste už někdy narazili na podobnou chybu:

Chcete v šabloně vykreslit komponentu a ona prý neexistuje. Může to mít celou řadu příčin, od nějakého opomenutí na straně presenteru, až po chybu v šabloně. Nebo se komponenta jmenuje jinak?

Nejhorší ze všeho jsou triviální přelkepy, které nevidíte, takže několikrát prověříte všechny možnosti a strávíte na tom dost času, než chybu odhalíte.

Nejnovější verze Nette má ale šikovnější chybovou hlášku:

Did you mean ‚signInForm‘? Aha! Hned je jasné, že na vině byl překlep a můžete ho rovnou opravit.

Pokud jste se někdy dlouze zasekli na velikosti písmenek, tj. že vám {control MyComponent} hlásil chybu Component with name ‚MyComponent‘ does not exist, o to více oceníte dovětek did you mean ‚myComponent‘?.

Pojďme k Nette\Database. Chybka v názvu databázového sloupce? Opět ji dostanete na stříbrném podnose:

Mimochodem, stejná feature bude i v příští verzi dibi, kterou prosím před vydáním otestujte.

Nette napovídá překlepy v názvech funkcí, metod, proměnných atd. Pokud vyvíjíte v IDE, neměly by se vám podobné chyby stávat, na druhou stranu málokteré IDE dokáže plnohodnotně napovídat třeba v šablonách. Ať už se spletete v názvu filtru nebo makra:

Případně v názvu proměnné:

Hláškou did you mean novinky zvyšující pohodlí nekončí. Nette vás nově upozorní na celou řadu dalších, dříve špatně odhalitelných, chyb. Jako například chybějící []

$myForm->onSuccess = [$this, 'myFormSucceeded'];
// namísto správného
$myForm->onSuccess[] = [$this, 'myFormSucceeded'];

nebo chybějící ()

{foreach $form->getErrors as $error}
// namísto správného
{foreach $form->getErrors() as $error}

či docela nebezpečné opomenutí, jelikož $user->isLoggedIn je vždy truthy:

{if $user->isLoggedIn} ... něco tajného ... {/if}
// namísto správného
{if $user->isLoggedIn()} ... něco tajného ... {/if}

To nyní povede k varování Did you forget parentheses after isLoggedIn?

Poznámka: pokud záměrně píšete v kódu metodu bez závorek, tj. $cb = $obj->getItems, protože chcete využít vlastnosti Nette\Object, která takto do $cb uloží callback na metodu getItems, a objeví se varování, použijte prosím standardní PHP zápis, tj. $cb = [$obj, 'getItems']. Při korektních běžných použitích se varování nezobrazuje.

Dále Latte vás upozorní, když použijete modifikátor na místě, kde se ignoruje, jako například:

{if $var |filter}

Did you mean „komfortněji“?

Nová verze Nette je tu od toho, aby vám usnadnila a zpříjemnila vývoj. A jak je to napovídání boží si doopravdy uvědomíte, až to vyzkoušíte.

Komentáře

  1. Petr Novák #1

    avatar

    Je možné to s těma závorkama nějak vypnout, tj. aby
    $cb = $obj->getItems fungovalo?

  2. Luki #2

    avatar

    Už jsem „did you mean“ dokonce po updatu (asi 10 minut po) využil a byl jsem za ni rád. Docela mě zajímá jak to vlastně funguje a detekuje. Musím prostudovat.

    před rokem | odpovědět
  3. Filip Hájek http://hajekfilip.cz/ #3

    avatar

    Skvělé! Může to být ještě pohodlnější?! Díky!

    před rokem | odpovědět
  4. Lukáš Novotný #4

    Měl bych jeden návrh až skoro prosbu. Nešlo by vizuálně oddělit první a druhý řádek té chybové hlášky? Neboli to, že je to Notice mě až tak nezajímá, jako druhý řádek s důležitou informací, která se v červené ploše ztrácí, nenajdu to zkrátka na první pohled.
    Díky a sorry za OT.

    před rokem | odpovědět | reagoval [13] David Grudl
  5. David Růžička http://www.david-ruzicka.com/ #5

    avatar

    Hezké, ale stále je to na půli cesty. Ať to Nette rovnou opravuje, když ví, kde je chyba :-)

    před rokem | odpovědět | reagoval [6] Luki [13] David Grudl
  6. Luki #6

    avatar

    #5 Davide Růžičko, No nevím to mi přijde jako docela nebezpečné, co když se Nette netrefí a změní něco v projektu a odhalení takové chyby může být náročnější než samotný překlep, který díky takové hlášce odhalím rychle. Podle mě tohle je ideální stav.

    před rokem | odpovědět | reagoval [8] David Růžička [14] Caine
  7. Kit #7

    avatar

    #1 Petře Nováku, Co má $obj->getItems dělat? Myslím si, že je lepší psát objektově.

    před rokem | odpovědět
  8. David Růžička http://www.david-ruzicka.com/ #8

    avatar

    #6 Luki, To byl samozřejmě vtip.

    před rokem | odpovědět | reagoval [12] Luki
  9. bckp #9

    avatar

    Davide, prosímtě, počkej s vydáním Dibi 2.4.0 do zítřka, mám rozpracovaný commit pro přidání podpory Offset dle verze MsSQL, tak jak jsem přidával do PDO driveru.

    Ještě to musím doladit a dopsat testy

    před rokem | odpovědět | reagoval [13] David Grudl
  10. Aurielle https://www.aurielle.cz #10

    avatar

    #1 Petře Nováku, Můžeš použít shut-up operátor @.

    před rokem | odpovědět
  11. Kuboslav #11

    avatar

    Když volám třídu z namespace (bez překlepu) a zapomněl jsem použít use, upozorní mě to?

    před rokem | odpovědět | reagoval [13] David Grudl
  12. Luki #12

    avatar

    #8 Davide Růžičko, Tak to pak jo. :-)

    před rokem | odpovědět
  13. David Grudl http://davidgrudl.com #13

    avatar

    #1 Petře Nováku, globálně to vypnout v tuto chvíli nejde. Problém je v tom, že nelze rozlišit mezi opomenutím závorek a jejich záměrným vynecháním, takže varování se zobrazí jen pokud metoda nemá žádné povinné parametry a její název začíná na get|is|has, tj. jde o getter – řeší se tím zmíněné situace, jako je getErrrors nebo isLoggedIn.

    Falešná varování jsou samozřejmě nepříjemná, ale mám za to, že raději jedno falešné, které lze snadno vyřešit (přepisem na klasický callback, případně zavináčem @), hlavně když to upozorní na vážný problém.

    Pokud bys na falešná varování narazil, dej vědět do tohoto vlákna a najdeme řešení.

    #4 Lukáši Novotný, to je dobrý postřeh, zkusím s tím něco udělat

    #5 Davide Růžičko, bohužel to možné není, programátorské odbory se proti tomu výslovně postavily

    #9 bckpe, Určitě máš pár týdnů čas :)

    #11 Kuboslave, u tříd je problematické to, že se načítají přes autoloading, takže jejich kompletní seznam vlastně neexistuje, tudíž není z čeho vycházet při napovídání.

    před rokem | odpovědět
  14. Caine #14

    #6 Luki, A co kdyby se tam na localu objevilo např tlačítko „Fix it for me!“ To už by tak nebezpečný nebylo.. :)

    před rokem | odpovědět | reagoval [15] tiso [17] Luki [18] Petr
  15. tiso #15

    avatar

    #14 Caine, toto by bolo úplne mega

    před rokem | odpovědět
  16. Václav Kraus #16

    avatar

    David ví, jak udělat Tracy ještě přitažlivější. Tohle je totiž úplně boží! :)

    před rokem | odpovědět
  17. Luki #17

    avatar

    #14 Caine, No ale aby za nás Tracy neřešilo všechno a chudák programátor si nevydělá ani na suchej rohlík :-D

    před rokem | odpovědět
  18. Petr #18

    #14 Caine, A k tomu ještě zaškrtávátko „na tohle se už přiště neptej a opravuj“ :D

    před rokem | odpovědět
  19. a #19

    mohli by ste navrhnut nejaky ide v ktorom funguje doplnanie v sablonach? pouzivam aktivne phpstorm ale doplnanie mi tam moc nefunguje nette plugin mam nahraty

    před 9 měsíci | odpovědět

Zanechat komentář

Text komentáře
Kontakt

(kvůli gravataru)



*kurzíva* **tučné** "odkaz":http://example.com /--php phpkod(); \--