Objektový String – píšete $s->substr(10)->trim()…?

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

Procházel jsem kód a koukal, co se mi nelíbí, a co bych chtěl příště zkusit psát jinak:

$finalName = Strings::lower(Strings::webalize(Strings::substring($fileName, 0, 100)) . '.' . $extension);

Je to nepřehledné.

Prostudoval jsem si toto starší vlákno (žádné nadšení) a Je třeba, aby Nette\String byla třída? Primárně se toho netýká, ale je 6 let staré a obsahuje zajímavé predikce toho, co se bude dít za 5 let :-).

Chtěl bych psát $finalName = ($fileName->substring(0,100) . '.' . $extension)->lower(); nebo dokonce "neco"->trim() (vím, že to nejde)

Co mám dělat? Jak to řešíte vy? Co se změnilo od minula a v čem vidíte budoucnost?

  1. Zůstat u statických metod Strings::trim() a oželet fluent interface
  2. Vlastní servery už jsou dostupnější, takže rozšířit PHP např. https://github.com/…alar_objects
  3. Odejít z Nette a PHP
  4. Napsat si vlastní třídu String Str s tím, že nepůjde všechno, bude to mít „ošklivý začátek“ (new String("neco"))->trim() (to bude chtít PHP7, že?) nebo str("neco")->trim(), ale fluent interface dostanu
  5. Použít nějakou už existující třídu String (znáte něco?)
CZechBoY
Člen | 3608
+
0
-

Zrovna vcera jsem nad tim taky premyslel :D
Tedka jsem v rychlosti nasel https://github.com/…er/README.md coz vypada celkem dobre.

edit: Jo, tys to taky nasel. Na prvni pohled se mi to zda jak bych si to predstavoval.

Editoval CZechBoY (14. 1. 2017 11:28)

GEpic
Člen | 566
+
0
-

Mě by se líbilo něco jako:

	/* @var $fileName String */
	$fileName->substring(0, 100)->append('.' . $extension)->lower()->webalize();

Ale z třídy Strings jsem doposud zatím využil jen právě zmíňenou webalize, nic jiného.

Editoval GEpic (14. 1. 2017 18:13)

filsedla
Člen | 101
+
0
-

@CZechBoY Vyzkoušel jsem scalar_objects (na Windows PHP7). Funguje to. Má to akorát vadu, že StringHandler má jiné signatury metod než jak se to ve výsledku tváří. Aby fungovalo napovídání v PhpStormu, musel bych kromě StringHandleru ještě napsat StringStub se správnými metodami. A pak, je to pořád PHP rozšíření, asi si ho netroufnu použít.

@GEpic Append, tak je to lepší. Já většinou používám ty verze ze Strings.

mkoubik
Člen | 728
+
+1
-

U těchto obalovacích tříd (String, Array, Collection, apod.) je problém s rozšiřitelností. Musíš na nich definovat všechny operace a další se pak nedají přidávat (resp. jen dědičností nebo extension-metodami, což je obojí horší varianta než nemít nic).

Já bych radil dál používat statické metody (tohle je přesně použití na které jsou dělané) a počkat si na pipe operátor v php, pak se to bude zapisovat takhle:

$finalName = Strings::substring($fileName, 0, 100)
    |> Strings::webalize($$)
	|> Strings::lower($$ . '.' . $extension);

Editoval mkoubik (16. 1. 2017 12:06)

filsedla
Člen | 101
+
+1
-

@mkoubik Pipe operátor se mi nelíbí. Jeden z důvodů, proč mít objektový přístup je, že si nebudu muset pamatovat, co je haystack a co needle (v metodách s hodně parametry). Haystack bude většinou to, na čem metodu volám a jako parametr ho tedy neuvedu. S pipe operátorm bych všechny parametry musel uvádět a jeden z nich dokonce pomocí nicneříkajícího $$.

Proč přesně bys nemohl String rozšířit dědičností o vlastní metodu?

mkoubik
Člen | 728
+
0
-

@filsedla To $$ se mi taky moc nelíbí, ale předpokládám že to zavedli právě kvůli bordelu v pořadí parametrů built-it funkcí. V jiných jazycích bývá zvykem předávat „haystack“ jako první parametr, takže ho z toho pipe operátoru můžeš vynechat. Nebo tam existuje něco jako thread-first a thread-last makra.

Dědičnost se mi nelíbí protože míchá do jednoho typu to že chceš string a co s ním pak chceš dělat. Musíš to pak všude řešit při typehintovaní a předávání parametrů, místo abys tam dal string a hotovo.

Editoval mkoubik (16. 1. 2017 16:12)