Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 10, 2015 14:34:53

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

усовершенствовать mvc

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

class RunnerModel(object):
def __init__(self, name, height):
''' default height in mm '''
self.name = name
self.height = height


class RunnerView(object):
def __init__(self, model):
self.model = model

def output_height_in_m(self):
print('runner name: ' + str(self.model.name))
print('runner height(m):' + str(self.model.height/1000))

def output_height_in_cm(self):
print('runner name: ' + str(self.model.name))
print('runner height(cm):' + str(self.model.height/10))


class RunnerController(object):
def __init__(self, model, measure):
self.model = model
self.view = RunnerView(self.model)
self.measure = measure

def output(self):
if self.measure == 'm':
self.view.output_height_in_m()
elif self.measure == 'cm':
self.view.output_height_in_cm()


if __name__ == "__main__":
runner_1 = RunnerModel(name='sergey', height=1820)
controller_1 = RunnerController(runner_1, 'cm')
controller_1.output()
controller_1 = RunnerController(runner_1, 'm')
controller_1.output()

у меня сомнения по поводу метода RunnerController.output(). не было бы правильнее разбить его на 2 метода?:
def output_m(self):
self.view.output_height_in_m()

def output_cm(self):
self.view.output_height_in_cm()

так же у меня сомнения по поводу выноса вычислений(если их так можно назвать) из output_height_in_m(), output_height_in_cm() в методы модели. а из указанных функций только вызывать эти методы

всё это было бы оправдано с точки зрения mvc?

Отредактировано zlodiak (Дек. 10, 2015 14:35:19)

Офлайн

#2 Дек. 11, 2015 11:51:33

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

усовершенствовать mvc

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

В современных MVC модель является активной. Она оповещает представление (View) о том, что в ней произошли изменения. Представление не обязательно должно быть одно. Возможно, в программе (сразу или в дальнейшем) потребуется несколько представлений. Например, в Excel одни и те же данные могут быть представлены в виде таблицы и в виде диаграммы. Те представления, которые заинтересованы в оповещении, подписываются на сообщения, поступающие от модели. При каждом изменении внутренних данных в модели она оповещает все зависящие от нее представления, и эти представления обновляются (вызывают свои методы для своего обновления). При этом модель остается независимой как от контроллера, так и от представления.

Офлайн

#3 Дек. 11, 2015 12:03:03

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

усовершенствовать mvc

old_monty, спасибо за ответ. если я встрою в модель паттерн Наблюдатель/подписчик это сделает модель активной?

а по поводу нескольких представлений не понял. у меня же специально для генерации различных представлений есть в RunnerView методы:
output_height_in_m,
output_height_in_сm
упрощённо это и есть excel-таблица и диаграмма, про которые вы писали

Офлайн

#4 Дек. 11, 2015 12:20:28

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

усовершенствовать mvc

zlodiak
old_monty, спасибо за ответ. если я встрою в модель паттерн Наблюдатель/подписчик это сделает модель активной?
Думаю, да. Модель должна рассылать сообщения, а представление должно подписываться на эти сообщения. Подписка на сообщение означает, что при поступлении определенного сообщения представление вызовет свой соответствующий метод.
zlodiak
а по поводу нескольких представлений не понял. у меня же специально для генерации различных представлений есть в RunnerView методы: output_height_in_m, output_height_in_сm упрощённо это и есть excel-таблица и диаграмма, про которые вы писали
Различные методы в классе представления у вас есть, согласен. Пока не могу сказать, правильно так делать или нет.

UPDATE:
zlodiak
упрощённо это и есть excel-таблица и диаграмма, про которые вы писали
Посмотрел еще раз и вот что думаю. Это сходство, о котором вы говорите, очень отдаленное, если вообще имеется. В Excel изменение данных в модели автоматически приводит к одновременному обновлению всех представлений (таблицы и диаграммы). А у вас два метода независимы друг от друга. Если обновились данные в модели, а был вызван только один метод (рост в метрах), то ранее выведенный рост в сантиметрах сам по себе не обновится.

Отредактировано old_monty (Дек. 11, 2015 13:20:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version