Autor | Zpráva | ||
---|---|---|---|
tester Profil * |
#1 · Zasláno: 16. 3. 2016, 20:07:01
Dá se vytvořit vnořená třída aby k ní mohl přistupovat takto? T::U
class T { } class U extends T { const USERNAME = 34; // Uživatelské jméno musí mít ... } Takto mi to moc nevyhovuje protože přes T se nedostanu k U ale samostatně přes U je to nepřehledné, protože chci mít více podtřid. A nechci zakládat novou instanci. Chci se k podtřídám dostat staticky. Nejsou v tom žádné funkce ani proměnné, jen konstanty. |
||
visionic Profil * |
#2 · Zasláno: 16. 3. 2016, 20:19:52
tester:
Do tridy lze zapisovat funkce typu PRIVATE, PUBLIC a jiné, tedy PUBLIC funkci můžeš vyvolávat kde chceš, pokud ji máš nahranou a neuzavřenou a PRIVATE funkci pouze v té třídě. Doporučuji tedy v jedné třídě udělat dvě funkce, které se ti budou propojovat mezi sebou. Ne tedy propojovat dvě třídy na základě informací, ale v jedné třídě propojovat 2 funkce. class TU { public function t() { } public function u() { } } |
||
tester Profil * |
#3 · Zasláno: 16. 3. 2016, 20:24:50
funkce jsou moc zdlouhavé na zápis. Jsem líný takže to chci psát takto:
$errMsg = $lan->get(constant("T::U::".$const)); $errMsg = $lan->get(constant("U::".$const)); $errMsg = $lan->get(constant(T->U($const))); |
||
Fisir Profil |
Reaguji na testera:
A můžu se zeptat, co přesně tady vymýšlíš? To ti nestačí něco takového? class U { const USERNAME = 34; } class T { static public function write(){ echo U::USERNAME; } } T::write(); // vypíše 34 Jinak vkládat v PHP třídy do sebe jako třeba v Javě nejde. |
||
juriad Profil |
#5 · Zasláno: 16. 3. 2016, 20:40:40
tester:
Proč prostě metodě get nepředáš řetězec? V čem je nevýhoda oproti číslu, které chceš zamaskovat konstantou? Přijde mi, že by ses měl vrátit o několik kroků zpátky a znovu si rozmyslet, jak to celé má fungovat. |
||
tester Profil * |
#6 · Zasláno: 16. 3. 2016, 20:51:43
Fisir:
T::U() by šlo. juriad: Jaký řetězec? |
||
juriad Profil |
#7 · Zasláno: 16. 3. 2016, 20:56:58
tester:
To záleží na tobě. Prostě neindexovat jednotlivé překlady čísly, ale řetězci. Například: $lang->get("users.errors.notfound") |
||
tester Profil * |
#8 · Zasláno: 16. 3. 2016, 21:14:50
Už to mám vymyšlené
class T { static public function U($name){ return constant("U::$name"); } } class U { const USERNAME = 34; Volám funkci reg('USERNAME',true,1,1); function reg($const,$errMsg,$options) { global $lan; if ( $errMsg === true ) $errMsg = $lan->get(T::U($const)); ... next stuff ... } |
||
Kcko Profil |
#9 · Zasláno: 16. 3. 2016, 21:17:25
tester:
Úžasný kód, znáš to pořekadlo, 2x měř a jednou řež? V tvém případě to platí obzvlášt a ještě bych si k tomu přečetl něco o objektovém programování, tak ale hlavně že to je zabalené magickým slovem class a vypadá to "coool" ;-) |
||
tester Profil * |
#10 · Zasláno: 16. 3. 2016, 21:35:40
Kcko:
Nede o to aby to bylo cool ale aby kód byl pro mě co nejkratší a nejpřehlednější a co možno snadno editovatelný. Když má člověk předělávat nebo rozšiřovat stránku kde jde tisíc čísel vedoucích neznámo kam tak je to fakt těžký. Nejlépe je použít konstanty. Tím se řídím já. Ale třeba tobě vyhovuje něco jiného. Každý máme svůj styl. A o objektovém programování jsem četl, ale spíš v C/C++. Ta podobnost mezi C a PHP tu trochu je akorád PHP je primitivnější. |
||
Kcko Profil |
#11 · Zasláno: 16. 3. 2016, 21:44:01
tester:
Proč konstanty? Proč ne databázi a nějakou vlastní funkci jak naznačil Juriad, kde dle nějakého zápisu dohledáš co potřebuješ? Viz ta tečková notace. Promiň, ale to jsi tady napsal vypadá jako velmi ošklivý paskvil. |
||
pcmanik Profil |
#12 · Zasláno: 16. 3. 2016, 21:45:15
tester:
Teraz je pre teba kód možno prehladňejší ale vrátiš sa k nemu o polroka a zabiješ množstvo času zisťovaním čo do pekla je trieda T, U, ... načo slúži funkcia reg atd. A v čom je PHP primitívnejšie? |
||
tester Profil * |
pcmanik:
K tomu jsou komentáře. Kcko: Neumím si představit tu realizaci. Myslíš mysql nebo sqlite? To chceš vracet hlášky mysql dotazem jenom proto abys vrátil text který má často délku jen kolem 10-15 znaků??? |
||
Martin2 Profil * |
#14 · Zasláno: 17. 3. 2016, 00:14:13
tester:
„To chceš vracet hlášky mysql dotazem jenom proto abys vrátil text který má často délku jen kolem 10-15 znaků???“ Nikdo netvrdí, že bys měl dělat jeden dotaz na každou položku. Rozsáhlá datová struktura v každém případě nepatří do programu, patří do databáze nebo datového souboru. |
||
tester Profil * |
#15 · Zasláno: 17. 3. 2016, 09:21:50
Martin2:
Svoje výhody to má jen nevím jak to realizovat v případě že bych někdy v budoucnu chtěl to udělat. |
||
Joker Profil |
#16 · Zasláno: 17. 3. 2016, 09:32:26
tester:
„Nede o to aby to bylo cool ale aby kód byl pro mě co nejkratší a nejpřehlednější“ Vyškrtl bych co nejkratší. Psát kód tak, aby byl co nejkratší, obvykle nepřináší žádné výhody. Pozn.: Samozřejmě, že obrovské metody s kilometry kódu jsou většinou špatně, ale podle mě spíš jako vedlejší efekt jiných kritérií vyplyne, že by kód neměl být příliš dlouhý, než aby bylo nutné se snažit, aby byl co nejkratší. A přehledné to taky není. Už jen to, že funkce volá metody třídy, která odněkud přiletí v globální proměnné, podle mě vylučuje označení „přehledný kód“. A sice tam je znát snaha nahradit tzv. „magické konstanty“* skutečnými konstantami, ale ve skutečnosti je výsledkem spíš nahrazení magické konstanty (čísla 34) jinou magickou konstantou (řetězcem "USERNAME") a mapováním mezi nimi, čímž se podle mě spíš přidává další úroveň nepřehlednosti. Kdyby se jako klíče použily rovnou ty texty, nic z toho nebude potřeba a bude to přehlednější. |
||
MartinP_ Profil * |
#17 · Zasláno: 17. 3. 2016, 09:52:20
Múžeš hlášky v databázi rozdělit do sekcí (označené např. jménem stránky, kde je používáš) a pak mít funkci na zjištění hlášky, která zkontroluje, jestli je sekce v cache a když ne, tak celou sekci najednou načte z DB a vrátí tu jednu položku.
|
||
tester Profil * |
Joker:
"Už jen to, že funkce volá metody třídy, která odněkud přiletí v globální proměnné, podle mě vylučuje označení „přehledný kód“. " Nevýhody globálních proměnných jsem si dobře vědom, proto je omezuji na nezbytné minimum. Obvykle stačí k aplikaci zapsat stručný manuál kde zmapuješ globální konstanty a třídy a k čemu slouží a člověku by to mělo stačit na to aby během chvilky pochopil co k čemu slouží. pole lan tam je klíčové právě na ten překlad takže ho požívám jako globální. zjednodušuje to zápis. méně přehledné už by mi přišlo psát to např. $instance->lan->define("USERNAME",....); kratší je $lan->define("USERNAME",....); a když víš že $lan je instance třídy language ve které je metoda pro definování konstant tak se s tím pracuje lehce a v pochopení a přehlednosti nevidím problém. Něco jiného by bylo psát proměnnou username jako globální proměnnou, ideálně pak globální problměnnou username používat i uvnitř metody :). Kdyby se jako klíče použily rovnou ty texty, nic z toho nebude potřeba a bude to přehlednější. A až to budu překládat budu kopírovat 12x celý program, že? MartinP: "pak mít funkci na zjištění hlášky, která zkontroluje, jestli je sekce [u]v cache[/u] a když ne, tak celou sekci najednou načte z DB a vrátí tu jednu položku. A to se provádí jak prosím tě? Cache myslíš diskovou nebo operační paměť? To by se mi hodilo velmi. |
||
Keeehi Profil |
#19 · Zasláno: 17. 3. 2016, 14:36:48
tester:
„kratší je $lan->define("USERNAME",....);“ Kratší, kratší, pořád tu operuješ s délkou. Jsou lidé, kteří zkracují názvy tříd, metod, funkcí, proměnných aby se neupsali. A pak jsou lidé kteří používají plná jména která podporují čitelnost a je z nich na první pohled vše patrné. A jak to že jim neupadnou ruce? Používají IDE které jim po pár prvních znacích správně napoví celé jméno které pak doplní. |
||
Joker Profil |
#20 · Zasláno: 17. 3. 2016, 16:10:36
tester:
„Kdyby se jako klíče použily rovnou ty texty, nic z toho nebude potřeba a bude to přehlednější. A až to budu překládat budu kopírovat 12x celý program, že?“ Překlad se bude dělat v obou situacích úplně stejně. Jediný rozdíl by byly hodnoty klíčů a to, že by odpadlo to přemapovávání z jedné konstanty na jinou konstantu. Dobře, úplně čisté řešení bez magických konstant by asi bylo např.: Konstanty: class Strings { const HELLO = 1; } Zdroj řetězců by definoval 1 = "Ahoj" (potažmo místo 1 Strings::HELLO)
a použití: echo $config->translate(Strings::HELLO);
Je to celkem podobné [#8], ale používá se tam jen jedna konstanta. Výhoda je, že slušné IDE by si umělo ohlídat ty názvy konstant. Jednodušší varianta používá „magické konstanty“, ale obejde se bez té „konstantové třídy“: Zdroj řetězců: "HELLO" = "Ahoj"
a použití: echo $config->translate("HELLO");
|
||
tester Profil * |
Keeehi:
Já IDE nepoužívám. Zase mám k tomu své důvody které nemusím nikomu vysvětlovat. Editace textů, hlášek přímo v souboru mi přijde jednodušší než dělat to přes db. Nicméně případná implementace do db by byla maličkost pokud by všechny hlášky nebyly dělány prostřednictvím magických čísel. Nejlepší by bylo ukládat to do sqlite, v programu SqliteBrowser by se pak data daly upravit a přeložit manuálně, ale nenapadá mě nic jiného než to dělat po jednom záznamu. Kdežto v textovém souboru to jen hodím to překladače Google a soubor je přeložen. Joker: Ano takto vysvětlené mi to dává smysl a nevidím v tom problém to udělat až bude vše přemapováno. Tedy ještě je třeba se zamyslet nad jednoduchostí překladu. Je snad jednodušší přeložit kompletní soubor v txt formátu než překládat jednotlivé položky z db ručně, ne? Ještě pozn. Jediný rozdíl by byly hodnoty klíčů a to, že by odpadlo to přemapovávání z jedné konstanty na jinou konstantu. - tím myslíš to že to zadávám jako textový řetězec do funkce? Ty textové řetězce tam jsou proto, že umožňují celkové zjednodušení programu, méně příkazů. Některé sloupce zpracuji automaticky, protože argument pracuje z řetězcem, který naparsuje. Příkaz na jeden řádek, lepší než 20 příkazů samostatně. Jestli si myslel toto. Tak jo výhodu IDE chápu, ale pak máš delší kód. Pro mě co dělá bez IDE je jednodušší pracovat takto, potřebuju kratší kód abych se v tom vyznal. |
||
Fisir Profil |
#22 · Zasláno: 17. 3. 2016, 18:38:43
|
||
Keeehi Profil |
#23 · Zasláno: 17. 3. 2016, 18:46:07
tester:
„Zase mám k tomu své důvody které nemusím nikomu vysvětlovat.“ Nemusíš s tím souhlasím. Zkus se ale sám zamyslet zda bys to dokázal. Těžko můžeš po někom chtít poradit, jakým způsobem se něco běžně dělá, jaké jsou doporučené postupy, když tvůj styl práce je všechno, jen ne standardní. Nemůžeš se pak divit, když ti někdo poradí postup který je pak v přímém rozporu s tvým pracovním postupem. |
||
Martin2 Profil * |
#24 · Zasláno: 17. 3. 2016, 18:54:39
tester:
„Já IDE nepoužívám. Zase mám k tomu své důvody které nemusím nikomu vysvětlovat.“ Tím asi končí veškerá smysluplná pomoc. Bez IDE nelze tvořit rozsáhlejší programy aniž by tím výrazně netrpěla jejich kvalita. To prostě není v lidských silách. V programování existují určité návrhové vzory, které je vhodné dodržovat. Respektive nejsi dost zkušený, aby sis mohl dovolit je nedodržovat. |
||
tester Profil * |
Fisir:
GetText ale asi nepoužívají všichni poskytovatelé hostingu, co? Já chtěl provozovat web na Moxo ovšem nevím jestli tato služba ještě jede když jim nefunguje hlavní stránka tudíž nezjistím jestli GetText podporují. Keeehi: Protože tyhle nové postupy (obecně) zabírají moře času a energie. Učit se nové věci hafo nových materiálů a dokumentací které bych se měl naučit. Raději vymýšlím vlastní postupy a tvořím, možná ne tak praktické a univerzální ale zaberou méně času. Jsou to pro mě rychlejší řešení. |
||
tester Profil * |
#26 · Zasláno: 18. 3. 2016, 08:26:13
Martin2:
Hodil by se nějaký program na vytvoření návrhového vzoru, mám v PC nainstalovaný program MindMap ale ten se dost špatně ovládá. Ovládání připomíná malování ve Windows 7. Nic intuitivního. Ale nějaký program na vytvoření takového návrhu/schématu by se určitě hodiln něco podobného jako je tato verze MindMap: www.youtube.com/watch?v=FEgbFOud9fs |
||
Keeehi Profil |
#27 · Zasláno: 18. 3. 2016, 10:30:05
Chceš toto?
Pak hledej program na tvorbu UML diagramů. Existuje jich velké množství. Ty profesionální z toho dokonce dokáží vyexportovat přímo kód. |
||
Joker Profil |
#28 · Zasláno: 18. 3. 2016, 11:06:44
tester:
„tyhle nové postupy (obecně) zabírají moře času a energie. (…) Raději vymýšlím vlastní postupy a tvořím“ Často je ale zbytečné znovu vynalézat kolo. Když existuje standardní řešení pro určitý druh úkolů, obvykle je důvod, proč se to řeší zrovna takhle. Lidi to řešili v minulosti, potýkali se s různými problémy a došli k něčemu, co obvykle funguje. Snažit se udělat od začátku vlastní řešení znamená si celou tu cestu projít ještě jednou (a nejspíš nakonec dojít stejně k tomu standardnímu řešení). |
||
tester Profil * |
#29 · Zasláno: 18. 3. 2016, 11:45:08
Joker:
Nemám vysokou školu v oboru programování. Zato mám před sebou rozpracovaný projekt který nechci dělat znovu z fleku... Je mi jasný že není dokonalý, ale začít se teď řídit zaběhlými postupy by znamenalo začít od začátku. Mohu se pokusit zpřehlednit některé části kódu tím že je zkusím přehledněji uspořádat a postupně dostat do tříd. Ale nikdy to nebude tak jako by to dělal profesionál. Jsem jen amatér. Keeehi Pěkný diagram. Něco takového. Možná ještě jednoduššího bez detailů. Zkusím pohledat. |
||
Zechy Profil |
tester:
„Nemám vysokou školu v oboru programování.“ Na to ani vysokou školu nepotřebuješ, ale je dobré si osvojit věci jako návrhové vzory či různé, již existující postupy pro obecné problémy. Jednak, jak už se tu mnohokrát zmiňovalo, šetří to čas a taky se ve výsledku můžeš dostat k daleko hezčímu a přehlednějšímu kódu. A kolikrát se pak i s takovým kódem častokrát o dost líp pracuje. Pokud máš už alespoň z poloviny v projektu hotovo, tak už asi opravdu nemá cenu to nějak extrémně překopávat, možná akorát jen další kód napsat doporučenými postupy. Ale pro další projekt bych určitě zvážil to, co se ti všichni snaží osvětlit :). |
||
Téma pokračuje na další straně.
|
0