静态方法的论证
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/the-case-for-static-methods
11842 对此文章评分:
暂无评分
静态方法的论证
匿名 2014年7月24日,星期四
IDL 8.3 引入的一个新特性是能够在 IDL 对象上创建静态方法。对于面向对象编程领域的新手来说,静态方法本质上是一个普通的 IDL 函数,只是该函数附加在了一个对象上。让我们看一个简单的对象定义:
function STATICEXAMPLE::doit, x
compile_opt idl2
return, x/2
end
pro STATICEXAMPLE__define
compile_opt idl2
self = { staticexample, $
inherits IDL_OBJECT, $
_count: 0b $ ; “未使用”的成员变量
}
end
在这个例子中,我们的对象有一个函数 DOIT,它实际上并不依赖于我们对象定义的任何成员变量或其他函数。传统上,要调用这个方法,你需要执行以下操作:
obj = StaticExample()
obj.doit(2)
然而,由于 DOIT 实际上并不依赖于对象的状态或使用对象上定义的方法,因此将 DOIT 标记为静态函数以赋予其更大的实用性是合理的。我们可以通过向 DOIT 的 compile_opt 添加 static 标志来实现这一点:
function STATICEXAMPLE::doit, x
compile_opt idl2, static
通过将该方法标记为静态,我现在可以通过一次调用引用该方法:
StaticExample.doit(2)
或者,如果你已经有一个 STATICEXAMPLE 对象:
obj.doit(2)
注意: 最好避免以这种方式调用静态方法。如果你的代码不需要反复检查每个方法是否是静态的,那么阅读起来会容易得多。
“好吧,但是将一个函数标记为静态能给我带来什么好处呢?”
-
将功能分组到单个对象中的能力。 例如,假设你有两组函数来读取和处理不同的文件格式:
ff1_Read()、ff1_Process()、ff2_Read()、ff2_Process()。我可以使用静态方法将功能分组到有意义的对象中。在这种情况下,我会选择按功能对我的方法进行分组,创建 READ 和 PROCESS 对象。所以,我的调用现在会变成:Read.ff1()、Read.ff2()、Process.ff1()、Process.ff2()。这反过来又带来了... -
内容辅助! 通过将你的函数转换为静态方法,你可以使用内容辅助来帮助找到那个函数调用。现在,当在工作台中工作时,我可以在我的 Read 或 Process 对象上按 CTRL+Space,找到所有我可以打开或处理的文件格式。
-
避免命名冲突。 当 IDL 编译一个函数时,它会使用第一个匹配编译函数名称的函数代码。因此,如果你有一个名为
Colortable的函数,而 IDL 发布了一个名为Colortable的新函数,那么根据你的 PATH 顺序,其中一组功能将无法访问(这可能在你身上发生过,我们对此造成的困惑感到抱歉)。然而,通过将你的功能包装在一个静态方法下,命名空间冲突的几率会大大降低,并使我们能够... -
库! 如果你有一个库(或者即使是一堆有用的函数)并且想把它交给你的同事,有了静态方法,你现在就有了一个专门的对象来包含你所有的函数。所以,不必在你的函数前面挂上一个难看的标签(例如
MyAwesomeCode_MyAwesomeFunction()),你可以拥有一个漂亮的对象(例如MyAwesomeCode.MyAwesomeFunction())。此外,这意味着你的对象可以从内容辅助中受益,不必担心命名冲突,方法名称更美观,总体上让你的代码更具可读性。
注意事项:
使用静态方法时需要注意几件事。静态方法不是对象上的普通方法。它们不知道任何其他方法或成员变量。
干杯!