Обширная композиция объектов - PullRequest
0 голосов
/ 24 апреля 2011

У меня есть модель Django, которая имеет много методов (и в будущем их будет еще больше), потому что она занимает центральное место в приложении.Это пользовательская модель пользователя, которая взаимодействует с устаревшей базой данных.Существуют методы, которые проверяют права доступа пользователя к различным областям, разным видам затрат и т. Д.

Поскольку существуют группы методов, которые связаны друг с другом, имеет смысл разбить их на отдельные классы и использоватьсостав объекта.Мой вопрос, однако, заключается в том, как сделать так, чтобы это казалось конечному разработчику.Должны ли они использовать цепочки объектов, такие как user.access.has_normal_access(), или должны существовать методы для объекта User, которые просто проходят к базовому объекту?

Кажется, что создание цепочек объектов в Python не рекомендуется, но альтернатива созданиясквозные методы, кажется, расходятся с целью, которая заключается в сокращении числа методов в первичном классе.

Мысли?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2011

Я полагаю, что не Django, чистое решение на Python с использованием декораторов подходит для вас.

Пожалуйста, рассмотрите следующий код

def check1(): print "check1"
def check2(): print "check2"

def dev_api(f):
    def fd(*args, **kw):
        check1()
        check2()
        f(*args, **kw)
        # optionally, perform some post check
        print "post check"
    return fd

@dev_api
def business(a, b, *args, **kw):
    print 'business', a, b, args, kw

business(1, 2, 'a', 'b', 'c', x='x', y='y')
  • check1, check2 ваше мнение, другая стоимостьфункции и т. д.
  • dev_api - это функция группировки ваших "проверочных" функций
  • бизнес - это функция бизнес-логики, выполнение которой должно быть ограничено вашими функциями "проверки"

Теперь вы можете предоставлять функции бизнес-логики, оформленные, как описано выше, или сами декораторы для конечного использования разработчиком.

есть еще кое-что, что можно узнать с помощью декораторов (то есть декораторов с параметрами).пожалуйста, не стесняйтесь запрашивать больше примеров, если это необходимо.

вывод кода выше

check1
check2
business 1 2 ('a', 'b', 'c') {'y': 'y', 'x': 'x'}
post check
0 голосов
/ 24 апреля 2011

Если вы хотите разделить методы в одной и той же модели БД на разные наборы связанных методов, возможно, вам следует использовать модели прокси .

Будет использоваться тот же базовый БД, нобудут разные разные классы.

Я не уверен, что это лучшее решение, когда вы говорите о User классе.Вы не предоставили достаточно подробностей, чтобы я мог сказать наверняка, но наверняка вы могли бы использовать встроенные разрешения , чтобы достичь того, что вы намереваетесь?

...