我不是一个完全没有经验的程序员,但是当我为一个方法找到一个正确的名字时,我的头脑变得非常混乱。我正在编写游戏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
在我的示例中)。或者两种方法都可行吗?如果是这样,将它们混合在我的代码中是否可以?
(我只希望这个问题有道理。)
答案 0 :(得分:3)
您可以将对象视为各种名词。
如果你在谈论object
的文学定义,作为一种指责,the subject verbed the object
而不是否,编程对象就不一定是那种对象。它也可以是一个主题。
答案 1 :(得分:2)
有趣的问题。我认为解释这个问题的好方法是考虑Smalltalk(第一个真正的 OO语言)。在Smalltalk中,一切都是一个对象,你可以与对象通信的唯一方法是向它们发送一条消息,该消息是用Java和Python术语调用方法的。
当您向对象发送消息时,您告诉对象执行某些操作。举个例子,你(即游戏引擎)想要告诉board
对象导弹已被射击。然后,董事会将做正确的事情并将消息传播到其他对象。
所以,我同意你的观点,hit
不是该方法的正确名称。你告诉董事会对已被解雇的导弹采取行动,所以我会选择handleMissileFired
,(missileFired
,如果你想缩短,但我倾向于喜欢描述性的名字。) / p>
正如@SamIAM已经提到的那样,subject
和object
这两个词在这里令人困惑,因为我们不是在讨论自然语言。我认为类比将是接收消息的对象始终是主题,因为这是做某事的事情。传入的任何参数都是对象,因为他们已经完成了任务。