Vorrei provare a fornire una risposta utilizzando una regola per la convalida degli argomenti nei metodi. Al momento di decidere quando gli argomenti dei metodi devono essere convalidati, la regola generale è:
- Convalida solo i parametri dei metodi pubblici nelle classi pubbliche
Le eccezioni a questa regola sono:
(i primi tre vanno se vuoi essere più difensivo sulla validità degli argomenti)
- metodi protetti di classi pubbliche
- metodi pubblici delle classi interne
- metodi protetti delle classi interne
- se il controllo di validità sarebbe costoso o poco pratico e il controllo di validità viene eseguito implicitamente nel processo di calcolo
Applicato al tuo esempio, suggerirei che la responsabilità di ogni convalida dei parametri sia solo in un posto. Lasciami elaborare. Il controllo di integrità dei parametri può essere eseguito sul lato sorgente. Diciamo che ParamA dovrebbe essere un numero positivo. A può facilmente verificare se qualcuno ha inserito 0 o -5 come valore in ParamA. Tuttavia, la convalida semantica di solito può essere eseguita solo sul lato di destinazione, che in questo caso significa D.
Puoi, naturalmente, eseguire tutte le convalide in D, se decidi in seguito che qualcun altro diverso da A o B può usare D. In ogni caso è OK. Vorrei solo consigliare di disaccoppiare la logica di validazione da A, B o D inserendo la logica di validazione in classi separate, che potrebbero essere associate ad A, B o D. In questo modo, puoi facilmente spostare le convalide da A a D, dovresti decidere di farlo.
In entrambi i casi, non vedo un motivo per cui C dovrebbe verificare la validità degli argomenti passati a D. C è chiaramente solo un proxy qui e l'unica cosa che C dovrebbe convalidare sono i dati che riceve da D per poter eseguire qualunque computazione faccia.