2010-05-31 7 views
11

¿cuál es la mejor práctica? llamar a una función y luego regresar si prueba algo, o prueba algo, ¿luego llama?¿es mejor probar si se necesita una función dentro o fuera de ella?

prefiero la prueba dentro de la función porque facilita la visualización de las funciones a las que se llama.

por ejemplo:

protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
      this.FixURLCosmetics(); 
     } 

y

private void FixURLCosmetics() 
     { 
      HttpContext context = HttpContext.Current; 
      if (!context.Request.HttpMethod.ToString().Equals("GET", StringComparison.OrdinalIgnoreCase)) 
      { 
       // if not a GET method cancel url cosmetics 
       return; 
      }; 

      string url = context.Request.RawUrl.ToString(); 
      bool doRedirect = false; 

      // remove > default.aspx 
      if (url.EndsWith("/default.aspx", StringComparison.OrdinalIgnoreCase)) 
      { 
       url = url.Substring(0, url.Length - 12); 
       doRedirect = true; 
      } 

      // remove > www 
      if (url.Contains("//www")) 
      { 
       url = url.Replace("//www", "//"); 
       doRedirect = true; 
      } 

      // redirect if necessary 
      if (doRedirect) 
      { 
       context.Response.Redirect(url); 
      } 
     } 

es tan bueno:

if (!context.Request.HttpMethod.ToString().Equals("GET", StringComparison.OrdinalIgnoreCase)) 
      { 
       // if not a GET method cancel url cosmetics 
       return; 
      }; 

o debe esa prueba se realiza en Application_BeginRequest?

¿Qué es mejor?

thnx

+1

+1 Estaba deliberando sobre la misma pregunta ... –

+0

jeje, no estaba seguro de publicarlo o no, pero estoy trabajando en un proyecto completamente nuevo en Visual Studio y quiero obtener las mejores prácticas para todo Yo uso (y tengo el tiempo en este momento, entonces ¿por qué no?), así que pensé qué demonios): P y ustedes aman responder preguntas :) – b0x0rz

+3

Ninguno - debe usar el módulo de Reescritura de URL en IIS. – Jon

Respuesta

11

me siento como prueba dentro de la función es mejor. Si prueba fuera de la función, tendrá que probar en todas partes que se podría llamar a esa función (y causaría una gran cantidad de código duplicado).

Es más agradable tener todo en un solo lugar y luego extenderlo a todas partes.

+0

me olvidé de pensar en el caso cuando lo uso desde más de un lugar, por lo que :) – b0x0rz

+0

+1 hago lo mismo basado puramente en el argumento de duplicación de código, sin embargo, a menudo encuentro la prueba antes de llamar a la función más legible .. –

6

Si un método requiere absolutamente que se cumpla una cierta condición antes de que pueda realizar su función, entonces sí, debe colocar la validación dentro de esa función. Si, por otro lado, su código de llamada dice "solo realice esta operación en este conjunto de condiciones", entonces la condición es mejor en el código de llamada, porque la próxima vez que desee llamar a ese método, es posible que no desee incluir esa condición .

+0

+1 Buen razonamiento –

+0

tuvo que volver a leer un par de veces, pero sí tiene sentido! – b0x0rz

2

En este caso, creo que el nombre de la función implica que algo va a pasar con la URL en todos los casos. Alguien puede querer llamar al FixURLCosmetics en una página que no sea GET y esperar que ocurra algo.

Cambiaría el nombre de FixURLCosmetics a FixGETURLCosmetics. Luego, lanza una excepción si se llama a una página que no sea GET.

+0

me gusta esa idea también :) agradable. gracias. – b0x0rz

0

Si fuera usted, probaría en AMBOS lugares, estar fuera Y dentro, y burlarse de los componentes internos que se están llamando (como el contexto.Llamadas de solicitud), para fortalecer también el comportamiento interno y burlarse de algunos retornos inesperados y cómo su método trata con ellos.

En este caso, una API como easymock podría simplificar MUCHO la burla de los componentes internos.

Cuestiones relacionadas