要解决这个问题似乎相当容易,但我无法找到方法。
说我有两个班级
class Grid {
private Square[][] sq;
public Grid(){
// don't like this
seq[0][0] = new Square(this);
// etc.
}
public Collection<Square> getNeighbours( Square sq ){ ... }
public boolean isFull(){ ... }
}
class Square {
private Grid grid;
Set<Worker> set;
public Square(Grid grid){
this.grid = grid;
set.add(new Worker(this));
}
public void dealWithNeighbours(){
for( Square s : grid.getNeighbours()) {....}
}
public boolean isGridFull(){
// now it is officially stupid
return grid.isFull();
}
}
当我向其中添加一个新图层时更糟糕的是:
class Worker extends Thread{
private final Square sq;
public(Square sq){
this.sq = sq;
}
private boolean anyMoreFreeSpace(){
!sq.isGridFull();
}
@Override
public void run(){
if( anyMoreFreeSpace () ) { ... }
...
}
}
现在的问题是每次我需要启动一个新的Square对象时,我也必须提供对它的调用对象的引用。因为广场没有任何有关其周围环境的信息。当我需要关于主要顶级所有者的一些信息时,情况变得更糟。然后我必须像isGridFull()
。
在实际代码中,我有3级这样的依赖项,它已经非常混乱了。我想知道处理这种情况的好方法。这个设计的正确设计是什么?
答案 0 :(得分:1)
我同意@Robin,为什么你不直接告诉他们的邻居?
如果你有理由不告诉他们,那么我希望下一个可能对你有所帮助)
当您希望依赖关系变弱时,您需要引入新的抽象级别,其中包含有关Grid
,Square
,Worker
的所有信息。前三个课程可以互相了解。据我所知,你已经有了这样的抽象层次:一些“主要顶级所有者”。
因此,让Owner
了解所有内容,并使Grid
Square
和Worker
转储。
public class Owner {
//structure that store grid, all related squares and all related workers
private Grid grid;
private Map<Square, Collection<Worker>> squareWorkerMap;
public Grid getGrid() {
return grid;
}
public Collection<Square> getAllSquares() {
return squareWorkerMap.values();
}
public Collection<Worker> getWorkers(Square sq) {
squareWorkerMap.get(sq);
}
public ??? getSquare(Worker worker) {
//implementation depends on if worker can belong to many squares
}
}
public class Grid {
private Owner mainTopOwner;
public Collection<Square> getSquares() {
return mainTopOwner.getAllSquares();
}
public Collection<Worker> getWorkers(Square sq) {
return mainTopOwner.getWorkers(sq);
}
}
public class Square {
private Owner mainTopOwner;
public Collection<Workers> getWorkers() {
return mainTopOwner.getWorkers(this);
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}
public class Worker {
private Owner mainTopOwner;
public Square getSquare() {
return mainTopOwner.getSquare(this)
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}
答案 1 :(得分:0)
以通用的方式回答你的问题:不是不是一个好主意。如果代码开始变得混乱,重新考虑你的设计!
我不是百分百肯定,你想要实现的目标,但正如@Oli Charlesworth statet所说,this
基本上是正确的方式。
重新审视你的问题,那么你可能会得到一个更好的答案。
修改强> 就像快速编辑一样,为什么不告诉他们邻居的广场,可以稍微放松一下呢?