Sim*_*Sim 4 oop coding-style common-lisp
考虑这个例子:
有一个名为'first'的类,它在包'a'中定义.
还有一个包'b',它使用模块'a'功能.包'b'的某些功能需要类'first'的对象作为参数.但除此之外,包'a'和'b'之间没有直接的逻辑联系.
现在我想知道编写(defmethod package-b-function ((param first)) #|do stuff..|#)而不是普通函数是否合理,因为函数需要对象并且定义一个方法会为运行时环境和包'b'的其他用户阐明这一点.
我曾经用C++/Java编程,因此我不熟悉在这种情况下使用的OOP约定.
欣赏您的洞察力.
在Common Lisp的方法不太工作方式一样的,你注意语言(请参阅适当 2 章的实践Common Lisp的细节).简而言之,在非常高的层次上,你需要在lisp中考虑OO作为"专门研究类的方法",而不是"类有方法".
也就是说,是的,我认为一个包有一个专门用于其他地方定义的类的方法是完全合理的.指定您期望的输入类型可以明确未来读者的意图(可能有助于优化,也可能没有帮助,但从我的角度来看,这并不是非常重要).如果要为包定义ASDF系统,请确保import使用相应的符号和depends-on相应的包.
就像脚注一样,要注意Common Lisp并不是特别面向对象的语言(例如,如果你决定某个特定的类应该有length,pop或者push方法,或者专注于算术运算,你会碰到一些奇怪的角落) .
Common Lisp 提供普通函数和泛型函数。
作为第一条规则,请使用以下规则:
当您想要从各种可用方法中组装有效方法时(例如使用 Mixins 进行编程时)或者当您想要基于运行时参数选择方法时,请使用泛型函数。
如果您不需要这种高级行为,则只需使用普通函数即可。可以使用其他 CL 功能来记录普通函数需要什么样的参数以及相应的运行时检查:
CHECK-TYPEASSERTDECLARE参数类型