Il modo migliore per generare eccezioni ed evitare la duplicazione del codice

3

Attualmente sto scrivendo il codice e voglio assicurarmi che tutti i parametri che vengono passati a una funzione / metodo siano validi. Dato che sto scrivendo in PHP, non ho accesso a tutte le funzionalità di altri linguaggi come C, C ++ o Java per verificare i valori e i tipi di parametri

public function inscriptionExists($sectionId, $userId) // PHP

vs.

public boolean inscriptionExists(int sectionId, int userId) // Java

Quindi devo fare affidamento sulle eccezioni se voglio assicurarmi che i miei parametri siano entrambi interi.

Dato che ho molti punti in cui devo verificare la validità del parametro, quale sarebbe il modo migliore per creare una macchina di validazione / eccezione ed evitare la duplicazione del codice?

Stavo pensando a una fabbrica statica (dato che non voglio passarla a tutte le mie classi) con una firma del tipo:

public static function factory ($value, $valueType, $exceptionType = 'InvalidArgumentException');

Che chiamerebbe quindi il processo secondario giusto per convalidare in base al tipo.

Sono sulla buona strada, o sto andando completamente fuori strada e penso troppo al mio problema?

    
posta JF Dion 12.12.2012 - 15:28
fonte

2 risposte

4

PHP fornisce tipo di suggerimento per oggetti e array . Sfortunatamente, non per i tipi scalari come string o int .

Ci sono vari approcci. Uno è quello di usare affermazioni asser:

public function inscriptionExists($sectionId, $userId){
  assert(is_int($sectionId));
  assert(is_int($userId));
}

È necessario assicurarsi che l'assert sia attivo almeno durante lo sviluppo:

assert_options(ASSERT_ACTIVE, 1)

Potresti scrivere una classe di utilità lungo queste linee

class Check{

  public static function int(& $param, $name){
    if( !is_int($param) ){
       throw new InvalidArgumentException($name.' is not an integer');
    }
  }
}

e poi

public function inscriptionExists($sectionId, $userId){
  Check::int($sectionId, 'sectionId');
  Check::int($userId, 'userId');
    
risposta data 12.12.2012 - 17:07
fonte
4

Penso che tu stia pensando troppo al tuo problema

A mio parere, la digitazione dinamica è una delle caratteristiche di PHP che rende estremamente piacevole lavorare. Invece di imporre rigorose regole di digitazione, puoi semplicemente documentare la tua funzione molto bene per indicare i parametri che ti aspetti. Se il contratto non viene rispettato, i risultati possono variare e l'utente è responsabile della propria funzione.

Inoltre, se il tuo codice base viene usato solo internamente (da te e dal tuo team), non dovresti avere problemi con i tipi di parametri come tu hai sviluppato il codice e dovresti sapere come usarlo. Se il tuo progetto è una biblioteca disponibile al pubblico, una buona documentazione è la chiave. Dovresti anche avere dei buoni test unitari per assicurarti che il tuo codice si comporti come previsto e per fornire esempi su come usare la tua libreria.

Vedo che stai cercando di scrivere codice Java in PHP e questo significa che non capisci bene PHP. Quando scrivi un codice in una determinata lingua, dovresti provare ad abbracciare le caratteristiche / filosofia del linguaggio invece di guardare indietro a ciò che già sai e provare ad adattare.

    
risposta data 12.12.2012 - 16:31
fonte

Leggi altre domande sui tag