Foros del Web » Programación para mayores de 30 ;) » .NET »

Eficiencia a la hora de programar

Estas en el tema de Eficiencia a la hora de programar en el foro de .NET en Foros del Web. A la hora de programar que resulta mas eficiente. Supongamos tenemos un boton el cual contiene: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C#: Ver original private void button5_Click ...
  #1 (permalink)  
Antiguo 04/03/2014, 13:56
 
Fecha de Ingreso: enero-2011
Ubicación: Del otro lado del monitor
Mensajes: 43
Antigüedad: 13 años, 3 meses
Puntos: 0
Eficiencia a la hora de programar

A la hora de programar que resulta mas eficiente. Supongamos tenemos un boton el cual contiene:
Código C#:
Ver original
  1. private void button5_Click(object sender, EventArgs e)
  2.         {
  3.             messagebox.show("Hola mundo");
  4.         }

o tener lo siguiente:

Código C#:
Ver original
  1. public void mensaje()
  2.         {
  3.             messagebox.show("Hola mundo");
  4.         }
  5.         private void button5_Click(object sender, EventArgs e)
  6.         {
  7.             mensaje();
  8.         }
  #2 (permalink)  
Antiguo 04/03/2014, 22:28
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Respuesta: Eficiencia a la hora de programar

Hola! interesante pregunta, te cuento que si buscás eficiencia en procesamiento (Procesador) la opción primera es varias veces más eficiente que la segunda, debido principalmente a que te ahorrás una llamada, llamando directamente a la función MessageBox.

Ese es el problema de la programación en capas. En tu caso, vos agregaste la capa "mensaje" y tal vez a otro programador se le ocurre agregar dentro de la capa "mensaje" otra capa llamada "mensaje_Especial", y así se van agregando más y más consumos de tiempos de CPU.

Hay que aclarar que son nanosegundos y en la actualidad es casi imperceptible dicha sobrecarga, además desde el punto de vista de la POO está muy bien para el programador manejarlo en capas para la fácil lectura, mejor mantenimiento etc.

Por lo tanto no es eficiente estrictamente hablando, pero sí resulta bastante aconsejable para el programador.

Por ejemplo en mi caso uso todos los mensajes en una capa llamada Msg y dentro de esta capa tengo la funciones Mensajes que son las que ejecutan el MessageBox específico para cada caso, y lo hago por razones prácticas y porque programo mucho más rápido con mi clase Msg que con el MessageBox ya que con Msg sólo tengo que tipear tes letras un punto y me trae todos los métodos de mensajes habidos, en cambio con el MessageBox en crudo hay que setear varios parámetros como ser el icono los botones, el título, etc.
  #3 (permalink)  
Antiguo 05/03/2014, 02:11
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Eficiencia a la hora de programar

Bueno, voy a indicar más o menos lo mismo. Hay dos tipos de "eficiencias":
- La velocidad de ejecución
- La capacidad para mantener el programa


La primera puede parecer obvia, pero no lo es tanto. Se entiende que al tener que llamar a una función más, el código puede tardar más en ejecutarse, pero mientras sea imperceptible para el usuario no hay problema. Hay un problema de tiempo de ejecución cuando una consulta a una base de datos te tarda medio minuto, pero por una decimas de segundo en mostrar un MessageBox nadie se va a llevar las manos a la cabeza.

El tema de mantener y adaptar el código es más delicado. Imaginate que imprimes todos tus mensajes con los MessageBox directamente. Si el día de mañana tus jefes o tu decidiis que es mejor mostrar los mensajes de otra forma, vas a tener que ir por cada MessageBox y modificando el código. Ahora imaginate que, además, descubres que hay un bug en ese nuevo código, vas a tener que ir otra vez mensaje por mensaje para solucionar el bug, y eso con cuidado de no dejarte ninguno. Pero si tienes una función (o mejor, una clase) que se encargue de pasarle un mensaje de texto y ella misma escriba el mensaje, todos los cambios irá centralizados a una única función. Así sería mucho más fácil hacer los cambios de antes, no? Pues igual pasa con todo el programa. De ahí aparece la forma de programación mediante capas, separando por un lado el acceso a los datos, por otro la utilización de ellos y por otro la parte de presentación de los datos.
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 06/03/2014, 17:49
 
Fecha de Ingreso: enero-2011
Ubicación: Del otro lado del monitor
Mensajes: 43
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Eficiencia a la hora de programar

Cita:
Iniciado por Malenko Ver Mensaje
Bueno, voy a indicar más o menos lo mismo. Hay dos tipos de "eficiencias":
- La velocidad de ejecución
- La capacidad para mantener el programa


La primera puede parecer obvia, pero no lo es tanto. Se entiende que al tener que llamar a una función más, el código puede tardar más en ejecutarse, pero mientras sea imperceptible para el usuario no hay problema. Hay un problema de tiempo de ejecución cuando una consulta a una base de datos te tarda medio minuto, pero por una decimas de segundo en mostrar un MessageBox nadie se va a llevar las manos a la cabeza.

El tema de mantener y adaptar el código es más delicado. Imaginate que imprimes todos tus mensajes con los MessageBox directamente. Si el día de mañana tus jefes o tu decidiis que es mejor mostrar los mensajes de otra forma, vas a tener que ir por cada MessageBox y modificando el código. Ahora imaginate que, además, descubres que hay un bug en ese nuevo código, vas a tener que ir otra vez mensaje por mensaje para solucionar el bug, y eso con cuidado de no dejarte ninguno. Pero si tienes una función (o mejor, una clase) que se encargue de pasarle un mensaje de texto y ella misma escriba el mensaje, todos los cambios irá centralizados a una única función. Así sería mucho más fácil hacer los cambios de antes, no? Pues igual pasa con todo el programa. De ahí aparece la forma de programación mediante capas, separando por un lado el acceso a los datos, por otro la utilización de ellos y por otro la parte de presentación de los datos.


Saludos a ambos muchas gracias por las respuestas, el messagebox era solo un ejemplo pues burdo, para no ser tan largo en la pregunta, ahora respecto a esto me surge otra duda o problema, estuve viendo el siguiente código que tengo en un login (yo se que de momento es inseguro, pero la duda no va por ahí) la duda es la siguiente. Tengo este codigo en mi Form1 (el cual tiene los textbox para el login y una liga para registrarse)

Código:
System.Data.SqlClient.SqlConnection con;

public void conectarbd()
        {
            con = new SqlConnection();
            con.ConnectionString = "Integrated Security=SSPI;Initial Catalog=Empleados;Data Source=CRISTINA\\SQLEXPRESS";
            try
            {
                con.Open();

            }
            catch (Exception)
            {
                MessageBox.Show("Conexion Fallida");
            }
        }
Con esto me conecto a mi base de datos, al dar clic en registrarse abre otro form en el cual tengo lo siguiente

Código:
System.Data.SqlClient.SqlConnection con;
  private void Form2_Load(object sender, EventArgs e)
        {
            Form1 conecta = new Form1
            conecta.conectarbd();            
        }

private void button1_Click(object sender, EventArgs e)
        {
            SqlDataAdapter da = new SqlDataAdapter("INSERT INTO Users (Nombre,Correo) Values ('" + textBox1.Text + "', '" + textBox2.Text + "')",con);
            DataSet ds = new DataSet();
            da.Fill(ds);
        }
El problema es que la variable "con" siempre queda como null entonces no se ve reflejado el insert to en mi base de datos, entonces tuve que volver a escribir la cadena de conexion completa en el segundo form en vez de solo mandarla a llamar, esto como lo puedo evitar, pues me esta generando codigo repetititvo.

Saludos.
  #5 (permalink)  
Antiguo 07/03/2014, 18:01
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Respuesta: Eficiencia a la hora de programar

El objeto "con" de form1 es distinto del objeto "con" de form2:

form1.con != form2.con // fijate que no coinciden, son distintos!

Si vos querés ver el objeto form1.con desde form2, entonces podés declararlo public:

Public System.Data.SqlClient.SqlConnection con;

Aquí va un consejo: siempre es aconsejable declarar explícitamente qué nivel de accesibilidad tendrán los miembros de una clase.

Entonces en form2 sólo ponés:
SqlDataAdapter da = new SqlDataAdapter("INSERT INTO Users (Nombre,Correo) Values ('" + textBox1.Text + "', '" + textBox2.Text + "')",form1.con);

Pero no es aconsejable programar así, en lugar de esto, los que saben aconsejan usar capas.

Pero ten en cuenta esta aclaración: en el modelo de capas, hay muchas incoherencias en los ejemplos que andan circulando por internet

la capa presentación nunca puede saltarse la capa de negocio e ir directamente a buscar el dato a la capa datos , eso está mal.

otra cosa que he visto es que referencian unas capas con otras en forma bidireccional , por ejemplo desde la capa negocio referencian a la capa datos y desde la capa datos referencian a la capa negocio, eso está mal

la capa datos no tiene que ver de ninguna manera la capa negocio, y la capa negocio no tiene que ver de ninguna manera la capa presentacion

cuando dos capas se referencian mutuamente, entonces no se trata de capas distintas sino IGUALES. Aquí hay que usar sentido común ¿para qué separar en capas y complicar el código si después vamos a referenciarlas mutuamente?

Si decides programar en capas, que es lo aconsejable, ten en cuenta estos detalles.

Saludos cordiales!
  #6 (permalink)  
Antiguo 07/03/2014, 19:50
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Eficiencia a la hora de programar

Hola,

Básicamente en Visual Basic se haría de la siguiente forma, tendrías que adaptar los conceptos a C#, que increiblemente no me di cuenta que estabas hablando de C# hasta cuando ya lo había escrito.

Cita:
Iniciado por MarkiiAk Ver Mensaje
... el messagebox era solo un ejemplo pues burdo, para no ser tan largo en la pregunta, ...
Tendrías que haber puesto un ejemplo que represente exactamente el objetivo que deseas obtener, un MessageBox y un ConnectionString son diferentes desde el punto de vista de su manejo.

El MessageBox puede ir localizado en diferentes idiomas y debería cargarse de una librería de recursos que pueda ser cambiada por otro idioma dependiendo de la configuración del usuario o del sistema. El ConnectionString debería poder ser cambiado dependiendo de un archivo de configuración.

Cita:
Iniciado por MarkiiAk Ver Mensaje
Código:
System.Data.SqlClient.SqlConnection con;

public void conectarbd()
        {
            con = new SqlConnection();
            con.ConnectionString = "Integrated Security=SSPI;Initial Catalog=Empleados;Data Source=CRISTINA\\SQLEXPRESS";
            try
            {
                con.Open();

            }
            catch (Exception)
            {
                MessageBox.Show("Conexion Fallida");
            }
        }
El ejemplo sigue siendo bastante malo, si cambias la base de datos de servidor tienes que cambiar todas la cadenas de conexión donde lo hayas copiado "hard coded". No voy a mencionar lo de la seguridad y lo del try catch por ser deficiencias suficientemente evidentes.

Una manera de leer tu archivo de configuración podría ser la siguiente, o algo parecido, esto funcionaba en Visual Basic 2008, tendrías que adaptarlo a C#:

Código:
    Public globalConnectionString As String

    Private Function ReadXMLConfiguration(ByVal Value As String) As String
        Dim confAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader()
        Return CType(configurationAppSettings.GetValue(Value, GetType(System.String)), String)
    End Function

    Public Sub Main()
        globalConnectionString = ReadXMLConfig("TheSqlConnection.ConnectionString")
    End Sub
Ese método o función lee cualquier configuración en XML que esté grabada en el archivo app.settings de tu aplicación. Después podrías leer tu cadena de configuración y guardarla en una variable global en un módulo.

Cita:
Iniciado por MarkiiAk Ver Mensaje
... entonces tuve que volver a escribir la cadena de conexion completa en el segundo form en vez de solo mandarla a llamar, esto como lo puedo evitar, pues me esta generando codigo repetititvo. ...
En Visual Basic lo normal es crear una variable global a nivel de toda la aplicación en un Module con visibilidad Public. Eso es normal porque la variable no va a variar (sería parecido una constante) después de haber sido inicializada en un Main; por ser un ConnectionString, en otro tipo de variables posiblemente no sea adecuado una variable global.

En decir, es una variable que después de haber sido inicializada no va a cambiar, parecido a una constante.

Cita:
Iniciado por javidotnet Ver Mensaje
... Pero no es aconsejable programar así, en lugar de esto, los que saben aconsejan usar capas. ...
Interesante descripción de la programación en capas, aunque básicamente lo que MarkiiAk deseaba es una variable publica global inicializada en un Main.

Lo que si es cierto es que en una aplicación por capas solamente se requiere el ConnectionString en la capa de Acceso a datos y nada más. También crear la conexión o la cadena de conexión como atributo de una clase, si esa clase no se dedica exlusivamente a conexiones, estaría mal.

Saludos,

Última edición por HackmanC; 07/03/2014 a las 19:58 Razón: 2008

Etiquetas: eficiencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:23.