Devo affrontare la situazione in cui i metodi privati sono chiamati attraverso la riflessione?

12

Quando creo una libreria, devo assicurarmi che i metodi privati debbano funzionare come previsto quando non vengono chiamati da altri metodi della stessa classe, ma da un'altra libreria tramite la reflection ?

Ad esempio, se un metodo privato private DoSomething(int number) si aspetta che:

  • number è un numero intero positivo diverso da zero e:
  • una variabile privata string abc non è nullo e non una stringa vuota,

e completamente, brutto fallisce se queste due condizioni non corrispondono, devo gestire quei guasti anche se so che tutti i metodi nella classe saranno sempre¹ assegnare un valore non vuoto a abc prima di chiamare DoSomething e passare un intero positivo diverso da zero a questo metodo?

In altre parole, è il codice che non è protetto da chiamate non sicure tramite la riflessione può essere considerato come un codice di bassa qualità , oppure appartiene al chiamante che usa la riflessione per garantire che la chiamata non rompere qualcosa?

Nota: la mia domanda riguarda solo un set standard di librerie. Questo non copre il codice che deve essere altamente sicuro (cioè quando qualcuno può essere interessato dall'utilizzo del reflection per farlo comportare inaspettatamente o crash).

¹ Perché la classe è correttamente documentata, perché ci sono abbastanza test unitari per essere sicuri che qualsiasi altro sviluppatore non romperà questo metodo, ecc.

    
posta Arseni Mourzenko 16.08.2011 - 03:55
fonte

3 risposte

16

Marcando il tuo metodo in privato hai stabilito le tue intenzioni e un contratto. Utilizzando la riflessione, un codice cliente può scegliere di rompere con questo contratto e di conseguenza dovrà sopportarne le conseguenze. La stessa cosa accade con i protocolli, perché le cose funzionino le regole devono essere seguite o le cose brutte succedono.

Lo stesso problema può verificarsi con altri linguaggi come C ++ in cui ho visto cose come

#define private public

In sintesi: NON è necessario occuparsi di queste situazioni, il chiamante dovrebbe conoscere meglio.

    
risposta data 16.08.2011 - 04:17
fonte
5

Se qualcuno usa la riflessione per chiamare i tuoi metodi privati, è un segno che qualcuno sta facendo qualcosa di sbagliato. O sta usando il codice in modi per cui non è stato progettato, o stai nascondendo troppo del funzionamento interno e stordendo l'API.

Ma sembra che tu non sia ancora a quel punto, e stai solo cercando di essere un pre-emptive. Quindi la mia opinione è: non ti preoccupare. Un metodo privato dovrebbe essere considerato off-limits; se qualcuno viola deliberatamente quei limiti, allora è il loro problema se le cose esplodono.

    
risposta data 16.08.2011 - 06:11
fonte
0

Bene, è sempre una buona idea convalidare variabili non locali prima di usarle, ma a parte questo non mi preoccuperei di ciò. Come hanno detto gli altri, hai stabilito le tue intenzioni rendendo il metodo privato in primo luogo; chiunque lo chiami al di fuori della tua classe ha zero garanzie. Quando lavoro in Java, non metto nemmeno commenti javadoc sui miei metodi privati, perché non voglio che altri sviluppatori sappiano che sono lì.

    
risposta data 16.08.2011 - 14:10
fonte

Leggi altre domande sui tag