Fórum Živě.cz

Víc lidí víc ví
Právě je 29. 3. 2024 07:00

Všechny časy jsou v UTC + 1 hodina




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 11 ] 
Autor Zpráva
 Předmět příspěvku: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 5. 11. 2020 23:38 
Offline
Junior
Uživatelský avatar
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.
:arrow:
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 6. 11. 2020 00:26 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 6. 11. 2020 07:45 
Offline
Junior
Uživatelský avatar
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
:arrow:
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 6. 11. 2020 08:47 
Offline
Moderátor
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 6. 11. 2020 16:33 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 6. 11. 2020 21:40 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 7. 11. 2020 20:07 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 7. 11. 2020 22:34 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 8. 11. 2020 15:16 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 10. 11. 2020 22:50 
Offline
Junior
Uživatelský avatar
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.
:arrow:
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
 Profil   
 
 Předmět příspěvku: Re: [PHP,obecné]Vynucení pořadí použití metod
Odeslat příspěvekNapsal: 11. 11. 2020 19:29 
Offline
Junior
Uživatelský avatar
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
 Profil   
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 11 ] 

Všechny časy jsou v UTC + 1 hodina


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

Hledat:
Přeskočit na:  
Podmínky pro užívání služby informační společnosti | Informace o zpracování osobních údajů | Cookies
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group