|
Stránka 1 z 1
|
[ Příspěvků: 11 ] |
|
Autor |
Zpráva |
Václav M.
|
Předmět příspěvku: [PHP,obecné]Vynucení pořadí použití metod Napsal: 5. 11. 2020 23:38 |
|
|
Junior |
|
|
Problém se týká především třídy, jejíž konstrukci teď měním (vlaastní třída pro výpočet rozdílu mezi časy, daty a také posunu času a data, vpřed i vzad), ale prakticky jde o obecné řešení. Proto uvítám i řešení z jiných jazyků než je PHP a z jiných úloh. Popis problému: Třída má tyto veřejné metody: Set_StartTime Set_StartDate Set_EndTime Set_EndDate Set_TimeShift Set_DateShift Count_TimeDifference Count_DateDifference Count_NextTime Count_NextDate Count_PreviousTime Count_PreviousDate Pro většinu výpočtů je celkem jedno, zda-li je první zadán výchozí čas/datum či koncový čas/datum, popř. časový posun. Pro výpočet cílového data (Count_NextDate, Count_PreviousDate) je však potřebné (kvůli jednomu více či méně pomocnému výpočtu) zadat nejprve výchozí datum a teprve poté datový posun. Ale jak nejlépe vynutit potřebné pořadí použití metod?
|
|
Nahoru |
|
|
Emil Pastelka
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 6. 11. 2020 00:26 |
|
|
Junior |
|
|
Přes PHP Constructors/Destructors viz manuál. Příklad níže je ze Stackoverflow. Kód: class Foobar { var $public;
function __construct(....
function public_method_1()... function public_method_2()...
//
var $_priv;
function _private_1()... function _private_2()... }
|
|
Nahoru |
|
|
Václav M.
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 6. 11. 2020 07:45 |
|
|
Junior |
|
|
Mě nejde o pořadí metod v třídě ve smyslu, v jakém budou v té třídě napsány. Já potřebuji vynutit použití metod v určitém pořadí. Například Set_StartDate Set_DateShift Count_NextDate místo Set_DateShift Set_StartDate Count_NextDate Já navíc ani v té třídě konstruktor nemám. Protože je mi tam k ničemu. Ten doplňkový výpočet se odehraje v metodě Set_DateShift - a je závislý na tom, co je zadáno v metodě Set_StartDate. Proto metoda Set_StartDate musí být použita před metodou Set_DateShift.
|
|
Nahoru |
|
|
Wikan
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 6. 11. 2020 08:47 |
|
|
Moderátor |
|
|
Tohle nijak nevynutíš, maximálně tak můžeš vyhodit výjimku. Pokud to je možné, přepiš to tak, aby na pořadí nezáleželo.
|
|
Nahoru |
|
|
Just_jo
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 6. 11. 2020 16:33 |
|
|
Junior |
|
|
Tak DateShift je jen hodnota, která bude int - pak stačí zavolat Count_NextDate a započítat StartDate.
Pokud ti toto nejde z důvodu struktury kódu, tak to máš špatně a musíš opravit vnitřní logiku. Nemůžeš na to jít tak, že použitím Set_StartDate dojdě k nějakému výpočtu
|
|
Nahoru |
|
|
Václav M.
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 6. 11. 2020 21:40 |
|
|
Junior |
|
|
Just_jo píše: Tak DateShift je jen hodnota, která bude int - pak stačí zavolat Count_NextDate a započítat StartDate.
Jenže DateShift není jeden integer. Ty hodnoty jsou celkem 4 - roky, měsíce, dny a celkové dny. Přičemž celkové dny mohou být shodné s dny. Je to proto, že je možné posunout o úsek definovaný řetězcem obsahujícím roky, měsíce a dny. Pomocný výpočet v metodě Set_DateShift měl z výše uvedeného řetězce vypočítat celkový počet dní posunu (v případě, že posun není definován pouze pomocí dnů) - aby však byl výpočet přesný, je nutné posun vztáhnout k výchozímu datu. Proto je nutné, aby bylo výchozí datum zadáno dříve než vlastní posun. Tenhle výpočet je však spíše pomocný. Aby cílové datum v historii nepřesáhlo datum 1.1.1584, tedy začátek prvního roku po zavedení gregoriánského kalendáře. Je to takové menší omezení přípustné vzhledem k účelu. Hlavní výpočet cílového data se odehrává z roků, měsíců a dní. A tady výpočet změnit stejně musím. Protože v současné době je výpočet jen v rámci jednoho roku (tedy současný rok, jeden předcházející a jeden následující). Když jsem tu třídu psal původně, tak to tehdy stačilo - byť už tehdy jsem počítal s tím, že to musím změnit.
|
|
Nahoru |
|
|
Just_jo
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 7. 11. 2020 20:07 |
|
|
Junior |
|
|
Tak snad tu nebudeme slovíčkařit.
Bez popisu jak zadáš hodnotu do Set_DateShift nelze moc navrhnout, nicméně pořád to bude nějaká hodnota, která se musí jen interpretovat. Nevím jaké hodnoty by mohli mít vliv na "přesnost" výpočtu.
Něco nadhoď
|
|
Nahoru |
|
|
Václav M.
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 7. 11. 2020 22:34 |
|
|
Junior |
|
|
Kód metody Set_DateShift - ale teď bez toho pomocného výpočtu. Kód: public function Set_DateShift($shift = '29d') { try { if(!CheckPatterns::Is_DateShift($shift)) { throw new Exception(Exception::ORIGIN_SET_METHOD_PARAMETER, Exception::PATTERNS_MISMATCH_ARGUMENT); } } catch(Exception $exception) { $exception -> ExceptionWarning(__CLASS__, __FUNCTION__, 'shift', $shift, LoadPatterns::DateShift()); }
$shift_pattern = NULL;
foreach(LoadPatterns::DateShift() as $pattern) { if(preg_match($pattern, $shift) && $shift_pattern == NULL) { $shift_pattern = $pattern; } }
preg_match($shift_pattern, $shift, $shift_units);
$shift_units['days'] = isset($shift_units['days']) ? $shift_units['days'] : 0; $shift_units['months'] = isset($shift_units['months']) ? $shift_units['months'] : 0; $shift_units['years'] = isset($shift_units['years']) ? $shift_units['years'] : 0;
$this -> date_shift -> days = $shift_units['days']; $this -> date_shift -> months = $shift_units['months']; $this -> date_shift -> years = $shift_units['years']; }
Objekt date_shift je vytvořen nad třídou DateShift, která je svým způsobem prázdná - jelikož obsahuje pouze výše jmenované vlastnosti a jednu k tomu, která výše zrovna není využita. A magické metody __set a __get
|
|
Nahoru |
|
|
Just_jo
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 8. 11. 2020 15:16 |
|
|
Junior |
|
|
Tak tady pořád nevidím problém - teoreticky sis mohl ušetřit řádky a vložit do date_shift přímo ten zkrácený IF.
Předpokládám, že používáš strtotime? Tam lze jednoduše použít '+1 week 2 days'
|
|
Nahoru |
|
|
Václav M.
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 10. 11. 2020 22:50 |
|
|
Junior |
|
|
strtotime nepoužívám. A opravdu jde o to zajistit, aby posun nevedl k datu před tím povoleným prvním lednem 1584. Jako nejvhodnější místo pro tuto kontrolu mi přijde metoda Set_DateShift - tedy tam, kde je posun zadáván. I když by se tato kontrola dala umístit i do metod Count_PreviousDate a Count_NextDate. Pokud jde o strtotime, chvíli jsem uvažoval, že pro zadání posunu použiju styl této funkce. Ale pak jsem se rozhodl, že posun bude bez uvedení směru a výpočet bude ve dvou metodách - tak, aby bylo možné získat jak datum po přičtení posunu, tak datum po odečtení posunu.
|
|
Nahoru |
|
|
Just_jo
|
Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod Napsal: 11. 11. 2020 19:29 |
|
|
Junior |
|
|
Tak kontrolu data musíš použít ve fci Count, která bude vracet nějakou verzi vyjímky namísto výsledku. Jinak to nejde. Jednoduše nedonutíš uživatele to napsat správně podle nějakého pořadí - pak ti udělá to, že prvně nastaví StartDate, pak DateShift a pak zase StartDate a jsi zase na začátku.
|
|
Nahoru |
|
|
|
Stránka 1 z 1
|
[ Příspěvků: 11 ] |
|
Kdo je online |
Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků |
|
Nemůžete zakládat nová témata v tomto fóru Nemůžete odpovídat v tomto fóru Nemůžete upravovat své příspěvky v tomto fóru Nemůžete mazat své příspěvky v tomto fóru Nemůžete přikládat soubory v tomto fóru
|
| |