Javascript MVC视图和AbstractView——为什么两者都有?

Javascript MVC视图和AbstractView——为什么两者都有?,javascript,model-view-controller,design-patterns,Javascript,Model View Controller,Design Patterns,我开始了解基于MVC的应用程序,因为我正在从事一些繁重的JavaScript工作,筛选意大利面代码来更新东西变得难以忍受。我正在通读关于MVC模式的一章,因为我听说它的信息量很大。我有一个简短的问题: 在书中,他们使用一个视图接口和一个名为AbstractView的具体类来设置视图。AbstractView类实际上实现了视图接口中的函数以及一些帮助程序,但是您仍然需要创建自己的自定义视图类,并使用额外的逻辑来执行任何有用的操作 那么,创建视图接口的目的是什么,它的唯一目的是在实例化Abstrac

我开始了解基于MVC的应用程序,因为我正在从事一些繁重的JavaScript工作,筛选意大利面代码来更新东西变得难以忍受。我正在通读关于MVC模式的一章,因为我听说它的信息量很大。我有一个简短的问题:

在书中,他们使用一个视图接口和一个名为AbstractView的具体类来设置视图。AbstractView类实际上实现了视图接口中的函数以及一些帮助程序,但是您仍然需要创建自己的自定义视图类,并使用额外的逻辑来执行任何有用的操作

那么,创建视图接口的目的是什么,它的唯一目的是在实例化AbstractView对象时使用?他们接着说,要真正为应用程序创建可用视图,您需要创建扩展AbstractView类的自定义类。这难道不需要视图/抽象视图继承吗

您不应该只拥有一个抽象类View来实现基本功能(就像AbstractView那样),然后创建从View继承的自定义视图吗?如果您永远不会绕过AbstractView类而只从视图继承,那么我看不出拥有视图接口和AbstractView类背后的原因

我错过了什么好处

编辑:以下是他们使用的(ActionScript)示例代码:

// -------------- 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++没有“<代码>接口< /代码>关键字,因此将触发不同的方法。

在开发时,除非您采用非常严格的方法,否则您可能不会走这条路线,除非您多次开发一个库,否则只有一个类将实现某个接口,您甚至可能没有如图所示的抽象接口,而只有具体的类。最终,当您需要提取接口的同一类型对象的第二个或第三个实现时,您可能会在其中混合一些实现,也可能不会。但他们试图向您展示良好的实践,因此他们可能出于演示目的过度设计了一些东西

这是否更有意义

“抽象的