Common Lisp 中的方法有命名约定吗?

lov*_*ato 3 generics naming common-lisp

我发现用 Common Lisp 进行面向对象编程很痛苦。主要问题是方法的命名。请参见下面的代码。

\n
(defclass foo () ())\n\n(defmethod action ((object foo))\n  (write-line "hello"))\n\n\n(defclass bar () ())\n\n(defmethod action ((object bar) boo)\n  t)\n\n\n(print\n (action (make-instance \'foo)))\n\n(print\n (action (make-instance \'bar) 1))\n\n
Run Code Online (Sandbox Code Playgroud)\n

这两种action方法并不是同一通用函数的不同实现。它们偶然具有相同的名称。\n但是 Common Lisp 要求所有具有相同名称的方法具有相同数量的参数。

\n

为了避免名称冲突,我通常在方法名称前加上类名称前缀,例如foo-actionbar-action。但这会导致实际程序中的代码非常冗长,例如(lengthy-class-name-do-something some-variable)

\n

其他面向对象的编程语言,如 C++ 和 Java\xef\xbc\x8c 则不存在此类问题。你可以这样写,some_variable.do_something()其中没有名称冲突。

\n

所以我想知道是否有更好的解决方案来解决上述问题?

\n

Vat*_*ine 7

关键区别确实在于方法是泛型函数上的方法。它们不是类上的方法。

这听起来可能像是为了言辞而言辞。但它应该会极大地影响您的命名选择。对于通用函数来说,“Action”是一个相当平淡的名称。当foo行动时,它实际上做了什么?当bar行动时,它实际上做了什么?

如果action确实是最好的名称,那么有 afoo:action和 a是否bar:action有意义(即,包action中的一个foobar包中的一个)?他们是不同的GF。当然,缺点是它不再像调用那么容易action

这暗示了“你不需要方法,你可以只使用函数”,因为你不需要方法来处理 CL 中的类。

  • 这是绝对正确的。如果两个函数执行不同的操作并采用不同的参数,则它们应该具有不同的名称 - 通常在包系统的帮助下。 (3认同)