oop - 如何确定哪个类应该有指定的方法

标签 oop

这是一个关于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/

相关文章:

asp.net-mvc - 从ASP.Net Webforms反模式毕业

php - 避免使用无效参数实例化对象

python - 在实例化类之前在 Python 类中定义的方法的正确术语是什么?

php - 转换为 PDO

java - 命名对象时是否可以使用变量?

php - 如何在模型结构上表示必填业务字段?

c++ - 给定一个类(class)成员,我如何访问同一类(class)的其他成员?

c# - 我的 OOP 设计是否正确?

c++ - 如何查找类中未定义的虚函数

java - 多态与继承