Джанго: Вопрос о модельной архитектуре - PullRequest
1 голос
/ 07 января 2010

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

Я пытаюсь построить это так, чтобы у меня был класс Payment в качестве моего фасада, который принимает номера cc и т. Д., И класс PayPal в качестве моей реализации, чтобы я мог зарядить карту и сохранить информацию об этом, и т.д.

class MyFacadeClass(models.Model):
    account = models.ForeignKey('Account')  # Account omitted from example for brevity.
    implementation = CharField(max_length=255, choices=IMPL_CHOICES)  # IMPL_CHOICES omitted for brevity
    some_field = models.CharField(max_length=255)

    def __init__(self, *args, **kwargs):
        super(MyFacadeClass, self).__init__(*args, **kwargs)
        if self.implementation == 'PAYPAL':
            from somewhere import MyPayPalImplementationModelClass
            self.impl = MyPayPalImplementationModelClass(my_facade_instance=self, some_field=self.some_field, account=self.account)
            # Then MyPayPalImplementationModelClass does stuff with PayPal and has its own attributes such as ack, and datetime and fee_amount behind the scenes.

    def save(self, force_insert=False, force_update=False)
        if self.impl.is_valid():
            self.impl.save()
        super(MyFacadeClass, self).save(force_insert, force_update)

1 Ответ

2 голосов
/ 07 января 2010

Не совсем ясно, на что нацелены ваши классы "реализации", просто взглянув на код выше. Неясно, являются ли классы реализации еще одной моделью ORM или просто пользовательским классом, который предоставляет метод save ().

Пару уловок только от скимминга, что выше.

Линия:

self.impl = MyImplementationClass(my_facade_class_instance=self, some_field=self.some_field, account=self.account)

приходит до вызова super (), что означает, что весьма вероятно, self.some_field и self.account не будут правильно инициализированы во время передачи его другой модели.

Вторая проблема заключается в том факте, что, как написано выше, два экземпляра (вероятно, в зависимости от того, как написан MyImplementationClass) содержат циклические ссылки друг на друга. Это означает, что количество ссылок не будет равно 0, когда объекты выходят из области видимости. Циклический GC (вероятно) со временем будет собирать эти объекты мусором, но вы проигрываете детерминированную сборку мусора, которая (на мой взгляд) является действительно мощной функцией Python.


Похоже, вы пытаетесь реализовать так называемое «родовое отношение», которое уже есть в приложении contrib.contenttypes django: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1 Если вы просто хотите, чтобы объект ссылался на один из для многих типов моделей вы можете сделать это, используя общие отношения из «типов содержимого».

...