2010-05-17 13 views
8

normalmente, tutti gli sviluppatori sane stanno cercando di avvalersi di dati di tutti i metodi pubblici (casting a tipi appropriati, la validazione, sanificazione ecc)Protezione ingresso di metodi privati ​​/ protetti?

La mia domanda è: siete nel codice conferma dei parametri anche passato a metodi protetti/privati ? A mio parere non è necessario, se si securize correttamente i parametri di metodi pubblici e restituire valori dall'esterno (altre classi, DB, di input dell'utente, ecc ...).

Ma io sono costantemente di fronte a framework e app (ovvero prestashop per nominarne uno) dove la convalida viene spesso ripetuta nella chiamata al metodo, nel corpo del metodo e ancora una volta per proteggere il valore restituito - che, penso, sta creando overhead e performace è anche un segno di cattivo design.

+0

Non si verificherà un elevato sovraccarico delle prestazioni dalla convalida a meno che non si stiano utilizzando espressioni regolari (che non si dovrebbero essere). – Andy

+0

Ho visto convalide piuttosto negative, ad es. in prestashop menzionato hanno metodo isTableOrIdentifier nel loro ORM, che usa regexp per verificare la validità del nome di tabella/colonna e viene chiamato letteralmente dozzine di volte all'interno di un oggetto (e immagina ora di importare centinaia o migliaia di oggetti) –

+0

Se stai facendo un appropriato livello di test unitario, quindi saltare qualche convalida di alcuni membri privati ​​andrebbe bene. C'è sempre un rischio, ma se il tuo; o un recensore; l'ispezione del codice mostra che i presupposti a valle saranno sempre corretti in base a ciò che stanno facendo i membri pubblici chiamanti, quindi andrà bene. – JoeGeeky

risposta

2

Se si aderisce all'opinione che le API pubbliche debbano implementazioni che si difendono da parametri errati, il criterio non dovrebbe essere la visibilità dei metodi, ma se l'utente dell'API chiamerà direttamente quel metodo (o chiamalo indirettamente attraverso un altro che rimuova la convalida).

Esempi di metodi che dovrebbe fare la convalida:

class A { 
    protected final function myMethodDefaultImplementation(...) { 
     /* subclasses can just call this method in their myMethod implementations */ 
     /* should do validation */ 
     ... 
    } 
    protected abstract myMethod(...); 

    public function orderByDate() { 
     return $this->orderBy(ORDER_BY_DATE) 
    } 

    private function orderBy($crit) { 
     /* should do validation */ 
     ... 
    } 
} 
0

Esattamente - se si progetta la vostra applicazione beh, allora non dovrebbe essere necessario.

3

Per protetta, penso che si dovrebbe convalidarli dal momento che il metodo potrebbe essere sostituito o chiamato da un'altra classe più tardi e non si può assumere ingressi validi per il metodo. Questo è particolarmente vero se si tratta di un componente che verrà utilizzato da altre applicazioni.

Per privata, penso che sia uno spreco, perché si è in controllo di ciò che viene passato ai metodi, in modo che i dati devono essere convalidati prima di mai chiamare il metodo privato.

-1

disinfettare Solo ingresso all'ultima occasione possibile. Non vedo come la semantica OO lo faccia diversamente.

Per esempio, se per qualche motivo non è possibile utilizzare query con parametri o un ORM (ony esempio mi viene in mente in questo momento :), devi scrivere la funzione come questa:

function getname($id) { 
    $id = intval($id); 
    mysql_query("SELECT * FROM users WHERE id = $id"); 
    ... 
} 

Ora è impossibile per qualsiasi codice per chiamare questa funzione e causare risultati imprevisti.

+0

Perché downvote? Questo è come è fatto. Non ha senso creare API che ti consentano di iniettare SQL. Per non parlare di questo è ** esattamente ** lo stesso della soluzione accettata. –

0

Direi che non importa che tipo di metodo è (pubblico, privato, protetto), si prendono le dovute precauzioni ogni volta che è necessario senza guardare la parola chiave visibilità.

Problemi correlati