Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 将输出从控制器传递到模型以查看是否违反MVC?_Oop_Model View Controller_Architecture - Fatal编程技术网

Oop 将输出从控制器传递到模型以查看是否违反MVC?

Oop 将输出从控制器传递到模型以查看是否违反MVC?,oop,model-view-controller,architecture,Oop,Model View Controller,Architecture,假设我想输出一条消息“hi”。字符串在控制器类中创建,然后传递给模型类中的处理程序,然后传递给视图类中的输出函数 e、 g “controller”从未触及视图,但像这样将字符串传递给类似乎有点让我不安,因为我几乎可以一开始就键入print('hi'),这显然违反了MVC原则。简而言之: 控制器:处理用户请求,如单击按钮(用于桌面应用程序)或发送表单(用于web) 模型:处理数据,如何表示、存储和检索数据 视图:处理用户真正看到的视觉部分 关于您的代码,这是错误的,模型应该对视图一无所知 M

假设我想输出一条消息“hi”。字符串在控制器类中创建,然后传递给模型类中的处理程序,然后传递给视图类中的输出函数

e、 g

“controller”从未触及视图,但像这样将字符串传递给类似乎有点让我不安,因为我几乎可以一开始就键入
print('hi')
,这显然违反了MVC原则。

简而言之:

  • 控制器:处理用户请求,如单击按钮(用于桌面应用程序)或发送表单(用于web)
  • 模型:处理数据,如何表示、存储和检索数据
  • 视图:处理用户真正看到的视觉部分
关于您的代码,这是错误的,模型应该对视图一无所知

MVC有两种主要方法:被动模型和主动模型

在第一种方法中,控制器是来自模型的数据与其在视图中的表示之间的中介

class Controller:
  def __init__(self):
    self.model = Model()
    self.view = View()
  def messageHandler(self):
    self.view.display_my_message(self.model.getMessage())

class Model:
  def __init__(self):
      pass
  def getMessage(self):
      return 'hi'

class View:
  def display_my_message(self, message)
    print(message)
在第二个示例中,当您可以订阅视图以查看模型中的更改时,使用。当进行更改时,模型会通知观察者,观察者随后可以采取行动

class Controller:
  def __init__(self):
    self.model = Model()
  def messageHandler(self):
    self.model.putMessage('hi')

class Model:
  def __init__(self):
      self.subscribers = []
      self.message = ''

  def attach(subscriber):
      self.subscribers.append(subscriber)

  def notify():
      for s in self.subscribers:
          s.update()

  def putMessage(self, message):
      self.message = message
      self.notify()

  def getMessage(self):
      return self.message

class View:
  def update(self, message)
    print(message)

注意:我不习惯用python编程,可能有一些语法错误。

将字符串传递给模型绝对没有问题;MVC是一种分层体系结构。在分层体系结构中,您可以自由地从应用程序层(控制器)移动到下面的域层(模型)。请注意,我将变量的传递描述为“移动”

因此: 您可以使用变量从控制器调用模型中的函数。 类控制器 { void方法() { Model.call('yourstring'); } }

但是,您不应该从模型向上移动到控制器


您的模型将使用此字符串执行某些操作(可能会自我更新),在良好的ol'MVC中,更改将触发视图上的事件。

@downvorters,介意评论吗?@pétur,感谢您的编辑
class Controller:
  def __init__(self):
    self.model = Model()
    self.view = View()
  def messageHandler(self):
    self.view.display_my_message(self.model.getMessage())

class Model:
  def __init__(self):
      pass
  def getMessage(self):
      return 'hi'

class View:
  def display_my_message(self, message)
    print(message)