2013-05-11 90 views
0

如果这个地方不是合适的地方,请指出我在哪里可以讨论/解决我的疑问,然后再解决问题。什么是更实用,两个属性或一个对象与上述属性?

这是我在脑海中想到的一点点东西。在Java中,也许其他OOP语言,这将是更好的,有...

class Entity { 
    [final] int xPos; 
    [final] int yPos; 

    // ... 
} 

或者说...

class Entity { 
    Position p; 

    // ... 
} 

class Position { 
    [final] int x; 
    [final] int y; 
} 

哪些优点和这样做的利弊?对我来说,第二种方法似乎更实际一些,特别是当你需要输入两个属性作为方法参数或返回值时,但我也在考虑这是否会产生太多不必要的过程(为次要事情创建新对象) ...

回答

1

也没有。最好的设计是以下几点:

class Position { 
    final int x; 
    final int y; 
} 

interface Positionable { 
    Position getPosition(); 
} 

class Entity implements Positionable { 
    private Position p; 
    public Position getPosition() { 
     return position; 
    } 
} 

推理:

  • 允许Position演变 - 也许你想添加一个z协调
  • 允许Position为不可变的
  • 允许Position到被传递而没有包含在较重物体中的行李
  • 允许你可以自由添加方法Position,如float distanceFrom (Position p)
  • 允许Position活得比对象它描述
  • 可以轻松地给予其他类别Position
  • 解耦尽可能种种顾虑

请注意,Point是可变的,所以使用它或扩展它是不好的,因为不变性对于这样的类似乎是明智的选择(它被认为是一个错误,因为Point是可变的 - 对于java中的其他“错误”,se e this answer

+0

这对于存储一对整数来说似乎有点复杂。如果Position是独立的,并且有很大的自身发展机会,并且将被用于不同目的,那么我只能走这条路。但是如果你只需要获得实体的X位置或实体的Y位置,你是否真的需要一个接口和2个额外的类? – Brandon 2013-05-11 22:27:36

+0

@Brandon我最近刚刚做了一次地理联赛(对于lat/long有两次双打),它的表现非常好。我会再做一次。 – Bohemian 2013-05-11 23:51:54

2

或者您可以不写一个自定义类并使用Point。真的,这取决于你。如果您需要执行涉及坐标的计算,或者需要传递对象的坐标,那么最好将它们包装在一个对象中以使代码更简单。如果他们是恒定的,并且永远不会改变(你永远不会知道),那么你可以将它们保持为int的值。

+0

我正在考虑在画布上绘图,因此'Entity'将由两个'int'或'float'数字,坐标'x'和'y'表示。 考虑到这一点,我认为他们的'位置'会改变,但'位置'本身的值(即'p'会改变,'x'和'y'不会改变)。另外,如果'Position'的两个属性都是final的,那么JVM是否足够智能以便为同一个引用分配两个不同的'New Position(x,y)'? – Alxe 2013-05-11 15:20:06

2

如果它只表示具有独立目的的东西,那么您真的只需要一个单独的类定义 - 将来可能需要其他地方或包含独立功能(责任分工)。正如克里斯提到你的例子直接与Point类相关,所以后者更合适。

+0

为了保持对两组坐标的可访问性,你需要两个引用,引用是一个奇点,所以不能保存两个内存位置,它需要以这种或那种方式进行包装。实体类中的2个引用对于initialLocation和1个对于latestLocation而言,将第二个引用留空,直到它发生更改,并将其使用的任何要求放入一个函数中,该函数检查第二个参数中是否存在实际引用,如果返回null – 2013-05-11 15:32:24

+0

不要忘记,如果您需要添加自定义功能,您可以随时扩展Point类 – 2013-05-11 15:39:58

相关问题