Команда Спорт-класс Джанго


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

class Member(models.Model):
    team = models.IntegerField(default=0)
    match = models.ForeignKey(Match, null=True, blank=True)

    def engage(self, match_instance, team_number):
        self.match = match_instance
        self.team = team_number
        self.save()

class NPCGeneric(models.Model):
    speed = models.IntegerField(default=1)
    difficulty = models.IntegerField(default=0)

class NPCInstance(Member):
    generic = models.ForiegnKey(NPCGeneric);
    status = models.CharField(max_length=50)

    def engage(self, match_instance, team_number):
        new_instance = NPCInstance(generic=self)
        new_instance.save()       
        return new_instance.engage(match_instance, team_number)

class Player(Member):
    name = models.CharField(max_length=100)


class Match(models.Model):
    event_members = []

    def __init__(self, *args, **kwargs):        
        retval = super(Match, self).__init__(*args, **kwargs)
        if(args[0] and hasattr(args[0], '__iter__')):
            teams = args[0]
            args = args[1:]
            self.__init_new__(teams)
        elif(self.id):
            self.__init_existing__()
        return retval

    def __init_new__(self, teams):
        new_teams = []
        for team in teams:
            new_team = []
            new_teams.append(new_team)
            team_number = new_teams.index(new_team)
            for event_member in team:
                team_member = event_member .engage(self, team_number)
                team_member .save()
                new_team.append(team_member)
        self.event_members = new_teams

    def __init_existing__(self):
        new_teams = []
        def add_list(list, member, team):
            while(list.__len__() < (team + 1)):
                list.append([])
            list[team].append(member)

        for event_member in self.member_set.all():
            try:
                member = event_member.npcinstance
            except:
                member = event_member.player
            add_list(new_teams, member, member.team)
        self.event_members= new_teams

Так что это, где я начинаю думать, что там должен быть более экологически чистыми. К сожалению, мой мозг просто продолжает застревать на том, что у меня уже есть.

Я хотел бы знать, если кто может предложить чище/подходящие для Python способ для удерживания членов в классе матч. в частности:

  • Парафирование соглашения просто кажется очень странным и неуклюжим. Я боюсь, я представлю ошибки таким образом.
  • лучший способ представления команд кроме список списков event_members


416
2
задан 4 июля 2011 в 01:07 Источник Поделиться
Комментарии
1 ответ

К сожалению, это только мне кажется, что проблемы лежат вне куска кода, который вы предлагаете к рассмотрению. Сам код более или менее нормально, но некоторые предположения за ней, кажется, не правильно.


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

Ну, у вас еще есть в любом случае команды, ты просто обходят их "имплицитно", по их номерам. ММО это на самом деле делает его более сложным и менее "весть" (помните, что явное лучше, чем неявное).

И, хотя я не знаю точных требований, но, возможно, что вы пытаетесь сделать в шаблонах, может быть достигнута другим способом?

Обновление в ответ на комментарий:


Также хочу отметить, что код работает. Это просто не "сетки" в голове хорошо.

Код может работать, но это выглядит очень... необычно. И в Конвенции в Python много значат. И в Джанго они значат даже больше: это основы, и, как и любой другой структуре, он имеет множество дизайнерских решений уже сделано для вас. Это позволяет вам сосредоточиться на ваших структур данных и бизнес-логики, но он делает это, принимая от вас какую-то свободу.

Поэтому, когда вы начинаете писать такие сложные методы инициализации, то, наверное, что-то идет не так. Я бы сказал, что это, и "неявные" команды, такие случаи, когда ты начинаешь "воевать рамках". Это, как правило, проигрывают сражения. Обычный способ-это просто класс команды. Это также делает код более легким в обслуживании, что очень важно. (Что если требования изменились и вам нужно хранить больше информации о команде, а не только его количество?)


я также пытаюсь сохранить количество различных объектов в БД до минимума, но это не так важно

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

3
ответ дан 9 июля 2011 в 02:07 Источник Поделиться