我有一个类Player,其中包含很少的其他类的私有字段(我相信它被称为组合)。
public class Player
{
private String name;
private Statistics statistics;
private Experience experience;
private Effort effort;
}
我只会发布其中一个名为Statistics
的内容public final class Statistics
{
Pool pool;
Edge edge;
class Pool
{
private Map<Stats, LimitedInt> map = new HashMap<>();
private int freePoints = 0;
void setAvailable(Stats stat, int value){}
int getAvailable(Stats stat){ return 0; }
void setMax(Stats stat, int value){}
int getMax(Stats stat, int value){ return 0; }
void setFreePoints(int value){}
int getFreePoints(){ return 0; }
void spendFreePoints(Stats stat, int amount){}
}
class Edge
{
private Map<Stats, Integer> map = new HashMap<>();
private int freePoints = 0;
void setMax(Stats stat, int value){}
int getMax(Stats stat, int value){ return 0; }
void setFreePoints(int value){}
int getFreePoints(){ return 0; }
void spendFreePoints(Stats stat, int amount){}
}
}
当然还没有实现,但我想知道什么是更改的正确版本,例如Player's Pool。我可以想象以下场景:
Player与Pool类具有完全相同的方法,类似于
public class Player
{
// something above
void setAvailablePool(Stats stat, int value){ statistics.pool.setAvailable(stat, value); }
}
这个解决方案似乎还可以,但是在Player类中,我会有很多单行方法,只是将订单重定向到组合字段。
这些是我的第一个想法,但我想在使用合成时一般询问如何在课堂上创建界面。
答案 0 :(得分:1)
单行方法不是问题,但是使您的解决方案#1不满意的原因是违反了Law of Demeter(statistics.pool.setXXXX)。拥有statistics.setAvailableInPool()方法(或使用你的想法#2)可能更好。我可以&#39; t为特定的实现提供了更多的帮助,因为你不清楚你的Pool和Edge类应该做什么(或者为什么它们彼此如此相似但是没有实现通用接口)。 / p>
在回答有关创建合成界面的一般问题时,请查看SOLID principles。基本上,您应该考虑从依赖项中需要哪些行为,清楚地命名这些行为,并依赖于接口而不是具体类。这使代码更容易理解,更容易在一个地方更改,而无需在任何地方进行更改。