[2010–01–10] přepisování createComponent()

před 8 lety

David Grudl
founder | 6706
+
0
-

Zatímco metody createComponentXyz() mohou vytvořenou komponentu vracet přes return, mateřská createComponent ji musí připojit a return není podporováno. Respektive nebylo, od aktuální revize už je.

Nicméně toto vylepšení může být zpětně nekompatibilní. Pokud vytváříte vlastní createComponent() ve které voláte předka, přidejte prosím „return“ do svého kódu:

function createComponent($name)
{
    ...
    return parent::createComponent($name); // musí tu být return!
}

před 8 lety

Jan Tvrdík
Nette guru | 2536
+
0
-

Takhle je to logičtější.

Ještě by to chtělo odstranit pokud vím nikým nereportovaný bug, kdy nejde odstranit (removeComponent) komponenta tvořená továrničkou.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Já bych udělal něco s tou velikostí písmen – vím, že se to už jednou měnilo, ale createComponentComponentName + {control componentName} má hodně velký WTF faktor a lidi v tom neustále chybují. Navíc to jde proti tomu, kdy názvy tříd začínají velkým písmenem – název komponenty by podle měl také začínat, přecijen je to něco „víc“ než jen nějaká proměnná nebo členská metoda.

před 8 lety

jasir
Člen | 748
+
0
-

Ondřej Mirtes napsal(a):

Já bych udělal něco s tou velikostí písmen – vím, že se to už jednou měnilo, ale createComponentComponentName + {control componentName} má hodně velký WTF faktor a lidi v tom neustále chybují. Navíc to jde proti tomu, kdy názvy tříd začínají velkým písmenem – název komponenty by podle měl také začínat, přecijen je to něco „víc“ než jen nějaká proměnná nebo členská metoda.

Určitě jsem pro, také na to často musím zbytečně myslet. Myslím, že tu na fóru padl někde návrh aby jméno bylo case-sensitive kromě prvního písmene, které by bylo case-insensitive'.

před 8 lety

Honza Marek
Člen | 1674
+
0
-

Neni to takové divné? Když už, tak case insensitive celé.

před 8 lety

Petr Motejlek
Člen | 293
+
0
-

Mě osobně zase naprosto vyhovuje současný stav. Velké písmeno na začátku názvu je vyhrazené pro třídy a nedovedu si představit psát {control MyComponent} – od toho bych totiž očekával, že by to vždycky vytvořilo novou instanci, připojilo ji do stromu, vyrenderovalo, a poté odpojilo.

před 8 lety

Majkl578
Moderator | 1379
+
0
-

Jsem stejného názoru jako Petr Motejlek.

před 8 lety

Petr Motejlek
Člen | 293
+
0
-

Jsem rád, že jsem ten příspěvek napsal dost srozumitelně, aby se s ním někdo ztotožnil. Bylo už docela pozdě (nebo brzo?) a já byl skoro tuhej ;).

před 8 lety

David Grudl
founder | 6706
+
0
-

Jan Tvrdík napsal(a):
Ještě by to chtělo odstranit pokud vím nikým nereportovaný bug, kdy nejde odstranit (removeComponent) komponenta tvořená továrničkou.

Můžeš nahodit nějaký příklad?

před 8 lety

PetrP
Člen | 587
+
0
-

Honza Marek napsal(a):

Neni to takové divné? Když už, tak case insensitive celé.

+1

před 8 lety

Jan Tvrdík
Nette guru | 2536
+
0
-

David Grudl napsal(a): Můžeš nahodit nějaký příklad?

public function renderDefault()
{
    Debug::dump(count($this->getComponents())); // 0

    //$testComponent = new AppForm($this, 'test2'); // OK, není použita továrnička
    $testComponent = $this->getComponent('test');   // Používá továrničku, nelze odebrat.

    Debug::dump(count($this->getComponents())); // 1

    $this->removeComponent($testComponent);

    Debug::dump(count($this->getComponents())); // 1

    $this->terminate();
}

protected function createComponentTest()
{
    echo 'Volána metoda: ' . __METHOD__;
    return new AppForm();
}

Editoval Jan Tvrdík (20. 1. 2010 18:18)

před 8 lety

David Grudl
founder | 6706
+
0
-

Jan Tvrdík napsal(a):

Ještě by to chtělo odstranit pokud vím nikým nereportovaný bug, kdy nejde odstranit (removeComponent) komponenta tvořená továrničkou.

fixed

před 8 lety

David Grudl
founder | 6706
+
0
-

Téma sensitive a insensitive se už probíralo mnohokrát a ani nevím, k čemu se vždy došlo ;)

před 8 lety

Vitek Jezek
hledá kolegy | 298
+
0
-

David Grudl napsal(a):

Téma sensitive a insensitive se už probíralo mnohokrát a ani nevím, k čemu se vždy došlo ;)

Na tusim predminule Posledni sobote jsme se shodli na navrhu aby jméno bylo case-sensitive kromě prvního písmene, které by bylo case-insensitive'. ; )

Coz nic nerika o tom, zda se shodneme i nyni (program na Pardubickou PS?)

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

case-sensitive kromě prvního písmene, které by bylo case-insensitive

To je ještě míň intuitivnější, než teď.

Kdo by chtěl šmarjá mít dvě komponenty, které by se lišily akorát velikostí písmen?

I když s tím malým písmenem na začátku (jak to funguje teď) to možná není zas až takový průšvih, renderDefault vs. default action je stejná situace a lidi to umí používat…

Editoval Ondřej Mirtes (20. 1. 2010 20:47)

před 8 lety

Honza Marek
Člen | 1674
+
0
-

Whitek napsal(a):

Na tusim predminule Posledni sobote jsme se shodli na navrhu aby jméno bylo case-sensitive kromě prvního písmene, které by bylo case-insensitive'. ; )

Což je taková kravina, že jsem se na tom nikdy neshodl a nikdy neshodnu ;-)

před 8 lety

David Grudl
founder | 6706
+
0
-

Buď to dát case-insensitive nebo nechat case-sensitive, všechno ostatní je zm[ae]tek.

Implementace je vcelku snadná a ale může to mít vedlejší efekty:

  • programátor musí v metodě createComponent($name) také počítat s nerozlišováním velikosti písmen
  • metoda getComponents() bude vracet klíče lowercased, takže třeba iterátory foreach(getComponents() as $name => $control) chce nahradit za foreach(getComponents() as $control) { $name = $control->name; ... odvolávám, tohle samozřejmě může getComponents() řešit.

Ale stále zůstává otázka: fakt to chceme? Proměnné a klíče polí jsou stejně case-sensitive.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Já narážel na to, že střídání velikosti písmen v názvu komponenty v tovární metodě a ve widget makru je neintuitivní a spousta lidí s tím má problémy. Ale když vezmu vpotaz, že Nette je tím prorostlé víc (název action/render metod + název samotné action a její šablony), tak bych to asi nechal tak, jak je to teď.

před 8 lety

Honza Marek
Člen | 1674
+
0
-

David Grudl napsal(a):

Buď to dát case-insensitive nebo nechat case-sensitive, všechno ostatní je zm[ae]tek.

Implementace je vcelku snadná a ale může to mít vedlejší efekty:

  • programátor musí v metodě createComponent($name) také počítat s nerozlišováním velikosti písmen
  • metoda getComponents() bude vracet klíče lowercased, takže třeba iterátory foreach(getComponents() as $name => $control) chce nahradit za foreach(getComponents() as $control) { $name = $control->name; ...

Ale stále zůstává otázka: fakt to chceme? Proměnné a klíče polí jsou stejně case-sensitive.

My chceme, aby jméno komponenty a jméno komponenty ve stromu komponent byla jiná hodnota?

Osobně mi nevadí současný stav. I když kdysi jsem žil v domnění, že hodnoty jsou case-insensitive a taky jsem byl spokojen. Při zjištění pravdy jsem byl velmi překvapen :D

před 8 lety

David Grudl
founder | 6706
+
0
-

Jméno komponenty uvnitř ComponentContainer je implementační záležitost, jen prostě metody ComponentContainer budou fungovat case-insensitive, ačkoliv jména komponent mohou používat velké i malé písmenka. Nedělal bych to tak že se jméno komponenty automaticky změní na malá písmenka, to by mělo daleko větší důsledky.

před 8 lety

_Martin_
Člen | 679
+
0
-

Souhlasím s Ondrou a s Whitkem – řídím se pravidlem, že komponenty pojmenovávám vždy podle camel caps. Takže kde píšu jen název, bude nazevKomponenty, u metody bude logicky createComponentNazevKomponenty. It's so simple.

před 8 lety

Majkl578
Moderator | 1379
+
0
-

_Martin_: moje slova.
Přijde mi to dost podobné action<Action>, render<View> a podobnému (jak zmínil Ondra). U toho také problém není.

před 8 lety

Petr Motejlek
Člen | 293
+
0
-

Mě to nepřijde podobný, mě to přijde úplně stejný ;).

před 8 lety

PetrP
Člen | 587
+
0
-

Prvni pismeno case-senzitive,
druhe case-insenzitive,
třeti pismeno nesmy byt cislo,,
čtvrté musi bejt mezi c a f.
páte se musí rýmovat z druhým, ale může mít jinou velikost.
šesté musí bejt vždy Q
od sedmého do osmého musí být mezery.
deváte může být jakékoli ale nesmý se zapomenout vyplnit.
jedenáctě zase vždy malé.
od dvanáctého dál jsou povoleny jen malé písmena s interpunkcí.

Jinak jsem zastáncem case-insenzitivy, ale můžem se poprat na PS. ;]