【问题标题】:ActionScript - Setter Parameters Within Constructor?ActionScript - 构造函数中的设置器参数?
【发布时间】:2010-11-11 08:24:23
【问题描述】:

我设计了一个自定义类(或组件?),它扩展了 Sprite,它的构造函数有 15 个参数。只有第一个参数是必需的,而其余 14 个已分配默认值。都是必须的。

除第一个必需参数外,每个参数实际上都是属性设置器。该类还包含公共 setter 和 getter 函数,允许在构建后在运行时更改属性。

我已经在我的桌面(27 英寸屏幕)上编写了课程,并意识到当我在 13 英寸笔记本电脑上使用课程时可能会遇到问题 - 代码提示一直延伸到屏幕边缘之外太长了。

当 setter 函数可用时,在构造函数中包含可选的 setter 作为参数是否正常/最佳实践,还是应该始终将 setter 与构造函数分开?

【问题讨论】:

  • 通常或平均需要多少这些参数?如果在构建对象时它不是您需要的信息,您应该单独调用那些您真正需要的属性。
  • 好吧,我实际上只需要第一个。其余参数基本上是对对象进行风格化。当我第一次开始上课时,虽然允许该课程的用户使用所有不同的样式设置进行构建是个好主意,但现在我认为这不再理想,因为签名太长了。
  • 这是一个很好的问题,我发现拥有多级继承可以增加提供给构造函数的参数。我讨厌它,但对我来说没有明显的解决方案。我希望有人可能列出了一种设计模式来提供帮助。

标签: actionscript-3 parameters constructor getter-setter


【解决方案1】:

在我看来,这归结为类实例化部分代码的易用性。 如果您有 14 个参数全部设置或全部跳过,那么这可能是最好的解决方案。

var defaultRectangle:Rectangle = new Rectangle(); //square of 1 x 1)    
var customRectangle:Rectangle = new Rectangle(0,0,  2,0  2,2,  0,2);

但是如果这14个参数中的一些是可选的,它变得有点难以阅读,那么我认为要么使用单独的getter/setter更具可读性,要么使用paramater对象(模仿命名参数)

//which parameter means what?
var girlfriend:Girl = new Girl("Blue", 0, 0, "", "", 1.8, 0, "", 140); 

//named parameters 
var girlfriend:Girl = new Girl({eyeColor: "Blue", height:1.8, iq:140});

//setters
var girlfriend:Girl = new Girl();
girlfriend.eyeColor = "Blue";
girlfriend.height = 1.8;
girlfriend.iq = 140;

我个人尝试在使用“视图”时尽可能多地使用模型 因此,如果您的对象是 Sprite,因此是 View。也许最好的方法是:

var friend:Person = new Person({name: "Ford Prefect"});
var profileView:ProfileView = new ProfileView(friend);
addChild(profileView);

【讨论】:

  • 为构造函数提供可选参数的可选对象是一个聪明的主意。谢谢!
  • 请注意,名字很容易拼错。它仍然可以无错误地编译,只是不能像您期望的那样运行。在设置值之前,您必须进行 NULL 检查,这是额外的工作。这就是参数的用途。 “哪个参数意味着什么?”查看方法签名,大多数编辑器会在您键入时向您显示。通过接受匿名对象,用户不会知道该方法需要什么参数,编辑器不会向您显示。在我看来,您正试图通过捏造代码来解决编辑器的问题。向制作您的编辑器的公司提交错误报告。
  • 另外,如果你 SWC 这个类,那么方法签名将是任何人都必须使用的,它不会告诉他们任何关于方法期望的内容。几乎使参数无用。除非你记录它,但是谁想要查找文档来找出像接受的参数列表这样基本的东西?特别是因为我们已经有了一种方法来指定语言中内置的内容。 @Les 就未标注参数向 Adob​​e 提出申诉。
  • @Joony - 所有优点。我正在使用 Flash CS5。我实际上只是试图为参数对象构建一个参数错误检查,并意识到这是不可能的。可能可以用 Dictionary 做一些事情,但这会增加不必要的开销,并且编写代码的时间与在构造后设置参数一样长。能够通过...休息的二传手会很棒,但不可能。也许最好的选择是在实例化期间不接受属性。它将作为文档化的 .swc 分发,但我认为更多的开发人员拥有笔记本电脑而不是 27 英寸台式机。
  • @Joony 我并不反对你,但我认为也有一些优势。如果您稍后查看您的代码,或者其他人正在查看您的代码,您将看不到“方法签名”。此外,检查空值是额外的工作,但您只需执行一次即可在每次使用该类时节省您的时间。重载构造函数可能是最干净的解决方案,但我忘记了 AS3 是否支持这个.. ?
猜你喜欢
  • 2010-10-21
  • 2010-12-29
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多