Правильный способ построения классов - проект Django dartCounter
Недавно я начал заниматься программированием. Пару дней назад я понял, как использовать Django. И теперь я пытаюсь интегрировать с ним некоторый старый код на Python.
Я создал простой dartCounter. Что довольно просто в цикле while-loop. Однако для новой версии мне нужен графический интерфейс, поэтому я решил, что должен сделать несколько подходящих классов для взаимодействия без использования циклов while для механизма подсчета. Эти классы должны использоваться в секции views.py в Django.
Дело в том, что я думаю, что я уже сделал его слишком сложным, используя этот метод.
Сначала я создал класс dart_player()
class dart_player():
def __init__(self, name):
self.name = name
self.score = None
self.leg = 0
self.thrown_scores = []
def set_start_score(self, start_score):
self.score = start_score
self.thrown_scores = []
def update_score(self, score):
if self.score != None:
self.score = self.score - score
self.thrown_scores.append(score)
else:
print("Error score equals 'None' \n")
def reverse_score(self, score):
if self.score != None:
self.score = self.score + score
self.thrown_scores = self.thrown_scores[:-1]
else:
print("Error score equals 'None' \n")
def update_leg(self, leg):
self.leg = self.leg + leg
Далее я создал класс dart_match() и внутри него класс leg(), поскольку нога является частью dart_match(). Этот же класс dart_match() включил в себя класс игрока, который передается через конфигурационную переменную.
class dart_match():
def __init__(self, config = False):
if not config:
config = setup_match()
self.player_config = config['player_config']
self.match_config = config['match_config']
self.played_legs = 0
self.played_sets = 0
self.names = []
names = self.player_config.keys()
for item in names:
self.names.append(item)
def start_leg(self):
self.leg1 = self.leg(self.names, self.match_config, self.player_config)
class leg():
def __init__(self, names, match_config, player_config):
self.names = names
self.match_config = match_config
self.player_config = player_config
self.count = 1
self.statistics = {}
for player_name in names:
self.statistics[player_name] = {}
def get_player(self):
if self.match_config['teams'] == False and self.match_config['player_count'] == 2:
if self.count % 2:
return (self.player_config[self.names[0]])
elif self.count % 2 - 1:
return (self.player_config[self.names[1]])
def roulette_player(self):
if self.match_config['teams'] == False and self.match_config['player_count'] == 2:
self.count += 1
'''
if self.count % 2:
self.play_leg()
# round(self.player_config[self.names[0]])
#round_score = self.player_config[self.names[0]].score
# print("---------------------")
elif self.count % 2 - 1:
self.play_leg()
#round(self.player_config[self.names[1]])
#round_score = self.player_config[self.names[1]].score
self.count += 1
'''
def reverse(self):
if self.count > 1:
self.count -= 1
player = self.get_player()
del self.statistics[player.name][self.count]
print("self.count")
elif self.count <= 1 :
print("Start of the leg is reached")
def play_turn(self):
player = self.get_player()
print("Player {}'s turn".format(player.name))
filling_field = int(input("Enter desire \n"))
if type(filling_field) == int:
score = round(player, filling_field)
self.statistics[player.name][self.count] = score
if score == 0:
self.winner = player.name
self.count+=1
elif filling_field == str("reverse"):
print("Reverse entered")
else:
print("Error occured wrong input value")
#exit()
Для запуска этого класса я сделал функцию для генерации соответствующего конфигурационного файла (который в основном должен соотноситься со страницей настроек графического интерфейса:
).def setup_match(start_score = 501, legs = 3, sets = 1, win_settings = "best of", player_count = 2, teams = False):
###match config
if teams == True:
team_config = {}
player_config = {}
match_config = {
'teams' : teams,
'player_count': player_count,
'start_score' : start_score,
'legs': legs,
'sets': sets,
'win_settings' : win_settings
}
playerName = None
while len(player_config) < player_count:
playerName = input('enter playername: \n')
try:
player_config[playerName] = { 'start_score': start_score}
except:
print("Input Error \n")
for player in player_config:
player_config[player] = dart_player(name=player)
player_config[player].set_start_score(start_score)
print(player)
#dart_player.name = player
#player1 = dart_player(name = "mirno")
config = {
'player_config': player_config,
'match_config': match_config
}
return config
Чтобы показать вам некоторые примеры кода и то, как я планирую с ним взаимодействовать: config = setup_match()
предлагает 2 имени: менно бенно
Далее я ввожу этот конфигурационный файл в класс dart_match. match = dart_match(config = config)
Теперь мы можем взаимодействовать с матчем.
- match.names > ['menno', 'benno']
- match.played_legs > 0
- match.player_config['menno'] > Класс dart_player создан для Menno. С ним можно взаимодействовать внутри ноги для управления счетом.
Теперь мы можем начать с ноги. match.start_leg()
На данный момент это создаст класс ноги match.leg1 для взаимодействия внутри матча. (Я знаю, что параметризация не должна быть статически приписана к leg1. Но это будет улучшено)
Например, чтобы взаимодействовать с ногой. Мы можем увидеть, какой игрок в данный момент находится на очереди: match.leg1.get_player().name 'menno'
Далее мы хотим запустить наш ход этой ноги. match.leg1.play_turn() вход: 50 Ход игрока menno Менно, твой счет: 501
451 осталось
Как мы видим, это повторит счет Менно на 50 очков. И ищем следующий ход:
match.leg1.get_player().name 'benno'
Мы видим, что сейчас очередь Бенно.
Как видите, структура классов стала довольно сложной для того, что должно быть довольно простым. И не совсем удобной для использования и взаимодействия, на мой взгляд.
Кроме некоторых ошибок и несоответствий, у кого-нибудь есть идея, как подойти к этой конструкции классов лучше/более разумно.
Раздражает эта структура.
- Создайте конфигурационный файл и добавьте в класс (player_config & match_config)
- В конфиг файле созданы игроки и ссылки на них в словаре.
- Класс leg, внутри класса dart_match использует словарь player_config. Содержит класс dart_player для взаимодействия с пользовательским счетом.
По какой-то причине я не смог придумать лучший способ реализации этой части. Какие обычно существуют хорошие подходы для решения таких проблем со структурой класса ?