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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
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!
}
Jan Tvrdík
Nette guru | 2595
+
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.

Ondřej Mirtes
Člen | 1536
+
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.

jasir
Člen | 746
+
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'.

Honza Marek
Člen | 1664
+
0
-

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

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.

Majkl578
Moderator | 1364
+
0
-

Jsem stejného názoru jako Petr Motejlek.

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 ;).

David Grudl
Nette Core | 8227
+
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?

PetrP
Člen | 587
+
0
-

Honza Marek napsal(a):

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

+1

Jan Tvrdík
Nette guru | 2595
+
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)

David Grudl
Nette Core | 8227
+
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

David Grudl
Nette Core | 8227
+
0
-

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

Vitek Jezek
hledá kolegy | 285
+
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?)

Ondřej Mirtes
Člen | 1536
+
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)

Honza Marek
Člen | 1664
+
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 ;-)

David Grudl
Nette Core | 8227
+
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.

Ondřej Mirtes
Člen | 1536
+
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ď.

Honza Marek
Člen | 1664
+
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

David Grudl
Nette Core | 8227
+
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.

_Martin_
Generous Backer | 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.

Majkl578
Moderator | 1364
+
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í.

Petr Motejlek
Člen | 293
+
0
-

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

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. ;]