Итак, у меня есть это требование:Лучшая структура кода?
Данная Дата ($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');
Мои возражения с этим кодом:
- повторяющихся
- вложенных если-петля
- вообще трудно понять логику
Итак, дорогая община - как я мог сделать это лучше? Что бы вы сделали?
Я голосовал, чтобы закрыть этот вопрос не по теме, потому что принадлежит к codereview – ElefantPhace
@ElefantPhace можем ли мы просто перенести его в CodeReview? – Martin
@ Моды Мартина или люди высокой репутации могут, а не мы. Это будет помещено в очередь для переноса мода, без пота. –