I need to modify the data members of a class, but since there are a lot of use cases, I would like to put the modifier methods in separate classes to not make the main class too large.
Penso che sia una buona idea estrarre la logica di modifica al di fuori della classe che definisce i membri. Sembra che i membri dei dati siano un modello e la logica di modifica è probabilmente logica aziendale. Per favore correggimi se sbaglio.
So I'm thinking of making the data members protected, and using derived classes as interfaces to modify the data members for each different use case. Is this a common solution to my problem? Is this a good way of solving it?
Non ho mai visto qualcosa di simile prima, e per me non sembra un buon design. Ecco i motivi:
is there something better?
Avrei un approccio diverso. Vorrei rendere immutabile la classe del modello:
class Foo {
private final Integer a;
private final String b;
public Foo(Integer a, String b) {
this.a = a;
this.b = b;
}
public Integer getA() { return a; }
public String getB() { return b; }
}
Ora che ho un modello, voglio trasformarlo. Posso definire una trasformazione del modello:
interface FooTransformation {
Foo transform(Foo foo);
}
Ora puoi esprimere tutti i tuoi casi d'uso in termini di FooTransformation
di implementazioni in questo modo:
class UseCase1 implements FooTransformation {
public Foo transform(Foo foo) {
return new Foo(foo.getA() + 5, foo.getB() + "world");
}
}
Questo design ha alcune cose positive:
- Modello immutabile
- Casi d'uso del test dell'unità facile