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\nRun Code Online (Sandbox Code Playgroud)\n这两种action方法并不是同一通用函数的不同实现。它们偶然具有相同的名称。\n但是 Common Lisp 要求所有具有相同名称的方法具有相同数量的参数。
为了避免名称冲突,我通常在方法名称前加上类名称前缀,例如foo-action和bar-action。但这会导致实际程序中的代码非常冗长,例如(lengthy-class-name-do-something some-variable)。
其他面向对象的编程语言,如 C++ 和 Java\xef\xbc\x8c 则不存在此类问题。你可以这样写,some_variable.do_something()其中没有名称冲突。
所以我想知道是否有更好的解决方案来解决上述问题?
\n关键区别确实在于方法是泛型函数上的方法。它们不是类上的方法。
这听起来可能像是为了言辞而言辞。但它应该会极大地影响您的命名选择。对于通用函数来说,“Action”是一个相当平淡的名称。当foo行动时,它实际上做了什么?当bar行动时,它实际上做了什么?
如果action确实是最好的名称,那么有 afoo:action和 a是否bar:action有意义(即,包action中的一个foo,bar包中的一个)?他们是不同的GF。当然,缺点是它不再像调用那么容易action。
这暗示了“你不需要方法,你可以只使用函数”,因为你不需要方法来处理 CL 中的类。
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |