2015-11-06 4 views
-1

Итак, у меня есть это требование:Лучшая структура кода?

Данная Дата ($dateissued) является String, как правило, ДД.ММ.ГГГГА, но это также может быть MM.YYYY или даже просто YYYY. В последнем случае я должен рассматривать его как промежуток, например «весь ноябрь 2005 года» за «11.2005». Для этого я выводю на $startdate и, если это интервал, устанавливается $enddate (в противном случае возвращается пустым). Выход идет в JSON, так что форматирование в порядке.

  • если данная дата является XX.XX.XXXX, разобрать, как ДД.ММ.ГГГГ
  • если данная дата является XX.XXXX, разобрать, как 01.MM.YYYY и установите ENDDATE в LL.MM. YYYY, где LL последний день месяца
  • если данная дата является XXXX, разобрать, как 01.01.YYYY и установите ENDDATE в 31.12.YYYY

    $dateissued = get_sub_field('w_pub_dateissued'); // get Date String from field 
        $parsedstartdate = date_create_from_format('d.m.Y', $dateissued); 
        $startdate = ''; 
        $enddate = ''; 
        if ($parsedstartdate == false) { // date_create_from_format() returns false if it fails 
         $parsedstartdate = date_create_from_format('d.m.Y', '01.'.$dateissued); // try again as 01.MM.YYYY 
         if ($parsedstartdate == false) { 
          $parsedstartdate = date_create_from_format('d.m.Y', '01.01.'.$dateissued); // try again as 01.01.YYYY 
          if ($parsedstartdate == false) { 
           // bad date; nothing todo, $startdate is empty by default 
          } else { 
           // Full Year 
           $startdate = $parsedstartdate->format('d.m.Y'); 
           $parsedenddate = clone $parsedstartdate; 
           $parsedenddate->add(new DateInterval('P1Y'))->sub(new DateInterval('P1D')); 
           $enddate = $parsedenddate->format('d.m.Y'); 
          } 
         } else { 
          // Full Month 
          $startdate = $parsedstartdate->format('d.m.Y'); 
          $parsedenddate = clone $parsedstartdate; 
          $parsedenddate->add(new DateInterval('P1M'))->sub(new DateInterval('P1D')); 
          $enddate = $parsedenddate->format('d.m.Y'); 
         } 
        } else { 
         $startdate = $parsedstartdate->format('d.m.Y'); 
        } 
        return compact('startdate', 'enddate'); 
    

Мои возражения с этим кодом:

  • повторяющихся
  • вложенных если-петля
  • вообще трудно понять логику

Итак, дорогая община - как я мог сделать это лучше? Что бы вы сделали?

+6

Я голосовал, чтобы закрыть этот вопрос не по теме, потому что принадлежит к codereview – ElefantPhace

+0

@ElefantPhace можем ли мы просто перенести его в CodeReview? – Martin

+0

@ Моды Мартина или люди высокой репутации могут, а не мы. Это будет помещено в очередь для переноса мода, без пота. –

ответ

1

Я думаю, что мы могли бы сделать что-то вроде ...

<?php 
function get_date_interval($thisdate){ 
    /* I don't have the function you do so here we are receiving date as parameter */ 
    $dateissued = $thisdate; 
    $return=false; 
    if($parsedstartdate=date_create_from_format('d.m.Y',substr('01.01.'.$dateissued,-10))){ 
     switch (strlen($dateissued)){ 
      case 4: 
       $interval = 'P1Y'; 
       break; 
      case 7: 
       $interval = 'P1M';  
       break; 
      case 10:  
       $interval = 'P1D'; 
       break; 
      default: 
       return $return; 
     }   
     $startdate = $parsedstartdate->format('d.m.Y'); 
     $parsedenddate = clone $parsedstartdate; 
     $parsedenddate->add(new DateInterval($interval))->sub(new DateInterval('P1D')); 
     $enddate = $parsedenddate->format('d.m.Y'); 
     $return = compact('startdate', 'enddate'); 
    } 
    return $return; 
} 

Testing ...

echo "<pre>"; 
print_r(get_date_interval('2015')); 
print_r(get_date_interval('11.2015')); 
print_r(get_date_interval('06.11.2015')) ; 
print_r(get_date_interval('invalid')) ; 
print_r(get_date_interval('15')) ; 
print_r(get_date_interval(NULL)) ; 
echo "</pre>"; 

Я намеренным изменили спецификацию на мой вкус, когда диапазон на один день Я сделал дату начала и дату начала, имея одну и ту же дату ... поэтому выход будет следующим:

Array 
(
    [startdate] => 01.01.2015 
    [enddate] => 31.12.2015 
) 
Array 
(
    [startdate] => 01.11.2015 
    [enddate] => 30.11.2015 
) 
Array 
(
    [startdate] => 06.11.2015 
    [enddate] => 06.11.2015 
) 

Но если этот импульс действует существующая логика/поток, нам просто нужен другой, если сделать это = false.

Смежные вопросы