Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Model view controller 如何向某人解释数据结构不应自行绘制,从而解释关注点的分离?_Model View Controller_Oop_Extend_Separation Of Concerns_Extends - Fatal编程技术网

Model view controller 如何向某人解释数据结构不应自行绘制,从而解释关注点的分离?

Model view controller 如何向某人解释数据结构不应自行绘制,从而解释关注点的分离?,model-view-controller,oop,extend,separation-of-concerns,extends,Model View Controller,Oop,Extend,Separation Of Concerns,Extends,我有另一个程序员,我正试图解释为什么UI组件不应该也是数据结构 例如,假设您从“数据库”获得一个包含记录集的数据结构,并且希望在应用程序的UI组件中显示该记录集 根据这位程序员的说法(他还不知道姓名,他很年轻,我正在教他…),我们应该将数据结构子类化为一个类,该类将在我们的应用程序中绘制UI组件 因此,根据这个逻辑,记录集应该管理UI的绘图 ******总台***** 我知道要求记录集自己绘制是错误的,因为如果您希望在UI上的多个组件类型上呈现相同的数据结构,您的手上会有一团乱麻;您需要为从记录

我有另一个程序员,我正试图解释为什么UI组件不应该也是数据结构

例如,假设您从“数据库”获得一个包含记录集的数据结构,并且希望在应用程序的UI组件中显示该记录集

根据这位程序员的说法(他还不知道姓名,他很年轻,我正在教他…),我们应该将数据结构子类化为一个类,该类将在我们的应用程序中绘制UI组件

因此,根据这个逻辑,记录集应该管理UI的绘图

******总台*****

我知道要求记录集自己绘制是错误的,因为如果您希望在UI上的多个组件类型上呈现相同的数据结构,您的手上会有一团乱麻;您需要为从记录集的基类呈现的每个UI组件扩展另一个类

我很清楚MVC模式的“清洁度”(我的真正意思是不要将数据(模型)与UI(视图)或对数据执行的操作混淆)(控制器或多或少…好吧,API不应该真的处理这个问题…控制器应该尽可能少地调用它,告诉它要渲染哪个视图),但是它肯定比使用数据结构渲染UI组件更干净

除了上面的例子,我还有什么其他建议可以给他吗?我知道当你第一次学习OOP时,你会经历一个“阶段”,你只想扩展一切

然后是一个阶段,当你认为设计模式是解决每一个问题的方法…这也不是完全正确的


有什么方法可以让我轻轻地把这个孩子推向正确的方向吗?你有没有更多的例子可以帮助我向他解释我的观点?

你听说过马丁·福勒吗


无论如何,如果他想在向数据控件添加渲染方法的方向上走得更远,让他看看“松耦合”创建某种通用类型的界面可以让他走到一半,但UI组件应该走完剩下的路。

这归结为功能性和非功能性的责任。数据结构的功能和可视化方式是两个完全不同的事情——本质上是MVC模式的根源


这里还有一个循环依赖的概念。由于UI必须了解数据结构,如果您允许数据结构依赖于UI,那么您就有了一个很好的小泥球。

通常在解耦点上:

  • 不仅可以有不同的UI组件呈现相同的数据结构。您甚至可能有完全不同的UI(Web、桌面应用程序等)。当然,您可以使用
    WebPerson
    DesktopPerson
    Person
    进行子类化(这听起来已经错了,不是吗?命名根本不是关于人的类型,而是关于其他的东西)

  • 每个UI都可以在不同的人身上工作,例如
    教师
    学生
    。因此我们得到
    网络人
    网络教师
    网络学生
    桌面教师
    桌面教师
    桌面学生

  • 现在让我们说,
    WebPerson
    定义了方法“drawAddressFields()”来绘制地址字段的web版本。但是由于
    WebTeacher
    必须从
    Teacher
    派生来使用附加数据字段“salary”(让我们假设单一继承),它必须再次实现“drawAddressFields()”

    因此,也许“这将导致更多工作”的论点将有助于创造一些动机:-)


    顺便说一句,它将自动导致创建一些实现drawAddressField()代码的委托,这将演变为创建一个独立于数据结构进行绘图的组件。

    功能性是指与UI的数据交互,而非功能性;只是数据的容器,如结果集……对吗?功能性如“某物做什么”,非功能性如“某物看起来如何”.在MVC中,“某物做什么”是模型,“某物看起来如何”是模型、视图的可视化。