自AS3问世以来,我一直在这样工作:
private var loggy:String;
public function getLoggy ():String
{
return loggy;
}
public function setLoggy ( loggy:String ):void
{
// checking to make sure loggy's new value is kosher etc...
this.loggy = loggy;
}
并且避免像这样工作:
private var _loggy:String;
public function get loggy ():String
{
return _loggy;
}
public function set loggy ( loggy:String ):void
{
// checking to make sure loggy's new value is kosher etc...
_loggy = loggy;
}
我已经避免部分使用AS3的隐式getter / setter,以便我可以开始输入“get ..”,内容辅助将为我提供所有getter的列表,同样适用于我的setter。我也不喜欢我的代码中的下划线,这使我摆脱了隐含的路径。
另一个原因是我更喜欢这种感觉:
whateverObject.setLoggy( "loggy's awesome new value!" );
到此:
whateverObject.loggy = "loggy's awesome new value!";
我觉得前者更好地反映了代码中实际发生的事情。 我正在调用函数,而不是直接设置值。
安装Flash Builder和伟大的新插件SourceMate(这有助于获得FDT在FB中出名的一些有用功能)后,我意识到当我使用SourceMate的“生成getter和setter”时会自动启用它使用隐式路由设置我的代码:
private var _loggy:String;
public function get loggy ():String
{
return _loggy;
}
public function set loggy ( loggy:String ):void
{
// do whatever is needed to check to make sure loggy is an acceptable value
_loggy = loggy;
}
我认为这些SourceMate人必须知道他们在做什么,或者他们不会在AS3中编写用于编码的工作流增强插件,所以现在我在质疑我的方式。
所以我的问题是:任何人都可以给我一个很好的理由,为什么我应该放弃我明确的g / s方式,开始使用隐式技术,并为我的私人变量接受那些臭臭的小_underscores?或者以我的方式支持我做事的理由?
答案 0 :(得分:19)
老实说,我认为这很像缩进或支撑风格 - 将您的风格与您正在使用的任何代码库相匹配的重要性/乐于助人的任何“固有”优势都会超越这两种方法。尽管如此,你更愿意在物理引擎中维护哪一个?
// with getters
body.position.y += body.velocity.y * dt;
// without
body.getPosition().setY( body.getPosition().getY() + body.getVelocity.getY() * dt );
getter / setter的另一个优点是,您最初可以始终创建属性简单的公共变量,并在以后根据需要将它们重构为getter / setter,而无需更改外部代码。您不必为每个变量预先构建访问器;你可以等到你决定需要它们。
答案 1 :(得分:2)
我可以想到几个原因。
请记住,如果您所做的只是直接获取/设置,那么通过暴露公共var并绕过带有保持var(_variable)的getter / setter,就不会丢失很多。您可以随时更改为隐式get / set,而无需更改类外部接口。
答案 2 :(得分:0)
我不使用隐式getter,因为如果加强重构和代码可读性。如果分配是公共领域或者是访问方法,通常不容易发现。因此,如果你想跟踪一个错误,你可能会陷入讨厌的狩猎。