Давайте проанализируем это математически.
Дата начала может быть либо в субботу, либо нет. Аналогично, дата окончания может быть либо в субботу, либо нет. В простейшем случае обе даты в субботу; тогда вы можете ясно видеть, что число суббот равно 1 плюс количество недель между двумя датами.
Отсюда легко увидеть, что если начальная дата в субботу, а конечная дата - нет, то число суббот будет равно 1 плюс количество недель между двумя датами , округленное в меньшую сторону. , так как неделя окончания даты еще не достигла субботы. Оказывается, та же самая математика работает и для первого примера, поскольку между датами у вас будет целое число недель. Таким образом, мы можем охватить оба примера, просто используя 1 + floor(weeks_between_dates)
.
Что если конечной датой является суббота, а начальной - нет? Оказывается, математика все еще работает так же! Это то же самое, что «перенести» дату начала с субботы, и это добавит частичную неделю, пока она не достигнет предыдущей субботы. Эти неполные недели округляются по полу, и как только они достигнут предыдущей субботы, вы все равно добавите 1, поскольку к разнице добавится целая неделя! Таким образом, мы все еще хорошо с 1 + floor(weeks_between_dates)
.
Таким образом, единственная возможная комбинация - две даты, которые не являются субботой. Это самая сложная возможность. Давайте начнем с простого и предположим, что даты - две среды подряд. Затем они отделяют 1 неделю и между ними 1 суббота. Просто. Если они две недели друг от друга, у них есть 2 субботы. Но что, если это среда и следующий вторник? Между ними меньше недели, но все равно 1 суббота. А если это среда и следующий четверг? Больше 1 недели, но еще 1 суббота! Так что в этом случае мы бы хотели округлить количество недель и остановиться на этом, давая нам ceil(weeks_between_dates)
. Но если они оба находятся в одной и той же неделе - например, в понедельник и пятницу - в одну и ту же неделю, то ответ - всего 0. Итак, как мы узнаем, являются ли дни частью одной недели? Предполагая, что они отсортированы и дата начала всегда предшествует дате окончания, тогда они находятся на одной и той же неделе, если и только если между ними меньше 1 недели, а день начала недели предшествует концу дня недели.
Итак, прямая условная логика здесь такая (в псевдокоде):
weeks_between = floor((days between start and end) / 7)
if start.weekday = Saturday or end.weekday = Saturday, then:
return 1 + weeks_between
else if weeks_between = 0 and start.weekday is before end.weekday, then:
return 0
else
return ceil((days between start and end) / 7)
Rob Conery в MS предложил некоторое полезное УСПОКОИТЕЛЬНОЕ именование стиля для действий.
* Index - the main "landing" page. This is also the default endpoint. * List - a list of whatever "thing" you're showing them - like a list of Products. * Show - a particular item of whatever "thing" you're showing them (like a Product) * Edit - an edit page for the "thing" * New - a create page for the "thing" * Create - creates a new "thing" (and saves it if you're using a DB) * Update - updates the "thing" * Delete - deletes the "thing"
результаты в URL вроде (для форума)
* http://mysite/forum/group/list - shows all the groups in my forum * http://mysite/forum/forums/show/1 - shows all the topics in forum id=1 * http://mysite/forums/topic/show/20 - shows all the posts for topic id=20
Я нашел сообщение в блоге Стивена Уолтера , полезное для поиска последовательной схемы именования. Его также получены из схемы именования в стиле REST, с некоторыми уникальными исключениями, которые он объясняет.
Встроенный суффикс действий Django _done. Таким образом, LoginDone будет страницей, которая обрабатывает Login (в стиле верблюда ASP.NET MVC).
Это довольно не важно, какое соглашение Вы используете для именования Действия Контроллера, пока это последовательно для Вас и понятно тем, которые работают над ним.
В случае Ваших Действий входа в систему, LoginDone прекрасен, и в том же было желание ProcessLogin, легко понять, так используйте соглашение, в котором Вы чувствуете себя довольными.
Лично я, вероятно, принял бы сторону Входа в систему и ProcessLogin, поскольку LoginDone является, вероятно, немного вводящим в заблуждение с точки зрения того, что делает Действие - это, конечно, предполагает, что Действие реагирует на учетные данные пользователей и проверяет, допустимы ли они. Вы могли тогда передать до другого Действия под названием LoginDone, как только вход в систему успешен, или LoginFailed, если это не.