在编写Perl模块时,我是否必须在所有方法中专门检查对象实例?

Geo*_*Geo 4 oop perl

我正在编写一个有多种方法的模块.让我们考虑一下:

package MyPackage;
sub new {
 ...
}

sub do_your_job {
 ...
}
1;
Run Code Online (Sandbox Code Playgroud)

什么是阻止有人在叫do_your_job一样MyPackage->do_your_job,而不是$obj->do_your_job?我是否需要检查每个接收引用的方法作为第一个参数?

inn*_*naM 9

不可以.如果您的模块仅包含最少的文档,那么应该清楚这do_your_job是一个需要在对象上调用的方法.如果有人想以其他方式打电话,那就是他的错.

当然,您可以检查方法的第一个参数是否是受祝福的对象.但这至少有两个缺点:你会失去一点性能,并且你的方法会混乱,因为代码实际上没有做任何方法名称所承诺的事情.

  • @Geo:不一定是对的.在某些时候,你必须信任用户; 如果你有两个方法bar和baz,你就不会神奇地告诉我对bar的调用就是那个,而不是打电话给baz他们忘记了确切的方法名称. (4认同)

yst*_*sth 5

不,你不需要检查; 你可以记录它是一个对象方法并信任调用者来使用它.但如果你觉得不够,你当然可以检查.

同样的事情适用于方法调用隐式对象/类参数以外的参数.您可能有一个参数,它应该是一个数组引用,或一个小于10的正整数,或某个给定类型的对象,或者其他任何东西.一条路径是假设呼叫者遵循文档; 另一种是不相信.


EmF*_*mFi 5

理论上简短的答案是"没什么"和"这不是一个坏主意".

然而,在实践中,文档是解决这些问题的原因.Perl社区中有一个共同的礼貌,指示开发人员只以他们记录的方式使用模块.

Perl Modules无法保证内部组件永远不会改变.所以隐含的协议是开发人员不会深入研究模块/类的内部,除非他们正在实现该模块/类.