ФорумПрограммированиеPython → пример MVC

пример MVC

  • zlodiak

    Сообщения: 17 Репутация: N Группа: Кто попало

    Spritz Дек. 10, 2015, 11:25 п.п.

    ребята, не посылайте только. со мной в последнее время случился паттерн головного мозга и теперь я пишу простенькие никому не нужные примеры. вот один из них. дайте пожалуйста обзор кода, всё ли зесь верно с точки зрения 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()    
    

    после запуска скрипта в консоль выводится следующее100

    
    (python3_env)kalinin@kalinin ~/python3/python3_files/mvc_1 $ python index.py
    runner name: sergey
    runner height(cm):182.0
    runner name: sergey
    runner height(m):1.82
    
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 12:55 д.п., спустя 1 час 30 минут 11 секунд

    принты в методе? технически так можно делать, но это не MVC

    данные из метода нужно передавать хэш-массивом в шаблонизатор. это даёт а) удобство тестирования б) возможность оборачивать эти данные в любую обёртку - json, xml, html, текст

    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 1:02 д.п., спустя 6 минут 31 секунду

    вот MVC

    экшн (псевдокод)

    
        class Controller
          method foo(params)
            data = Model.find_by_primary_key(params.id) // считаем, что модель возвращает хэш-массив
            data._full_name = sprintf('%s %s', data.first_name, data.last_name)
            data._height_m = data.height_cm / 100;
            return {data: data} // практически json
    

    шаблон

    
        <div>Имя: {$data._full_name}</div>
        <div>Рост, м: {$data._height_m}</div>
    
    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 11, 2015, 1:17 д.п., спустя 14 минут 58 секунд

    @master, вообще строго говоря в слове MVC V(iew) не является шаблоном, а имеется ввиду что есть какой-то метод коорый берет данные из контроллера для нужного model и выводит их любым удобным методом. Так что доебка не засчитана имхо

    Сапожник без сапог
  • zlodiak

    Сообщения: 17 Репутация: N Группа: Кто попало

    Spritz Дек. 11, 2015, 1:49 д.п., спустя 32 минуты 54 секунды

    вот спасибо, пинки очень полезные

    ещё меня терзают смутные сомнения по поводу метода output() в контроллере. как думаете, если вместо него написать два метода таких:

    output_height_in_m(),

    output_height_in_cm()

    , то это не нарушит фен шуй MVC? или правильнее оставить как есть?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 11, 2015, 1:58 д.п., спустя 8 минут 56 секунд

    @zlodiak, в MVC контроллер вообще занимается выводом? я вот хз :))))))

    Спустя 14 сек.

    да и какая нахуй разница на теорию, на практике как правило все не так просто

    Сапожник без сапог
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 2:17 д.п., спустя 18 минут 12 секунд

    @master, вообще строго говоря в слове MVC V(iew) не является шаблоном, а имеется ввиду что есть какой-то метод коорый берет данные из контроллера для нужного model и выводит их любым удобным методом. Так что доебка не засчитана имхо

    @phpdude, формально да, а на практике цель VC - отделение исполняемого кода от шаблона, потому что для обработки данных удобнее использовать один язык (общего назначения), для отображения - другой (язык шаблонов). т.е. выводить данные в STDOUT принтами смысла особого не имеет

    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 11, 2015, 2:21 д.п., спустя 4 минуты 10 секунд

    @master, вообще строго говоря в слове MVC V(iew) не является шаблоном, а имеется ввиду что есть какой-то метод коорый берет данные из контроллера для нужного model и выводит их любым удобным методом. Так что доебка не засчитана имхо

    @phpdude, формально да, а на практике цель VC - отделение исполняемого кода от шаблона, потому что для обработки данных удобнее использовать один язык (общего назначения), для отображения - другой (язык шаблонов). т.е. выводить данные в STDOUT принтами смысла особого не имеет

    @master, блин ну понятно, но короче доебался ты не до того что попросили ))) формально если подходить к вопросу.

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

    Сапожник без сапог
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 2:23 д.п., спустя 2 минуты 4 секунды

    ещё меня терзают смутные сомнения по поводу метода output() в контроллере. как думаете, если вместо него написать два метода таких:

    output_height_in_m(),

    output_height_in_cm()

    @zlodiak, удобнее связывать один метод контроллера с одним конкретным шаблоном/вьюхой. вплоть до названий - называем метод user_info и шаблон соответственно user_info.tpl

    Вообще неплохо бы открыть какой-нибудь рабочий пример рабочего MVC-фреймворка и уже по нему задавать вопросы. Django, Rails, (в пхп вроде Symfony), чем велосипедить во все поля.

    Спустя 269 сек.

    @phpdude, ну да, на начальном этапе понимания можно заменить шаблонизатор принтами

    @zlodiak, если откинуть идею о шаблонизаторе, то удобнее да, заменить output на два метода, в кажом из которых только один вызов вьюхи. выбор выводить метры или сантиметры нужно производить либо до вызова метода контроллера (в роутере) либо в шаблоне вьюхи

    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 2:36 д.п., спустя 13 минут 21 секунду

    либо в контроллере, формируя строку

    
    // вьюха
    def output(data):
      print('runner name: ' + str(data.name))
      print('runner height(' + data.measure + '): ' + str(data._height))
    
    //контроллер
    def output(self):
      data = self.model.getData() // {measure: 'm', height: 180}
      if (data.measure == 'm'):
        data._height = data.height / 100
      else:
        data._height = data.height
      self.view.output(data)
    
    не всё полезно, что в swap полезло
  • zlodiak

    Сообщения: 17 Репутация: N Группа: Кто попало

    Spritz Дек. 11, 2015, 2:38 д.п., спустя 1 минуту 26 секунд

    выбор выводить метры или сантиметры нужно производить либо до вызова метода контроллера (в роутере) либо в шаблоне вьюхи

    @master, то есть в шаблон добавить логику?..

  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 11, 2015, 2:49 д.п., спустя 8 минут 50 секунд

    smarty & jinja2 в плане доступной логики это уже перебор, там не шаблоны а код получаются.

    это то о чем в свое время ругался на smarty @AlexB

    Спустя 15 сек.

    в сравнении с blitz чтоли

    Спустя 15 сек.

    django tempaltes в этом плане хорошая равновесная граница на мой взгляд )

    Сапожник без сапог
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Дек. 11, 2015, 3:15 д.п., спустя 25 минут 46 секунд

    @phpdude, специально для гиков есть CTPP =)

    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 11, 2015, 3:20 д.п., спустя 5 минут 45 секунд

    @phpdude, специально для гиков есть CTPP =)

    @master, ну да да

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!