Certo che c'è. Ma tu certamente non vuoi farlo; sarei un disastro orribile e non gestibile.
Il tuo modello di dominio mi sembra soddisfacente; anche la codifica hard-code nella proprietà ibrida mi sembra perfetta. Sarebbe qualcosa di simile (pseudo-java, non so python, mi dispiace):
// in Car
public boolean isBroken() {
return this.components.stream()
.flatMap(Component::getErrors)
.anyMatch(Error::isRelevant);
}
// in Error
public boolean isRelevant() {
return !this.hasTag(ErrorTags.IRRELEVANT);
}
EDIT: Dopo averci pensato per un po 'mi è venuto in mente qualcos'altro:
La domanda è in realtà se l'errore è pertinente al Componente o alla Car . Se l'errore è irrilevante per componente e auto, sarebbe meglio includere tale logica nel componente:
// in Component
public boolean isBroken() {
return this.errors.stream().anyMatch(Error::isRelevantForComponent);
}
Se l'errore è rilevante per il componente ma non per l'auto, quella logica dovrebbe essere nella classe dell'auto.
Se decidi effettivamente di entrare in quel livello di dettaglio, il tag irrelevant
dovrebbe avere un altro attributo context
che descrive in quale contesto l'errore è rilevante. È quindi possibile impostare tale proprietà su "CAR" o su "COMPONENT" descrivendo che l'errore è irrilevante o rilevante per l'auto, rispettivamente.