这是一个关于OOP概念的问题。
假设我正在创建一个游戏,并且有一些对象:
- 字段 - 表示 map 上的某个字段。
- 用户 - 代表玩家。
- 元素 - 代表用户可以拥有的元素(例如铲子)
现在我知道玩家可以使用铲子挖地。这个 Action 将是这些类之一的方法。是否有一些规则来确定哪些类应该具有此方法。
此操作最明显的执行者是玩家(用户),因此用户类可以具有类似 digField(Field field) 的方法。但实际上字段本身受此操作影响最大,因此可能应该是 Field 类方法,例如 dig(User Performer) 或 dig(Item toolUsed)。或者,也许 Item 本身应该有一个像 Tool 这样的子类,并具有像 digField(Field field) 这样的方法。
有很多方法可以解决这个问题,我只是想知道是否有某种简单的最佳实践。
最佳答案
就像其他答案中所说,这取决于其他正在发生的事情(或将来可能发生的事情)。
例如,对于挖掘,可以有一些选项:
- user.digField(field, tool):当您的用户也需要花费时间,或者他可能感到疲倦时,这种方式会很有帮助,即如果您想关注用户,请使用这种方式。
- field.dig(user, tool):当需要关注字段本身时(例如设置字段的状态),这种方式会很有帮助。
- tool.dig(user, field):这种方式可以用来改变,例如工具的状态或所需的维护。
但是,在大多数情况下,需要设置多个状态/更改。所以也许最好创建一个单独的 Action 类,例如:
public class Action
{
public void DigField(User user, Location location, Tool tool)
{
user.Status = Digging;
user.Energy -= 50;
location.Status = Digging;
tool.Status = Digging;
tool.Usage++;
}
}
正如您所看到的,随着操作变得更加复杂,此功能可能会增长。那么在适当的类中调用单独的函数(例如混合)的好方法是什么:
public class Action
{
public void DigField(User user, Location location, Tool tool)
{
user.DigField();
location.Dig();
tool.Dig();
}
}
public class User
{
public void DigField()
{
Status = Digging;
Energy -= 50;
}
}
public class Field
{
public void Dig()
{
Status = Digging;
}
}
public class Tool
{
public void Dig()
{
Status = Digging;
Usage++;
}
}
这样做的好处是可以将功能保留在其所属的位置。
没有什么可以阻止您传递参数,例如如果用户的能量消耗取决于字段的类型,请使用:
public class User
{
public void DigField(Field field)
{
Status = Digging;
Energy -= field.Type == Clay ? 30 : 20;
}
}
关于oop - 如何确定哪个类应该有指定的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38529280/