¿La mejor manera de pasar valores a una función cuando hay muchos para enviar?

¿Cuál es la mejor manera de definir una firma de método cuando tiene que pasar muchos valores a una función y algunos de estos pueden ser opcionales? Y en el futuro, puede ser que tenga que pasar más variables o restar algunos valores pasados ​​dados a la función.

Por ejemplo: (el teléfono y la dirección son opcionales)

function addInfo( $name, $dob, $phone='', $address='' ) { // Store data } addInfo( 'username', '01-01-2000', '1111111' ); // address is not given 

O

 function addInfo( $info ) { // Store data } $info = array( 'name'=>'username', 'dob'=>'01-01-2000', 'phone'=>'1111111', 'address'=>'' ); addInfo( $info ); 

Hay otra forma similar a OOP: crear objeto de parámetro (por ejemplo, persona) con los campos ‘nombre’, ‘dob’, ‘teléfono’, ‘dirección’ (esto se llama introducir refactorización de objetos de parámetros en el libro “Refactorización” de Fowler). Parece apropiado en su caso, ya que todos los campos a los que pasa para funcionar en realidad están relacionados con un objeto.

Martin sugiere en ” Código limpio “, que debe limitar el número de parámetros a casi 2-3 para mantener el código fácilmente comprensible. Entonces sería mejor envolverlos en un objeto y pasar el objeto como parámetro. Definitivamente es preferible.

Aunque la segunda versión de la función parece mejor, no lo es. Eso es porque no sabes qué tipo de datos espera la función. Una matriz de elementos es simplemente demasiado genérica. Un objeto encajaría mejor en mi humilde opinión. Un objeto de clase está bien definido, donde espera, por ejemplo. un objeto Empleado y usted llama a la función con un Empleador, la llamada fallaría.

Entonces, para resumir, usaría la primera versión o el modo de objeto de clase.

Prefiero la primera versión ya que es más explícita y, por lo tanto, es más amigable para los progtwigdores. Un progtwigdor puede ver de un vistazo qué espera la función.

La segunda versión sería preferible si la función pudiera aceptar una gran cantidad de argumentos (opcionales). En ese caso, tendría sentido agruparlos y pasarlos como una unidad.

No sé sobre las implicaciones de rendimiento para comentar. Sospecho que la pena, si la hay, no será grave.

Intereting Posts