Sto provando a fornire un meccanismo per convalidare il mio oggetto in questo modo:
class SomeObject {
private $_inputString;
private $_errors=array();
public function __construct($inputString) {
$this->_inputString = $inputString;
}
public function getErrors() {
return $this->_errors;
}
public function isValid() {
$isValid = preg_match("/Some regular expression here/", $this->_inputString);
if($isValid==0){
$this->_errors[]= 'Error was found in the input';
}
return $isValid==1;
}
}
Quindi quando sto testando il mio codice lo faccio in questo modo:
$obj = new SomeObject('an INVALID input string');
$isValid = $obj->isValid();
$errors=$obj->getErrors();
$this->assertFalse($isValid);
$this->assertNotEmpty($errors);
Ora il test passa correttamente, ma ho notato un problema di progettazione qui. Cosa succede se l'utente ha chiamato $obj->getErrors()
prima di chiamare $obj->isValid()
?
Il test fallirà perché l'utente deve prima convalidare l'oggetto prima di verificare l'errore risultante dalla convalida. Penso che in questo modo l'utente dipenda da una sequenza di azioni per funzionare correttamente, il che penso sia una cosa negativa perché espone il comportamento interno della classe.
Come posso risolvere questo problema?
Devo dire esplicitamente all'utente di convalidare prima? Dove lo dico?
Devo cambiare il modo in cui convalidare? C'è una soluzione migliore per questo?
UPDATE:
Sto ancora sviluppando la classe, quindi i cambiamenti sono facili e le funzioni di ridenominazione e il refactoring sono possibili.