Clases de PHP: ¿los mensajes de estado deben estar dentro o fuera de la clase?

Tengo una clase que hace algo, y cuando termina regresa true, pero si alguna de las diversas cosas sale mal, volverá false. Ahora mi pregunta es si los mensajes de estado para tales eventos deben mantenerse dentro de una clase (Ejemplo1) o fuera de la clase (Ejemplo2) donde la clase tal vez solo proporcione un código de error para ayudar a distinguir lo que sucedió.

    class Example1 {

       private $var;
       private $status;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) { 
            $this->status = 'Please provide a number'; 
            return false; 
         }

         if (empty($this->var)) {
            $this->status = 'Please fill the field';
            return false;
         }

         $this->status = 'Ok, you submitted a number, cool.';
         return true;
    } 

         function getStatus() {
            return $this->status;
         }
}

ejemplo 2:

    class Example2 {

       private $var;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) {  
            return false; 
         }

         if (empty($this->var)) {
                return false;
         }

             return true;
    } 

}

El ejemplo 1 me parece más conveniente de usar, el código se lee como un poema, pero al mismo tiempo parece menos reutilizable, dependiendo de para qué use la clase, es posible que desee que los mensajes de éxito/error tengan una sintaxis diferente.

Entonces, básicamente, mi pregunta sería ¿cuál es la práctica habitual?

preguntado el 22 de mayo de 12 a las 18:05

3 Respuestas

Primer ejemplo: usted codifica mensajes de error que son... malos. Y no puede ver el mensaje de error si no marca $object->status más tarde.
Segundo ejemplo: si algo sale mal, lo sabes pero no sabes por qué.

Sugiero evitar ambas formas y lanzar excepciones para un enfoque más orientado a objetos (supongo que eso es lo que quieres, ya que estás usando clases :).

contestado el 22 de mayo de 12 a las 18:05

Depende de para qué sea el código. Si está validando un formulario del lado del servidor, por ejemplo, es posible que sea necesario devolver esos mensajes de error para que se muestren en la pantalla. - caleb taylor

¿Puede explicar por qué la codificación de mensajes de error como ese es mala? - Andrewsi

@CalebTaylor Sí. :) Pero no en la clase en sí. -- Él debería catch la excepción en otro lugar (en el controlador, por ejemplo) y luego envíe el código de estado. - Samy Dindane

@SamyDindane Ahora estamos entrando en MVC :) Pero estoy divagando. - caleb taylor

@andrewsi Lo primero que se me ocurre: ¿y si quieres que se traduzcan más tarde? ¿Qué pasa si simplemente quieres cambiarlos? ¿Qué pasa si no quieres usar la clase en una API y los chicos del otro lado quieren personalizar los mensajes? -- En general, se supone que las clases solo contienen lógica. - Samy Dindane

Depende completamente de ti. Si los mensajes de error son más fáciles de entender para usted y lo ayudan a depurar su código, entonces hágalo. Generar códigos de error para diferentes errores probablemente ralentizará el proceso de desarrollo, a menos que desee ocultar los errores verdaderos a los usuarios (pero en ese caso tiene varias opciones, una de las cuales es no imprimir errores en la pantalla si los usuarios pueden verlos).

contestado el 22 de mayo de 12 a las 18:05

No es lo que está preguntando, pero generalmente se considera una mala práctica tener varias declaraciones de devolución en una función. El problema es que dificulta saber por dónde se sale de la función, lo que hace que no quede claro qué se ejecuta. En su ejemplo, si la primera prueba tiene éxito, el resto del código no se ejecuta. ¿Qué pasaría si estableces algunos atributos después? A veces se establecerán, a veces no. Para deshacerse de este problema, es mejor tener solo una declaración de devolución. Se ejecutará más código, y tendrá que cambiar un poco la forma en que codifica para acostumbrarse.

Aquí hay un ejemplo de lo que quiero decir, con el código que proporciona:

public function doSomething($var) {
     $this->var = $var;
    $result = false;
     if (!is_numeric($this->var)) { 
        $this->status = 'Please provide a number';  
     }
     else if (empty($this->var)) {
        $this->status = 'Please fill the field';
     }
     else{
        $this->status = 'Ok, you submitted a number, cool.';
        $result = true;
    }
     return $result;
} 

contestado el 22 de mayo de 12 a las 19:05

Cierto, no es la respuesta a la pregunta, pero tiene mucho sentido, gracias. Mi línea de pensamiento con múltiples declaraciones de retorno fue: una función necesita hacer algo, y si no puede, ¿por qué ejecutarla más? Pero puedo ver cómo el retorno único tiene sentido, también para hacer que la lógica sea más fácil de entender. - CódigoVirtuoso

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.