4

我不是一个完全没有经验的程序员,但今天当我为一个方法想一个正确的名字时,我的脑袋变得一团糟。我正在对游戏Battleship进行编程,我开始制作简化版的 Board 类,如下所示:

class Board:

    SHIP_MISS = 0
    SHIP_HIT = 1
    SHIP_DEAD = 2

    def __init__(self):
        self.ships = [
            [(1,1), (1,2)],
            [(5,6), (5,7), (5,8)],
        ]

    def hit(self, target):
        """ 
        Find out if any ship has been hit or has been sunk and 
        return an appropriate value (one of SHIP_MISS, SHIP_HIT, SHIP_DEAD)
        """

稍后在我的代码中,我从用户(一个镜头)读取输入坐标并调用 hit 方法,如下所示:

# testing if Board works
board = Board()
result = board.hit(coords)
print result

现在我真的被卡住了board.hit(coords)。我开始想知道hit该方法是否真的是一个好名字。我当时在想:“板子被击中,它没有击中任何东西。应该调用该方法process_hit以使其服从该命令吗?我是告诉对象该做什么还是我声明对它们做了什么? ?” 不知从何而来,我脑子里乱七八糟。

考虑一下:

 dog.bark()

有什么dog?它是吠叫的主题吗?或吠叫的对象(没有意义,是吗?)。

但这是来自 OOP 的一个经典示例:

 bankAccount.deposit(50)

bankAccount语言意义上有什么?它是存款的对象吗,这是考虑银行账户的常见方式。或者它是一个主题,这意味着它应该向自己存入 50 美元。

我的问题是:我应该将编程对象视为语言(语义)意义上的对象,还是应该将它们视为主题并相应地命名它们的所有方法(process_hit而不是hit在我的示例中)。还是两种方法都可以?如果是这样,可以将它们混合在我的代码中吗?

(我只是希望这个问题有意义。)

4

2 回答 2

3

您可以将您的对象视为各种名词。

如果您谈论的是object作为宾格的文学定义,the subject verbed the object那么编程对象不必是那种对象。它也可以是一个主题。

于 2013-04-26T21:27:53.847 回答
2

有趣的问题。我认为解释这一点的一个好方法是考虑 Smalltalk(第一个真正的OO 语言)。在 Smalltalk 中,一切都是对象,与对象通信的唯一方法是向它们发送消息,这是在 Java 和 Python 术语中调用方法。

当您向对象发送消息时,您是在告诉对象做某事。举个例子,(即游戏引擎)想告诉board对象发射了导弹。然后董事会将做正确的事情并将消息传播给其他对象。

所以,我同意你的看法,这hit不是该方法的正确名称。您是在告诉董事会对已发射的导弹做某事,所以我会选择handleMissileFired, (missileFired如果您想更短,但我更喜欢描述性名称)。

正如@SamIAM 已经提到的那样,这里的术语subjectobject令人困惑的东西,因为我们不是在谈论自然语言。我认为类比是接收消息的对象始终是主题,因为那是做某事的事情。传入的任何参数都是对象,因为它们对它们做了一些事情。

于 2013-04-26T21:42:59.070 回答