Per farla breve, ho ereditato un codice Java fatto di metodi come questo:
@Override
public Action decide() {
if (equalz(in.a, "LOC")) {//10
if(( //20
equalz(tmp.b, "BA")
&& notEquals(in.c,"U")
&& equalz(in.d,"Y")
)||(
equalz(tmp.b, "HV")
&& notEquals(in.c,"U")
&& equalz(in.d,"Y")
&& varEqualsOneOf(in.e,"FLG","FLR","RRG"))
) {
if(equalz(tmp.b, "BA")) {//30
if(varEqualsOneOf(in.e,"RRG","NL")//40
&& lessThan(in.f,in.g)) {
return Action.AC015;
} else {
if(varEqualsOneOf(in.e,"FLG","FLR")) {//50
return Action.AC015;
} else {
return Action.AC000;
}
}
} else {
if (equalz(in.e,"RRG")) {//60
return Action.AC014;
} else {
return Action.AC010;
}
}
} else {
if(equalsOrMissing(in.c,"U")
&& varEqualsOneOf(in.e,"FLG","FLR")) {//70
return Action.AC011;
} else {
return Action.AC000;
}
}
} else {
if(varEqualsOneOf(in.a,"MNC","BAN","LCI","CTV","LEA","INS")) {//80
if (//90
equalz(in.h,"A")
|| equalz(in.i,"Y")
) {
return Action.AC000;
} else {
if(notEquals(in.h,"U")) {//100
if(greaterThan(in.j,in.k)) {//110
return Action.AC000;
} else {
if(varEqualsOneOf(in.e,"FLG","FLR")) {//120
if(notEquals(in.l,"U")) {//130
return Action.AC004;
} else {
if(oneOfVarsEqual(in.m,in.n,"Y")) {//140
return Action.AC012;
} else {
return Action.AC002;
}
}
} else {
if(//150
(
equalz(in.e,"RRG")
&& varEqualsOneOf(in.a,"MNC","BAN","LCI","CTV","LEA")
)
||
(
varEqualsOneOf(in.e,"RRG","NL")
&& equalz(in.a,"INS")
)
) {
if (notEquals(in.l,"U")) {//160
if (notEquals(in.o,"U")) {//170
return Action.AC005;
} else {
return Action.AC018;
}
} else {
bp(false);
if (equalz(in.n,"Y")) {//180
return Action.AC012;
} else {
return Action.AC002;
}
}
} else {
if (equalz(in.p,in.q)) {//190
if (notEquals(in.o,"U")) {//200
return Action.AC006;
} else {
return Action.AC008;
}
} else {
return Action.AC000;
}
}
}
}
} else {
bp(false);
if (notEquals(in.l,"U")//210
&& varEqualsOneOf(in.e,"FLG","FLR")) {
return Action.AC004;
} else {
return Action.AC000;
}
}
}
} else {
return Action.AC000;
}
}
}
dove viene controllata una serie di condizioni per restituire l'azione corretta da eseguire. Non trovo questa soluzione molto elegante e inoltre ho bisogno di un modo per indicare rapidamente il percorso che ha portato a un determinato output (collegandolo al DB).
Sto pensando a un modo per ridefinire il codice e rappresentare l'albero delle condizioni in modo compatto, in modo che possa essere un po 'più facile da leggere, mantenere e registrare.
Ho pensato a una matrice bidimensionale con una riga per ogni condizione composta da 4 elementi
- l'ID condizione
- id condizione (o valore di ritorno) se la condizione corrente è vera
- condizione id (o valore di ritorno) se la condizione corrente è falsa
- la condizione stessa
quindi, alla fine avrei questa matrice
Object[][]matrix=
{
{10,20,70,
equalz(in.a, "LOC")},
{20,30,80,
(equalz(tmp.b, "BA")
&& notEquals(in.c,"U")
&& equalz(in.d,"Y")
)||(
equalz(tmp.b, "HV")
&& notEquals(in.c,"U")
&& equalz(in.d,"Y")
&& varEqualsOneOf(in.e,"FLG","FLR","RRG"))},
{30,40,70,
equalz(tmp.b, "BA")},
{40,Action.AC015,50,
varEqualsOneOf(in.e,"RRG","NL")
&& lessThan(in.f,in.g)},
{50,Action.AC015,Action.AC000,
varEqualsOneOf(in.e,"FLG","FLR")},
{60,Action.AC014,Action.AC010,
equalz(in.e,"RRG")},
{70,Action.AC011,Action.AC000,
equalsOrMissing(in.c,"U")
&& varEqualsOneOf(in.e,"FLG","FLR")},
{80,90,Action.AC000,
varEqualsOneOf(in.a,"MNC","BAN","LCI","CTV","LEA","INS")},
{90,Action.AC000,100,
equalz(in.h,"A")|| equalz(in.i,"Y")},
{100,110,210,
notEquals(in.h,"U")},
{110,Action.AC000,120,
greaterThan(in.j,in.k)},
{120,130,150,
varEqualsOneOf(in.e,"FLG","FLR")},
{130,Action.AC004,140,
notEquals(in.l,"U")},
{140,Action.AC012,Action.AC002,
oneOfVarsEqual(in.m,in.n,"Y")},
{150,160,190,
(equalz(in.e,"RRG")
&& varEqualsOneOf(in.a,"MNC","BAN","LCI","CTV","LEA")
)||(
varEqualsOneOf(in.e,"RRG","NL")
&& equalz(in.a,"INS"))},
{160,170,180,
notEquals(in.l,"U")},
{170,Action.AC005,Action.AC018,
notEquals(in.o,"U")},
{180,Action.AC012,Action.AC002,
equalz(in.n,"Y")},
{190,200,Action.AC000,
equalz(in.p,in.q)},
{200,Action.AC006,Action.AC008,
notEquals(in.o,"U")},
{210,Action.AC004,Action.AC000,
notEquals(in.l,"U")
&& varEqualsOneOf(in.e,"FLG","FLR")}
}
;
guidato da un metodo che salta tra le condizioni e registra l'intera esecuzione che rappresenta il percorso con l'ID delle condizioni.
All'inizio pensavo che questa potesse essere una buona idea, ma ora non sono sicuro che sia scritta.
Come gestiresti questo problema? La mia soluzione è totalmente inutile? C'è qualche altro modo migliore per raggiungere l'obiettivo?