2

我有一个使用 Backbone.js 框架(基于原型)的 Web 应用程序。但是,有些面向对象的代码不是 Backbone.js 代码。我的问题是:如果不是所有代码都是面向对象的,我如何用 UML 记录应用程序建模?如何基于样式原型建模并将其与 OO 结合?这可能和/或正确吗?谁能指点我一些文件?

4

2 回答 2

3

您可能会争辩说,只要您简单地使用 Backbone 中的*.extend({...})样式类定义,那么您的 Backbone 类模型将是一个标准。面向对象的类模型。

考虑:

//a base class
var ViewBase = Backbone.View.extend({
  //constructor
  initialize: function() {
    //instance field
    this.someProp = "value";
  },

  //overrides a superclass method
  remove: function() {
     this.cleanup();
     //call superclass method
     Backbone.View.prototype.remove.apply(this, arguments);
  },

  //overrideable method
  cleanup: function() { ... },

  //an abstract method that must be implemented. It's not a compile
  //time contract, but will crash in runtime if you don't implement it
  getContext: function() { throw new Error("NotImplemented"); }
});

//derives a new class, doesn't affect the base class implementation
var ListItemView = ViewBase.extend({
  //constructor
  initialize: function() {
    //instance field
    this.someOtherProp = "value";

    //constructor chaining
    ViewBase.prototype.initialize.apply(this, arguments);
  },

  //add new method
  filterUsers: function() { ... },

  //hides a superclass method
  cleanup: function() { ... },

  //implement an abstract method
  getContext: function() { ... }

}, {
  //a static (class) method
  create: function() { ... }
}); 

//instantiates a class
var view = new ListItemView();

//modifies the instance, but does not modify the prototype
//i.e. class definition
view.foo = 'bar';

虽然 Backbone 内部确实使用了原型继承链,但这里没有使用“原型特征”。该extend函数不会修改现有对象的原型,除非您稍后修改超类原型,否则ViewBase.prototype.something = 'foo'超类原型将在应用程序的整个生命周期内保持不变。

当然缺少的是私有/受保护的属性,但是 Backbone 类模型与 Java 或 C# 没有什么不同,所以我不明白为什么标准的 UML 类图无法描述它?

于 2013-01-18T13:18:33.007 回答
0

您不能从字面上为无类语言的代码绘制类图。

您可以做的是绘制原型或对象而不是类。

于 2013-01-18T03:06:06.897 回答