Nette\Framework

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pmg
Člen | 372
+
0
-

Funkci pro porovnání verzí už třída Nette\Framework obsahuje. Občas bych ale potřeboval porovnat i kvalitu kódu. Drobná ukázka:

foreach (array('Kohana', 'CakePHP', 'Prado', 'Symfony', 'Zend') as $competition) {
	if (Framework::compareQuality($competition) > -1) {
		die('this should be never executed');
	}
}

assert('!Framework::isBloated()');

echo 'Gratuluji, používáte nejlepší framework na open source trhu!';

Pro upřesnění požadavku přiložím ještě vzorovou implementaci obou metod.

/**
 * Compares code quality of Nette Framework and another framework.
 * @param  string  framework being compared
 * @return int
 */
public static function compareQuality($framework)
{
	return $framework === "Nette Framework" ? 0 : -1;
}

/**
 * Checks if code of Nette Framework is bloated.
 * @return bool
 */
public static function isBloated()
{
	return class_exists('Nette\RandomNumberGenerator');
}

Díky.

Jan Tvrdík
Nette guru | 2595
+
0
-

:)

Jod
Člen | 701
+
0
-

wtf =)))))))))))

PetrP
Člen | 587
+
0
-

Hmmmm zajímavé, a co ještě Framework::amIGay() a hádej, co to bude za boolean vracet ;]

simon
Člen | 98
+
0
-

tak ted nevim to je vtip nebo ne?

tohle porovnani asi fungovat nebude. Nevim, ze by Nette Framework byl datovy typ.

<?php
return $framework === "Nette Framework" ? 0 : -1;

?>
simon
Člen | 98
+
0
-

Apríl je letos o trochu driv…

Ola
Člen | 385
+
0
-

simon napsal(a):
tohle porovnani asi fungovat nebude. Nevim, ze by Nette Framework byl datovy typ.

Ale bude .. Zkus si echo "Nette Framework" === "Nette Framework";

simon
Člen | 98
+
0
-

fakt ze jo:) beru zpet, porad se clovek uci.

simon
Člen | 98
+
0
-

Ale stejne to nechapu.
Pokud si dobre pamatuju tak == je porovnani obsahu, === je porovnani typu. nebo ne?

_Martin_
Generous Backer | 679
+
0
-

simon napsal(a):

Ale stejne to nechapu.
Pokud si dobre pamatuju tak == je porovnani obsahu, === je porovnani typu. nebo ne?

A výraz "Nette Framework" je datový typ:

  1. číslo
  2. objekt
  3. řetězec
  4. shluk náhodně definovaných pseudo-konstant, jejichž význam se dá blíže vyložit jakožto synonymum slova „dokonalý“
Ola
Člen | 385
+
0
-

=== je porovnání typu i obsahu, v tomhle případě je ale typ string .. Pokud bys ale měl třeba

$i = 0;
$j = "0";

Debug::dump($i === $j);

tak dostaneš false (obsah by při přetypování seděl, ale typ prostě není stejný)

Editoval Ola (25. 2. 2009 10:06)

simon
Člen | 98
+
0
-

jasny uz mi svita:D

arron
Člen | 464
+
0
-

nice:-)

Honza Marek
Člen | 1664
+
0
-

PetrP napsal(a):

Hmmmm zajímavé, a co ještě Framework::amIGay() a hádej, co to bude za boolean vracet ;]

To je jasné…

public static function amIGay() {
	$gay = Nette\RandomNumberGenerator::choose(array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
	return $gay === 1 ? true : false;
}
Jod
Člen | 701
+
0
-

Hmm, zaujímavé. To si robil podľa nejakých štatistík, že každý 25ty človek je gay?

David by mohol na index hodiť najväčšiu novinku nette a konečne posunúť verziu na 1.0.
Na indexe by bolo niečo ako „Ktorý framework o vám môže odpovedať na otázky ako sú vaša pohlavná orientácia a podobne. No predsa Nette!!! Najinteligentnejší framework na svete. Stiahnite si ho ešte dnes a na všetky otázky Vám bude odpovedané“.

Editoval Jod (25. 2. 2009 10:59)

Honza Marek
Člen | 1664
+
0
-

Každý 25. člověk jsou 4%. Statistiky nemám, ale řiká se to :-D

PetrP
Člen | 587
+
0
-

Honza M. napsal(a):

Každý 25. člověk jsou 4%. Statistiky nemám, ale řiká se to :-D

Myslím že je to kec, je jich všude více než 4%, a to nepočítám ty který se nechovaj veřejně afektovaně. Taky je ale možnost že mám ‚divné‘ kamarády a je u nich statistická odchylka ;]

Honza M. napsal(a):

public static function amIGay() {
	$gay = Nette\RandomNumberGenerator::choose(array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
	return $gay === 1 ? true : false;
}

Spíš bych to vyděl na něco přímočarejšího

public static function amIGay() {
	return (method_exists('Framework','promo') AND preg_match('#Nette#',Framework::promo()))?true:false;
}

Editoval PetrP (25. 2. 2009 11:27)

pmg
Člen | 372
+
0
-

PetrP napsal(a):

Hmmmm zajímavé, a co ještě Framework::amIGay() a hádej, co to bude za boolean vracet ;]

Napřed jsem se vylekal, že myslíš něco takového:

public static function amIGay()
{
      return Environment::getUser()->identity->name === 'pmg';
}

Ale pak jsi mě uklidnil:

PetrP napsal(a):

Spíš bych to vyděl na něco přímočarejšího

public static function amIGay() {
	return (method_exists('Framework','promo') AND preg_match('#Nette#',Framework::promo()))?true:false;
}

Mám totiž pocit, že tato metoda vrátí vždycky false. :-) Doufám, že se nedopustím diskriminace, když řeknu: Tím lépe pro nás.

simon napsal(a):
Apríl je letos o trochu driv…

Trošku slabý odvar na apríla, ne? Tohle bylo jen výročí 5000. příspěvku! :-) Jinak se zdá, že i toto vlákno bylo něčím užitečné, což mě velice těší. (Jdu na další.)

PetrP
Člen | 587
+
0
-

pmg napsal(a):

Napřed jsem se vylekal, že myslíš něco takového:

neco takového jsem si nejprve rikal ze napisu, pak jsem si ale rikal ze se mozna uvidime na nejakém srazu (tenhle teda nemuzu, ale pristi) a nevim jestli nejsi treba hodne silněj :)

Pak me jeste napadlo jednoduše return true;

Ale nevrací to porad true, jen kdyz použivas nette framework :)

(pisu pres mobil)

pmg
Člen | 372
+
0
-

neco takového jsem si nejprve rikal ze napisu, pak jsem si ale rikal ze se mozna uvidime na nejakém srazu (tenhle teda nemuzu, ale pristi) a nevim jestli nejsi treba hodne silněj :)

Jsem profesionální kulturista, těš se! Ale budu Ti věřit, že jsi slovo gay myslel jako adjektivum „veselý“. ;-)

Ale nevrací to porad true, jen kdyz použivas nette framework :)

Shodou okolností jsem chtěl v příkladu použít obdobnou implementaci. Narážel jsem jen na fakt, že Framework::Promo ten řetězec rovnou vypisuje, takže Tvoje metoda skutečně vrátí false a nezapomene oznámit, jaký framework používáš. :-P

Jod
Člen | 701
+
0
-

TakŽe z toho vyplíva, že každý kto nepoužíva Nette je gay =D

pmg
Člen | 372
+
0
-
public static function getSignature($length = 256)
{
      return str_pad('Nette Framework RULE', $length, 'Z') . '!';
}

public static function getHelp($length)
{
      return 'Zkus se podívat na příklad akrabat z distribuce!';
}
paranoiq
Člen | 392
+
0
-

Jod napsal(a):

TakŽe z toho vyplíva, že každý kto nepoužíva Nette je gay =D

to asi ne. někde jsem slyšel, že „opravdoví muži nepoužívají frameworky“ :]

PetrP
Člen | 587
+
0
-

pmg napsal(a):

Jsem profesionální kulturista, těš se! Ale budu Ti věřit, že jsi slovo gay myslel jako adjektivum „veselý“. ;-)

Samozřejmé, ono je možné to myslet i jinak?

Shodou okolností jsem chtěl v příkladu použít obdobnou implementaci. Narážel jsem jen na fakt, že Framework::Promo ten řetězec rovnou vypisuje, takže Tvoje metoda skutečně vrátí false a nezapomene oznámit, jaký framework používáš. :-P

Nojo, koukl jsem na to zběžně a myslel jsem že se kód vrací returnem a ne že se echuje, v tom případě je potřeba upravit kód ;]

public static function amIGay() {
	if (!method_exists('Framework','promo')) return false;
	ob_start();
	Framework::promo();
	$promo = ob_get_clean();
	return (preg_match('#Nette#',$promo))?true:false;
}

Jedna věc je skutečně zajímavá, v celém frameworku není pořádná možnost jak zjistit jestli používám nette nebo ne. Jedině přes Annotations a číst dokumentační komentáře, nebo přes Framework::promo()

Jod napsal(a):

TakŽe z toho vyplíva, že každý kto nepoužíva Nette je gay =D

Bohužel to mělo být obráceně ;] Tedy že každý kdo používá nette je skutečně gay a ostatní jen možná.

paranoiq napsal(a):

to asi ne. někde jsem slyšel, že „opravdoví muži nepoužívají frameworky“ :]

Já myslel že opravdový muži si frameworky píšou samy (ahoj davide ;]).

pmg napsal(a):

public static function getSignature($length = 256)
{
      return str_pad('Nette Framework RULE', $length, 'Z') . '!';
}

public static function getHelp($length)
{
      return 'Zkus se podívat na příklad akrabat z distribuce!';
}

getSignature je tuze praktická věc (možná by se dal nahradit za nudné Framework::promo), u getHelp vidím jako docela nevyužitej parametr $length.

Vyděl bych menší úpravy:

public static function getSignature($length = 256, $exclamationMarkLength = 256)
{
	if ($length < 200 OR $exclamationMarkLength < 200) throw new LengthException;
	return str_pad('Nette Framework RULE', $length, 'Z') . str_repeat('!', $exclamationMarkLength);
}

public static function getHelp($length = 256)
{
	return str_repeat(str_pad('Zkus se podívat na příklad akrabat z distribuce!', $length, '!').chr(10), Nette\RandomNumberGenerator::rand(98,372));
}
Jod
Člen | 701
+
0
-

Podľa mňa by metóda amIGay() nemala vracať bool výsledok, ale rovno ho echovať a to len v produkčnom móde, prípadne aj vracať, pre prípad, žeby chcel niekto zatajiť svoju orientáciu.

<?php
public static function amIGay() {
        if (!method_exists('Framework','promo')) return false;
        ob_start();
        Framework::promo();
        $promo = ob_get_clean();
        $isGay = (preg_match('#Nette#',$promo))?true:false;
	if(Environment::isProduction() && $isGay) {
		echo 'Ano, skutočne si gay.'; // Si? Som? :D
	}
	return $isGay;
}
?>
Ola
Člen | 385
+
0
-

Jenom technická – ten preg je tam zbytečnej, navíc podle dokumentace by měl bejt i pomalejší než strstr či strpos

Jod
Člen | 701
+
0
-

Zbytočná metóda so zbytočnou funkciou sa ale nevylučujú, skôr násobia svoj účinok =))

David Grudl
Nette Core | 8142
+
0
-

Dobrá, dobrá, přidám do frameworku konstantu Framework::NAME :-))

PetrP
Člen | 587
+
0
-

Ola napsal(a):

Jenom technická – ten preg je tam zbytečnej, navíc podle dokumentace by měl bejt i pomalejší než strstr či strpos

Máš samozřejmé pravdu, ale ten rozdíl není tak výrazný.
Udělal jsem testíček těhle funkcí:

(opakováno 1000000krát, každé měření provedeno 5krát)

preg_match('#Nette#',$s) 2,230064964
strstr($s,'Nette')!==false 1,418168402
strpos($s,'Nette')!==false 1,148483038
strstr($s,'Nette') 1,325289154
strpos($s,'Nette') 1,108728361
ereg('Nette',$s) 14,12296093

Předposlední je sice nejrychlejší, ale pozor za určitých okolností nemusí fungovat (return 0;)

Jod napsal(a):

Podľa mňa by metóda amIGay() nemala vracať bool výsledok, ale rovno ho echovať a to len v produkčnom móde, prípadne aj vracať, pre prípad, žeby chcel niekto zatajiť svoju orientáciu.

Myslím že není až tak úplně důležité a hlavně Framework::getSignature() jasně vypovídá o orientaci, kdyby se jí někdo pokusil utajit. ;]

David Grudl napsal(a):

Dobrá, dobrá, přidám do frameworku konstantu Framework::NAME :-))

Alespoň byla tahle diskuze nějak plodná, protože mě překvapilo že nějaká takováhle konstanta neexistuje ;]

pmg
Člen | 372
+
0
-

PetrP napsal(a):

pmg napsal(a):

Jsem profesionální kulturista, těš se! Ale budu Ti věřit, že jsi slovo gay myslel jako adjektivum „veselý“. ;-)

Samozřejmé, ono je možné to myslet i jinak?

Fajn, asi už je na čase, abych přiznal, že se mě bát nemusíš – jsem jen obyčený generátor textu. :-(

Jedna věc je skutečně zajímavá, v celém frameworku není pořádná možnost jak zjistit jestli používám nette nebo ne. Jedině přes Annotations a číst dokumentační komentáře, nebo přes Framework::promo()

Mluvíš mi z mé digitální duše. Řešil jsem stejné dilema.

u getHelp vidím jako docela nevyužitej parametr $length.

Ba ne, $length je tam plně v souladu s pravidlem „Buď tolerantní v tom, co přijímáš.“ Co když někdo bude chtít pomoct s délkou? Funkce by ji měla akceptovat.

Vyděl bych menší úpravy:

public static function getSignature($length = 256, $exclamationMarkLength = 256)
{
	if ($length < 200 OR $exclamationMarkLength < 200) throw new LengthException;
	return str_pad('Nette Framework RULE', $length, 'Z') . str_repeat('!', $exclamationMarkLength);
}

Pravda, chtělo to nějak dotáhnout s tou interpunkcí. Chtěl bych na této funkci postavit svůj nový CMS, jaká je prosím licence?

Jod napsal(a):

Podľa mňa by metóda amIGay() nemala vracať bool výsledok, ale rovno ho echovať a to len v produkčnom móde, prípadne aj vracať, pre prípad, žeby chcel niekto zatajiť svoju orientáciu.

Pěkné, už jsem Tvou funkci testoval. Mimochodem, víš, že máš moc pěkné stránky? To pozadí Ti tak ladí k vlasům…

PetrP napsal(a):

Máš samozřejmé pravdu, ale ten rozdíl není tak výrazný. Udělal jsem testíček těhle funkcí:

Čoveče, jednou jsem testnul, jak nejrychleji escapovat řetězec pro SQL LIKE – podle mě dost potřebná věc, na kterou se často kašle, takže pak není možné vyhledávat řetězce obsahující [%_]. Překvapivě byl nejrychlejší (a také nejkratší) tento ereg_replace:

ereg_replace('[%_]', $char . '\0', $str);

Druhé místo tuším obsadil preg_replace. Strtr i str_replace odjely s prázdnou – projevila se zde režie s vytvářením pole.

Podporuje dibi nějaké vyhledávací escapování?