Let's say there are two classes related to each other via some relations. For example, a Student
maintains a list of the Class
es he takes, and each Class
has a list of Student
s taking it. Then I am afraid of letting the Student
directly being able to modify its set of Class
es, because each modification would have to be followed by a similar modification of a Class
's list of Student
s, and vice versa.
One solution is to have a class whose sole purpose is to keep track of Class
-Student
relations, say Registrar
. But then if some method in Student
requires knowledge of its Class
list, the Student
needs to be passed the Registrar
. This seems bad. It seems Student
shouldn't have access to the Registrar
, where it can also access other Student
s. I can think of a solution, creating a class that acts as a mediator between Student
and Registrar
, showing the Student
only what it needs to know, but this seems possibly like overkill. Another solution is to remove from Student
any method that needs to access its classes and put it instead in Registrar
or some other class that has access to Registrar
.
The reason I'm asking is that I'm working on a chess game in Java. I'm thinking about the Piece-Cell relations and the Piece-Player relations. If in the above example it wasn't OK for a Student
to have access to the Registrar
, is it OK here for a Piece
to have access to the Board
, since a Piece
needs to look around anyway to decide if a move is valid?
What's the standard practice in such cases?
If relations can be changed - classes should be decoupled as much as possible, so along with each class create an interface, do not introduce tied relations between classes.
High level of separation you can achieve using intermediate services/helpers which encapsulates logic of communication between classes, so in this case you should not inject one class to an other even both are abstracted by interfaces, basically Student
does not know anything about Class
, and Class
does not know anything about Student
. I'm not sure whether such complexity is makes sense in your case but anyway you can achieve it.
Here is you may find a useful design pattern Mediator which can encapsulate interaction logic between two decoupled entities, take a look at it.
With the mediator pattern, communication between objects is encapsulated with a mediator object. Objects no longer communicate directly with each other, but instead communicate through the mediator. This reduces the dependencies between communicating objects, thereby lowering the coupling.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With