« 1 2 »
Autor Zpráva
tester
Profil *
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 *
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 *
funkce jsou moc zdlouhavé na zápis. Jsem líný takže to chci psát takto:
$errMsg = $lan->get(constant("T::U::".$const));
nebo tedy takto když už mi nic jiného nezbývá:
$errMsg = $lan->get(constant("U::".$const));
ale tak jestli to jinak nejde tohle by taky šlo. Hlavně aby v tom byla struktura.
$errMsg = $lan->get(constant(T->U($const)));
Jenže tam máš zase volání a jakékoliv volání funkce bude prostě zabírat více času. Volaná funkce se zapusuje do jakých si tabulek v paměti a tak, pak tam máš argumenty funkce co se kopírují, vypadá to sice hezky ale zabere víc času.
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
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 *
Fisir:
T::U() by šlo.
juriad:
Jaký řetězec?
juriad
Profil
tester:
To záleží na tobě. Prostě neindexovat jednotlivé překlady čísly, ale řetězci. Například:
$lang->get("users.errors.notfound")
Pak třeba název před první tečkou je název modulu.
tester
Profil *
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
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 *
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
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
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 *
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 *
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
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 *
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
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
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
Reaguji na testera:
Když to tedy chceš mít tak jednoduché, proč tu vytváříš vlastní složitá řešení a nepoužiješ něco hotového? Já osobně mám dobré zkušenosti s Gettextem, přičemž jazykové soubory se dají hezky upravovat v Poeditu.
Keeehi
Profil
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 *
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 *
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
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
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 *
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 :).
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0