程序化对象总是以语义(语言)意义对象吗?

时间:2013-04-26 21:24:01

标签: oop

我不是一个完全没有经验的程序员,但是当我为一个方法找到一个正确的名字时,我的头脑变得非常混乱。我正在编写游戏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)
        """

稍后在我的代码中,我从用户(镜头)读取输入坐标并调用这样的命中方法:

# 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在我的示例中)。或者两种方法都可行吗?如果是这样,将它们混合在我的代码中是否可以?

(我只希望这个问题有道理。)

2 个答案:

答案 0 :(得分:3)

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

如果你在谈论object的文学定义,作为一种指责,the subject verbed the object而不是否,编程对象就不一定是那种对象。它也可以是一个主题。

答案 1 :(得分:2)

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

当您向对象发送消息时,您告诉对象执行某些操作。举个例子,(即游戏引擎)想要告诉board对象导弹已被射击。然后,董事会将做正确的事情并将消息传播到其他对象。

所以,我同意你的观点,hit不是该方法的正确名称。你告诉董事会对已被解雇的导弹采取行动,所以我会选择handleMissileFired,(missileFired,如果你想缩短,但我倾向于喜欢描述性的名字。) / p>

正如@SamIAM已经提到的那样,subjectobject这两个词在这里令人困惑,因为我们不是在讨论自然语言。我认为类比将是接收消息的对象始终是主题,因为这是做某事的事情。传入的任何参数都是对象,因为他们已经完成了任务。