我有一个包含它的对象和类。
第一个示例显示该对象具有一个名为Action
的特殊函数,并且容器在必要时调用它。关键是Action
是在Object类中构建的。
第二个示例显示对象更简单,它没有Action
,但它在Container类中实现为函数,并应用于某个对象。
这两种方法有什么区别,与它们有关的问题是什么?
public class Object
{
Vector2 position;
//ecc
//Constructor
void Action()
{
//...
}
//ecc.
}
public class Container
{
List<Object> mylist = new List<Object>();
//something
//Constructor
public void Update(GameTime gametime)
{
//something
Object obj = //Random object from list
obj.Action();
}
}
public class Object
{
Vector2 position;
//ecc
//Constructor
//Without action
//ecc.
}
public class Container
{
List<Object> mylist = new List<Object>();
//something
//Constructor
public void Action(Object obj)
{
//Do the same thing as done above to obj
}
public void Update(GameTime gametime)
{
//something
Object obj = //Random object from list
Action(obj);
}
}
答案 0 :(得分:1)
不同之处在于您可能lowering cohesion并且违反了Information Expert GRASP原则。其中说方法应该在对象中,包含方法使用的大多数数据。在您的情况下,很明显该方法仅适用于Object
的字段。这导致较低的内聚力。此外,它在集合和对象之间创建紧密耦合,例如,这使得Object
的子类化变得很难,并使Action
做更多的事情。
另一方面,与您正在使用的XNA标记相关,第二个选项可能是优化的开始。如果您使Object
成为struct
并使用ref
修饰符,则可以保存一些CPU的滴答以处理此对象。如果你有大量的这些对象,这可能会派上用场。像几十万。像粒子系统一样。