2009-05-28 23 views
14

Hola, soy recién graduado de la universidad. Estoy trabajando en un proyecto que espero sea mantenido por alguien más. Sigo encontrando una situación molesta en este proyecto, y eso son objetos que requieren muchas variables privadas y, como resultado, constructores muy largos.Estándares de codificación: Gran cantidad de argumentos

Además de la nomenclatura variable, no se aplica ningún estándar de codificación. Me pregunto cómo lidiar con cosas como esta. ¡A veces me temo que veré mi propio código diariamente en el futuro!

Intenté tratar de encerrar algunos de estos argumentos en otras clases, pero en esta situación no tiene sentido.

¿Es esto un problema total o es algo que debería y puede corregirse fácilmente?

public function __construct($uCode = '', $uName = '', $uTime = '', $uArea = '', $uDomain = '', $uText = '', $uId = '', $uNum = '', $uVideo = 0, $uAudio = 0, $uImage = 0){ 
+0

1 por expresar – talonx

+0

Buena pregunta su preocupación, yo votaría hasta los 3 mejores respuestas ya que ambos son buena solución, y el mejor enfoque debe ser seleccionado mediante el conocimiento más sobre el proyecto en el que trabajas Como recién graduado, estoy bastante seguro de que puedes ver los pros y los contras de las 3 sugerencias. –

Respuesta

16

En general, si tiene más de 4 argumentos, es mejor utilizar un objeto temporal o matriz en su lugar. A menudo, muchos de los parámetros son opcionales y esto puede ser bastante incómodo y propenso a errores bastante rápido. Por lo tanto:

class MyClass { 
    public function __construct($options) { ... } 
... 
} 

$o = new MyClass(array(
    'uCode' => 'some value', 
    'uText' => 'another value', 
)); 

que para comparar:

$o = new MyClass('some value', '', '', '', '', 'another value'); 

Note como la versión array sólo incluye lo que desea pasar.

7

que tienden a inclinarse hacia la solución de Cletus, pero la otra alternativa es el uso de set() funciones para todos los valores que no sean absolutamente necesarios para tener en el constructor

por ejemplo, si se requieren $ uCode y $ uname, pero el resto son opcionales ...

public function __construct($uCode = '', $uName = '') {} 
public function setUTime($uTime) {} 
public function setUArea($uArea) {} 
... 

A veces puede ser útil disponer de sus emisores de retorno $ esto, para que pueda comandos de la cadena, como Entonces:

$object = new MyObject($code, $name); 
$object->setUTime($time)->setUArea($area)->...; 
+0

+1, así es como lo hago –

+0

+1, me gusta así también – Galen

0

Si tiene demasiados argumentos, es una señal de que su método puede estar haciendo demasiado. Intente si puede dividir la tarea en muchas tareas más pequeñas y refactorizar el método. Si eso falla, pasar una clase con todos los parámetros debería estar bien.

0

Puede asignar esa cantidad de parámetros a una matriz y pasar esa matriz a su __construct en su lugar para que solo pueda tener un parámetro de matriz.

0

podría utilizar métodos mágicos

class abc { 

    private $allowed = array(
     'uCode', 
     'uId' 
    ); 

    public function __set($name, $value) { 
     if (in_array($name, $this->allowed)) { 
      $this->$name = $value; 
     } 
    } 

    public function __call($name, $args) { 
     if (substr($name, 0, 4) == "set_") { 
      $var = substr($name, 4); 
      if (in_array($var, $this->allowed)) { 
       $this->$var = $args[0]; 
      } 
     } 
    } 

} 

$abc = abc(); 
$abc->uCode = 123; 
$abc->set_uId(123); 
Cuestiones relacionadas