2010-05-12 14 views
5

Ok, esto es probablemente muy subjetivo, pero aquí viene:¿Qué tipo de firma de método prefiere y por qué?

Supongamos que estoy escribiendo un método que tomará una pantalla de impresión de alguna región de la pantalla. ¿Qué firma de método preferirías y por qué?

  1. Bitmap DoPrintScreen (int x, int y, int ancho, int height);
  2. Bitmap DoPrintScreen (Rectángulo rect);
  3. Bitmap DoPrintScreen (Point point, Size size);
  4. Otros

¿Por qué?

Me sigo viendo implementando tanto 1) como 2) (redirigiendo uno de ellos al otro) pero termino usualmente solo usando uno de ellos, así que realmente no tiene sentido tener ambos. No puedo decidir cuál sería mejor. Tal vez debería usar la firma que más se ve con el método que voy a llamar para hacer la impresión de pantalla?

+2

¿Alguna vez consideraría tener áreas no rectangulares? –

+0

Nah, simplemente rectangular. –

+1

Entonces el número 2 es realmente la mejor abstracción. Simplemente cambie el nombre del parámetro a 'screenArea' o' area'; podría ser importante ahora que C# 4.0 admite parámetros con nombre. –

Respuesta

2

El mejor es

Bitmap DoPrintScreen(Rectangle screenArea); 

Si se piensa en los parámetros del método como parte de un "concepto", en este caso el concepto de un área de pantalla, entonces las otras opciones no resumen ese concepto lo suficientemente bien.

Además, utilice un buen nombre para el parámetro, ya que podría hacer que el código de llamada sea incluso more clear mediante el uso de parámetros con nombre en C# 4.0.

+0

Sí, esta parece ser la mejor opción. buen blog por cierto –

1

Rectangle es probablemente el más claro porque el argumento no depende de la posición. Sería fácil para un usuario intercambiar accidentalmente x y y o width y height.

Point/Size es también mejor que x-y-width-height, y en ocasiones la claridad extra puede ser un poco más clara de leer.

Pero en última instancia, no hay una buena razón para no utilizar las tres sobrecargas.

13

Depende. Si se trata de una biblioteca para uso general, añada todos los tres. El framework .NET, especialmente GDI +, está lleno de ejemplos de esto. Si la conversión es trivial, no es demasiado esfuerzo, y sus usuarios estarán agradecidos.

Si solo es una clase interna, elegiré la opción que sea más fácil de usar desde el sitio de llamadas. Por ejemplo, si la persona que llama ya tiene un Rectangle disponible, la sobrecarga Rectangle es mejor. Si hay varios sitios de llamadas con diferentes preferencias, probablemente sea mejor agregar varias sobrecargas también.

+1

En igualdad de condiciones, anticipar lo que los sitios de llamadas probablemente tendrán debería dar la respuesta. +1 – sbk

1

Creo que debería seleccionar la versión que mejor se corresponda con los otros métodos que se usarían junto con su código. Me refiero a los métodos y métodos .Net de otras bibliotecas de terceros estándar o comunes. De esa manera, el código se ve uniforme y los mismos objetos se pueden pasar a otros métodos directamente.

4

Rectangle describe mejor el comportamiento de la función (por lo menos espero que así sea!) El X & asociado con la anchura Y & altura a fin de definir un rectángulo; no son variables arbitrarias no relacionadas.

3

Me gustaría ir con 2)

Bitmap DoPrintScreen(Rectangle rect); 

como Mark dijo que los parámetros se pueden intercambiar en el siguiente:

Bitmap DoPrintScreen(int x, int y, int width, int height); 

no elegiría esto, ya que no es tan explícito como 2) a alguien más que lo lea. Mientras que no hay ninguna ambigüedad a alguien que lea 2)

Bitmap DoPrintScreen(Point point, Size size); 

Por supuesto, eso es sólo mi opinión por supuesto !!!

2

Yo personalmente incluiría los tres, dejando que el usuario elija cuál prefiere usar, todo para ofrecer la mayor libertad de uso posible para el usuario. A nadie le gusta que lo esposen. Bueno, ¡no en la programación! ;)

3

Si solo termina llamando a una de estas sobrecargas, entonces realmente no tiene sentido que las otras dos estén sentadas. No hay nada que odie más que tener que pasar 27 sobrecargas de algún método, esperando que a) encuentre el correcto para mis propósitos, yb) la persona que escribió este lío en realidad corrió y probó la sobrecarga que estoy usando, incluso una vez .

En el caso específico de un método de captura de pantalla, la sobrecarga con el parámetro Rectangle sería probablemente la más útil, ya que los formularios siempre tienen un rectángulo asociado. Además, si necesita tomar repetidamente la misma área de pantalla, es más fácil guardar una variable (un Rectangle) que cuatro (x, y, ancho y alto).

1

Proporcionaría los 3 si fuera conveniente para el consumidor. Después de todo, su implementación real (o debería) solo existe en un lugar. Todos los otros métodos sobrecargados simplemente extraerán los parámetros apropiados y los pasarán al método local con el código real.

... por lo que es una conveniencia para sus usuarios con poco o ningún esfuerzo de su parte. Win/Win.

0

Tanto - 1 y 2. y también uno sin parametros para pantalla completa =)

Algunas veces se han separado x, y, ancho, altura, algunas veces que ya tienen rectángulo. Varian 3 - En mi humilde opinión es muy raro =) Pero el usuario siempre puede convertir valores a un rectángulo, o separar el rectángulo de los valores) Creo que esta es una cuestión filosófica.

Así que todos o escoger uno al azar)))

0

Todo 3. Como dijiste, vas a redirigirlos a 2 cualquiera que así sea, ¿por qué no mantener los tres? Creo que deberías cambiar el nombre del parámetro Rectangle por algo más significativo, como printArea.

aplausos.

Cuestiones relacionadas