Исключения, enforce и зависимости
От: Roman Odaisky Украина  
Дата: 07.09.08 21:44
Оценка:
Hi All,

В недрах одного сайта есть код на Python, который должен:
1. Взять из POST-запроса ID объекта;
2. По ID найти объект и его предка;
3. По предку найти хозяина;
4. Если все вышеперечисленные объекты существуют, а хозяин совпадает с текущим юзером, взять из POST данные и обновить объект согласно им;
5. Сделать перенаправление.

Сейчас это выглядит так:
1 @post(action="edit_child")
2 @access_restricted
3 def do_edit_child(request):
4     child = get_object_or_404(models.child, pk=request.POST["child_id"]) # вылетит Http404, если объект не найден
5     parent = enforce_owned(child.parent, request.user)                   # вылетит access_denied, если юзер не тот
6     forms.child(request.POST, instance=child).save()                     # это обновляет данные в БД
7     return url_from_view(edit_child, kwargs=dict(parent_id=parent.id, child_id=child.id)) # redirect на нужный адрес

Строчки 5 и 6 с виду не зависят друг от друга. Переменная «parent» вообще требуется только в одном месте, но сунуть пятую строчку в седьмую по очевидным причинам нельзя. А она всё тянется и тянется, рука.

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

Или это у меня руки попросту кривые?
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.