【问题标题】:AS3: Nested functions + self reference VS constructor-level functions and variablesAS3:嵌套函数 + 自引用 VS 构造函数级函数和变量
【发布时间】:2014-11-06 08:50:58
【问题描述】:

我有两种方式来组织我的课程,我想知道哪种方式更正确。

选项#1 是在构造函数中声明我的所有变量和函数以将它们保持在本地,但问题是我的嵌套函数认为this 意味着[Object Global] 而不是[Object MyObject]。所以在构造函数中,我必须创建对对象var thisObject:MyObject = this; 的引用,并在我的嵌套函数中使用thisObject 而不是this

选项 #2 是在构造函数之外声明我的所有变量和函数,并且与构造函数处于同一级别。这意味着我的变量对类来说是全局的,我的印象是你应该尽可能地保持你的变量是本地的。此外,我的构造函数接受参数,因此我必须为每个参数创建一个重复的全局版本,以供我的全局函数使用。

哪种方式被认为是最佳实践?

选项#1

public class MyObject extends sprite {

    public function MyObject(myInt:int) {
        var thisObject:MyObject = this;
        addEventListener(MouseEvent.CLICK,nesetedCallbackFunction);
        function nestedCallbackFunction(evt:MouseEvent):void {
            trace(this); //[Object Global]
            trace(thisObject); //[Object MyObject]
            thisObject.x += myInt;
        }
    }
}

选项#2

public class MyObject extends sprite {

    var myIntProperty:int;

    public function MyObject(myInt:int) {
        myIntProperty = myInt;
        addEventListener(MouseEvent.CLICK,globalCallbackFunction);
    }
    public function globalCallbackFunction(evt:MouseEvent):void {
        this.x += myIntProperty;
    }
}

【问题讨论】:

  • 匿名函数在 AS3 中是不好的形式,不应使用。保持变量和函数私有有什么问题?这样只有对象本身才能访问这些函数/变量。并且构造函数(以及函数)支持可选参数。
  • 我觉得第二个比第一个好。
  • 第二个的问题是,如果我有 10 个参数,那么我需要为构造函数之外的函数创建 10 个重复变量才能使用。
  • 第一种方法不是好的做法,被认为是糟糕的代码。此外,如果你想找一份工作,你举个例子,没有人会雇用你。拥有 10 个参数也是不好的做法,应保留用于特殊和合理的需求。仅应使用构造函数直接需要的参数,然后应使用公共成员变量或 getter/setter 设置其他变量。
  • 完全正确。或者使用带有自定义数据的初始化对象之类的东西,并且只根据需要设置必要的变量。类似于 greensock 补间引擎定义应该实际补间的变量的方式。

标签: actionscript-3 optimization global-variables


【解决方案1】:

选项 2 更好,但请阅读组合和封装。

在选项 2 中,您不需要在构造函数中将对象的所有属性作为参数传递。只需将您的变量更改为公开:

public var myIntProperty:int;

然后,当您创建一个对象时,您可以在必要时更新它的属性:

var myObject:MyObject = new MyObject();
myObject.myIntProperty = 10;

更好的方法是封装属性,以便您可以更好地控制它可以设置的内容。例如,如果你知道你的 int 应该只在 0-10 范围内,你可以这样做:

public class MyObject extends sprite {

    public function set myIntProperty(value:int):void {
        if(value >= 0 && value <= 10)
            _myIntProperty = value;
    }
    public function get myIntProperty():int {
        return _myIntProperty;
    }
    private var _myIntProperty:int;
}

你的使用方式完全一样:

var myObject:MyObject = new MyObject();
myObject.myIntProperty = 10;

如果您确实有那么多参数需要直接发送到构造函数,那么最好的办法是简单地传递具有多个属性的单个对象。然后您的构造函数可以读取每个属性并决定如何使用它们:

public class MyObject extends sprite {

    private var _myIntProperty:int;

    public function MyObject(params:Object)
    {
        if(params.intProperty >= 0 && params.intProperty <= 10)
            _myIntProperty = params.intProperty;
    }
}

【讨论】:

  • 我会在范围示例中补充一点,如果值小于 0 或大于 10,最好抛出错误,因此任何尝试将 myIntProperty 设置为范围知道他们不应该。否则他们可能会引入错误,然后花费大量时间进行调试。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多