Javascript MVC视图和AbstractView——为什么两者都有?
我开始了解基于MVC的应用程序,因为我正在从事一些繁重的JavaScript工作,筛选意大利面代码来更新东西变得难以忍受。我正在通读关于MVC模式的一章,因为我听说它的信息量很大。我有一个简短的问题: 在书中,他们使用一个视图接口和一个名为AbstractView的具体类来设置视图。AbstractView类实际上实现了视图接口中的函数以及一些帮助程序,但是您仍然需要创建自己的自定义视图类,并使用额外的逻辑来执行任何有用的操作 那么,创建视图接口的目的是什么,它的唯一目的是在实例化AbstractView对象时使用?他们接着说,要真正为应用程序创建可用视图,您需要创建扩展AbstractView类的自定义类。这难道不需要视图/抽象视图继承吗 您不应该只拥有一个抽象类View来实现基本功能(就像AbstractView那样),然后创建从View继承的自定义视图吗?如果您永远不会绕过AbstractView类而只从视图继承,那么我看不出拥有视图接口和AbstractView类背后的原因 我错过了什么好处 编辑:以下是他们使用的(ActionScript)示例代码:Javascript MVC视图和AbstractView——为什么两者都有?,javascript,model-view-controller,design-patterns,Javascript,Model View Controller,Design Patterns,我开始了解基于MVC的应用程序,因为我正在从事一些繁重的JavaScript工作,筛选意大利面代码来更新东西变得难以忍受。我正在通读关于MVC模式的一章,因为我听说它的信息量很大。我有一个简短的问题: 在书中,他们使用一个视图接口和一个名为AbstractView的具体类来设置视图。AbstractView类实际上实现了视图接口中的函数以及一些帮助程序,但是您仍然需要创建自己的自定义视图类,并使用额外的逻辑来执行任何有用的操作 那么,创建视图接口的目的是什么,它的唯一目的是在实例化Abstrac
// -------------- View Class --------------
interface mvc.View {
// Sets the model this view is observing.
public function setModel (m:Observable):Void;
// Returns the model this view is observing.
public function getModel ( ):Observable;
// Sets the controller for this view.
public function setController (c:Controller):Void;
// Returns this view's controller.
public function getController ( ):Controller;
// Returns the default controller for this view.
public function defaultController (model:Observable):Controller;
}
// -------------- AbstractView Class --------------
class mvc.AbstractView implements Observer, View {
private var model:Observable; // A reference to the model.
private var controller:Controller; // A reference to the controller.
public function AbstractView (m:Observable, c:Controller) {
setModel(m);
if (c !== undefined) {
setController(c);
}
}
// Returns the default controller for this view.
public function defaultController (model:Observable):Controller {
return null;
}
// Sets the model this view is observing.
public function setModel (m:Observable):Void {
model = m;
}
// Returns the model this view is observing.
public function getModel ( ):Observable {
return model;
}
// Sets the controller for this view.
public function setController (c:Controller):Void {
controller = c;
// Tell the controller this object is its view.
getController( ).setView(this);
}
// Returns this view's controller.
public function getController ( ):Controller {
if (controller === undefined) {
setController(defaultController(getModel( )));
}
return controller;
}
public function update(o:Observable, infoObj:Object):Void {
}
}
虽然我可能不同意命名约定,但在实践中它确实是有意义的,在第一层中,您有需要实现的接口的定义。在不给它任何功能的情况下,它可以以任何你想要的方式实现,没有任何假设。在派生类中,O'Reilly称之为“AbstractView”(根据您的描述),它可能以合理的方式实现了最常见的函数,但为专门化留下了空间。一些工具箱通常会更进一步,然后为您提供所讨论的类的一个简单的全功能实现 编辑 在看了Xenthyl的例子之后,我看到了这种分离的另一个原因,
AbstractView
不仅仅是一个视图,它还是一个观察者。因此,将基本实现与接口分离的另一个原因是,将另一个接口实现排除在外
一般来说,他们所做的似乎是定义可以组合到高阶类的抽象接口。但是接口没有被污染
- 一种实现,并由此产生一种功能性假设
- 另一个接口
这样就可以使用视图
界面,而不必是观察者
,反之亦然
另外,从语言的角度来看,由于“视图”在Actionscript中声明为“接口”,因此它无法实现任何函数,只能包含定义。其它语言如C++没有“<代码>接口< /代码>关键字,因此将触发不同的方法。
在开发时,除非您采用非常严格的方法,否则您可能不会走这条路线,除非您多次开发一个库,否则只有一个类将实现某个接口,您甚至可能没有如图所示的抽象接口,而只有具体的类。最终,当您需要提取接口的同一类型对象的第二个或第三个实现时,您可能会在其中混合一些实现,也可能不会。但他们试图向您展示良好的实践,因此他们可能出于演示目的过度设计了一些东西
这是否更有意义 虽然我可能不同意命名约定,但在实践中它确实是有意义的,在第一个层次中,您有需要实现的接口的定义。在不给它任何功能的情况下,它可以以任何你想要的方式实现,没有任何假设。在派生类中,O'Reilly称之为“AbstractView”(根据您的描述),它可能以合理的方式实现了最常见的函数,但为专门化留下了空间。一些工具箱通常会更进一步,然后为您提供所讨论的类的一个简单的全功能实现
编辑
在看了Xenthyl的例子之后,我看到了这种分离的另一个原因,AbstractView
不仅仅是一个视图,它还是一个观察者。因此,将基本实现与接口分离的另一个原因是,将另一个接口实现排除在外
一般来说,他们所做的似乎是定义可以组合到高阶类的抽象接口。但是接口没有被污染
- 一种实现,并由此产生一种功能性假设
- 另一个接口
这样就可以使用视图
界面,而不必是观察者
,反之亦然
另外,从语言的角度来看,由于“视图”在Actionscript中声明为“接口”,因此它无法实现任何函数,只能包含定义。其它语言如C++没有“<代码>接口< /代码>关键字,因此将触发不同的方法。
在开发时,除非您采用非常严格的方法,否则您可能不会走这条路线,除非您多次开发一个库,否则只有一个类将实现某个接口,您甚至可能没有如图所示的抽象接口,而只有具体的类。最终,当您需要提取接口的同一类型对象的第二个或第三个实现时,您可能会在其中混合一些实现,也可能不会。但他们试图向您展示良好的实践,因此他们可能出于演示目的过度设计了一些东西
这是否更有意义 “抽象的