¿Qué es un argumento de salida, como se menciona en el Código de limpieza de Martin?

14

En la página 45 del Código limpio de Robert C. Martin: Manual de Agile Software Craftsmanship, Martin escribe que se deben evitar los argumentos de salida. Tengo problemas para entender el significado de "argumento de salida" y por qué deben evitarse.

El ejemplo de Martin para un argumento de salida appendFooter(s); llama a la función public void appendFooter(StringBuffer report) . Su mejora del código es report.appendFooter();

Tal vez se deba a la falta de contexto de código, pero no veo cómo el uso de argumentos de salida se considera una codificación deficiente. ¿Alguien podría explicar el concepto o dar un ejemplo adicional de código para entender esto?

¿La siguiente función también se consideraría un ejemplo de código no limpio según el principio anterior?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

Si lo anterior es una violación del principio de Martin de no usar argumentos de salida, ¿sería mejor tener un objeto que tenga una matriz como campo y una función a la que se pueda llamar para ordenar la matriz?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();
    
pregunta WP0987 16.06.2016 - 22:49

2 respuestas

10

Bob Martin está hablando simplemente de legibilidad .

El problema con el ejemplo appendFooter es que, si encuentra la línea de código appendFooter(s) en algún lugar de un programa, no es inmediatamente obvio si esa llamada toma s como entrada y la agrega a alguna parte, o si s simplemente se pasa para tomar la salida de de esa función. Para estar seguro, necesita verificar la documentación de la función. Una llamada como report.appendFooter() , sin embargo, evita ese problema: ahora es mucho más obvio lo que sucede.

Sin embargo, tenga en cuenta que Bob Martin no dice "nunca use argumentos de salida", dice "en general, debe evitarlo, porque le ayudará a mantener su código un poco más limpio". Así que esta no es una regla de culto de carga de Braindead que uno deba seguir ciegamente Los métodos de

Sort para matrices y colecciones estándar son un poco diferentes. Tener el método sort una función miembro de cada tipo de datos de matriz estándar tendría algunos inconvenientes desde el punto de vista del diseñador del lenguaje, por ejemplo, tener un método como Array.sort permite mantener esto en la biblioteca estándar, fuera de Java tiempo de ejecución Pero si usted creara un tipo de colección individual que a veces debe ordenarse, agregar sort como función miembro podría ser una mejor idea que ubicarlo en una clase separada.

    
respondido por el Doc Brown 16.06.2016 - 23:18
10

Se trata de utilizar un mecanismo inesperado para devolver un valor desde la función, que generalmente es el resultado de hacer demasiado en la función o tener responsabilidades desalineadas. De lejos, la mejor manera de comunicar el resultado de una función es usar el valor de retorno. Espero que eso sea evidente. En los lenguajes orientados a objetos, el segundo mejor método es mutar el objeto.

Entre esas dos opciones, hay tantas formas claras y obvias de comunicar el resultado de una función que si alguna vez desea mutar los argumentos como el único medio, algo ha ido mal en su arquitectura. Necesita reorganizar sus responsabilidades de clase para que el que hace la mutación sea el propietario de los datos en primer lugar.

La única excepción es para algoritmos muy genéricos. Por ejemplo, un algoritmo de clasificación podría estar separado de los contenedores que ordena, si se puede aplicar genéricamente a cualquier tipo de contenedor utilizando su interfaz pública. Una función one-shot appendFooter no tiene esa excusa.

    
respondido por el Karl Bielefeldt 17.06.2016 - 00:11

Lea otras preguntas en las etiquetas