How to implement isValid correctly?

Posted by Songo on Programmers See other posts from Programmers or by Songo
Published on 2012-10-11T19:59:06Z Indexed on 2012/10/11 21:47 UTC
Read the original article Hit count: 211

I'm trying to provide a mechanism for validating my object like this:

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;
    }

}

Then when I'm testing my code I'm doing it like this:

    $obj = new SomeObject('an INVALID input string');

    $isValid = $obj->isValid();
    $errors=$obj->getErrors();

    $this->assertFalse($isValid);
    $this->assertNotEmpty($errors);

Now the test passes correctly, but I noticed a design problem here. What if the user called $obj->getErrors() before calling $obj->isValid()?

The test will fail because the user has to validate the object first before checking the error resulting from validation. I think this way the user depends on a sequence of action to work properly which I think is a bad thing because it exposes the internal behaviour of the class.

How do I solve this problem?
Should I tell the user explicitly to validate first? Where do I mention that?
Should I change the way I validate? Is there a better solution for this?

UPDATE:
I'm still developing the class so changes are easy and renaming functions and refactoring them is possible.

© Programmers or respective owner

Related posts about design

Related posts about object-oriented