Hace poco escribí un post, para evitar comparar por un “algo” en código. Sinceramente el código que compara un string con el contenido de una cadena, es una chapuza. Todos lo hemos hecho, normalmente por prisas. Y cuando te toca cambiar el valor de esa cadena, te das cuenta del error que cometiste.
Pues resulta que comprar con un “algo” es un practica que tiene nombre Magic String. Con ese nombre parece hasta genial usarlo.
Pero si lo vas a usar, porque lo necesitas si o si, piensa que hay opciones .
http://geeks.ms/blogs/lruiz/archive/2015/02/05/clean-code-evitando-magic-strings.aspx
http://blog.goyello.com/2014/12/30/magic-strings-no-more/
http://www.variablenotfound.com/2009/12/t4-el-talisman-contra-las-cadenas.html
jueves, 19 de marzo de 2015
viernes, 13 de marzo de 2015
Google avisa
Necesitas que la web se vea bien en moviles
Para usuario de blogger esto no sea un problema: las propias plantillas ya realizan los cambios necesarios.De he hecho lo he con el mio y sin problemas
Pero si tu web es comercial será mejor que te pongas la pilas. Posiblemente no sea fácil, o por lo menos no tan fácil como cambiar unos css
Info
http://communityanalisis.com/google-avisa-sin-version-responsive-desapareces-el-21-de-abril/
http://googlewebmastercentral.blogspot.co.nz/2015/02/finding-more-mobile-friendly-search.html
Utils
https://www.google.com/webmasters/tools/mobile-friendly/
Pero hay más avisos
Algunas aplicaciones y sitios web utilizan OpenID 2.0 para la autenticación al iniciar sesión y para acceder a los datos a los que hayas concedido permiso de acceso. OpenID 2.0 se ha sustituido por OpenID Connect. A partir 20 de abril de 2015, OpenID 2.0 dejará de estar disponible para Cuentas de Google.
viernes, 6 de marzo de 2015
Nombre de una propiedad
Vale odio ver en el código: dependencias con el contenido de un string. Me desespera.
Siempre que puedo uso enumerados constantes.. y esta vez no sería diferente.
Quería conocer en cadena el nombre de una propiedad
Es decir miobj.DNI Obtener "DNI"
Imports System.Linq.Expressions
Private Sub Prueba(sender As System.Object, e As System.EventArgs)
Dim miobj As miClase = New miClase() With {.DNI = "numero pasaporte", .Nombre = "mi nombre completo"}
Dim nombrePropiedad As String = GetPropertyName(Function() miobj.DNI)
Console.Write(nombrePropiedad) 'DNI
Dim nombrePropiedad2 As String = GetPropertyNameB(Function(myObj As miClase) myObj.Nombre)
Console.Write(nombrePropiedad2) 'Nombre
End Sub
Public Shared Function GetPropertyName(Of T)(ByVal expression As Expressions.Expression(Of Func(Of T))) As String
Dim memberExpression As Expressions.MemberExpression = DirectCast(expression.Body, Expressions.MemberExpression)
Return memberExpression.Member.Name
End Function
Public Function GetPropertyNameB(Of TModel, TProperty)(ByVal [property] As Expression(Of Func(Of TModel, TProperty))) As String
Dim memberExpression As MemberExpression = DirectCast([property].Body, MemberExpression)
Return memberExpression.Member.Name
End Function
End Class
Public Class miClase
Private _dni As String
Private _nombre As String
Public Property DNI() As String
Get
Return _dni
End Get
Set(ByVal value As String)
_dni = value
End Set
End Property
Public Property Nombre() As String
Get
Return _nombre
End Get
Set(ByVal value As String)
_nombre = value
End Set
End Property
End Class
El ejemplo es mío, pero la solución no.
http://stackoverflow.com/questions/10606841/how-can-i-get-a-property-name-for-a-type-without-the-need-to-instantiate-an-obje
http://www.codeproject.com/Questions/253756/Linq-Get-Property-Name-using-VB-Net
Vale en próxima versiones lo tendremos más fácil por lo menos en C# 6.0
https://roslyn.codeplex.com/discussions/552376
jueves, 26 de febrero de 2015
Atributos personalizados
Situación:
Tengo una dll con sus clases, métodos y acceso a base de datos (insertar, modificar y muestra por pantalla una determinada clase).Tengo que cambiar el acceso de base de datos por un acceso a un servicio web (que no hacemos nosotros)
El servicio web proporciona unos objetos que no se ajustan nuestras clases originales
Requisitos:
Que fuera una dll es significativo porque quiere decir que se usa por varias aplicaciones y por lo tanto la modificación de las clases debe tener el menor impacto posible .Solución:
- Para empezar duplique la dll existente cambiando el nombre al ensamblado
- Identifique los valores de nuestras tablas y propiedades con su correspondencia en el servicio web
- Quite el acceso a datos por las llamadas al servicio web
- Mi "problema" se complicó cuando comprobé que no sería todo tan sencillo:
- tendría aplicaciones que posiblemente hiciera consultas SQL a esas tablas (usando evidentemente el nombre de las columnas)
- El servicio web, me proporciona métodos para hacer la consultas, pero no pasando como parámetros un objeto sino lista de clave-valor , donde la calve era del tipo campo1,campo2.. (no me preguntéis porque esa codificación)
- A mis clases de entidad les añadí un atributo personalizado. Esto me permitía relacionar las tablas SQL con los parámetros del servicio web con un mínimo impacto.
Module miEjemplo
Public Sub Ejemplo()
Dim miSqlViejo = "select dni, nombre from personas "
For Each attribute As MiEntityAttribute In MiEntityAttribute.GetMiEntityAttribute(GetType(miClaseDecorada)).Values
If Not attribute Is Nothing Then
miSqlViejo = miSqlViejo.Replace(attribute.ColumnaOLD, attribute.ColumnaNew)
End If
Next
Console.Write(miSqlViejo) 'select dni_cif, nombreCompleto from personas
End Sub
Public Class miClaseDecorada
Private _dni As String
Private _nombre As String
<MiEntity("dni", "dni_cif")>
Public Property DNI() As String
Get
Return _dni
End Get
Set(ByVal value As String)
_dni = value
End Set
End Property
<MiEntity("nombre", "nombreCompleto")>
Public Property Nombre() As String
Get
Return _nombre
End Get
Set(ByVal value As String)
_nombre = value
End Set
End Property
End Class
''' <summary>
''' Atributos personales
''' </summary>
''' <remarks></remarks>
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False)>
Friend Class MiEntityAttribute
Inherits Attribute
Private _columnaBDOLD As String
Private _columnaBDnew As String
Public Sub New()
End Sub
Public Sub New(columnaBDOLD As String, columnaBDnew As String)
Me._columnaBDOLD = columnaBDOLD
_columnaBDnew = columnaBDnew
End Sub
''' <summary>
''' Nombre de la propiedad dentro de la base de datos vieja
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Overridable ReadOnly Property ColumnaOLD() As String
Get
Return _columnaBDOLD
End Get
End Property
''' <summary>
''' Nombre de la propiedad dentro de la base de datos nueva
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Overridable ReadOnly Property ColumnaNew() As String
Get
Return _columnaBDnew
End Get
End Property
Friend Shared Function GetMiEntityAttribute(ByVal ot As Type) As Dictionary(Of String, MiEntityAttribute)
Dim oret As Dictionary(Of String, MiEntityAttribute) = New Dictionary(Of String, MiEntityAttribute)
For Each propiedad As PropertyInfo In ot.GetProperties()
If propiedad.GetCustomAttributes(GetType(MiEntityAttribute), False).Any() Then
oret.Add(propiedad.Name, CType(propiedad.GetCustomAttributes(GetType(MiEntityAttribute), False)(0), MiEntityAttribute))
Else
oret.Add(propiedad.Name, Nothing)
End If
Next
Return oret
End Function
End Class
End Module
Por supuesto pensé en un método "tradicional" : funciones para convertir objetos, enumerados que mantengan la relaciones entre las distintas propiedades…Pero el uso de los atributos me parece que da una solución sencilla y fácil de mantener.
Supongo que los trabajan con MVC el tema de los atributos lo tienen más que superado. Pero si eres de asp o de aplicaciones de escritorio, esto te facilita la vida con poco esfuerzo.
Supongo que los trabajan con MVC el tema de los atributos lo tienen más que superado. Pero si eres de asp o de aplicaciones de escritorio, esto te facilita la vida con poco esfuerzo.
Otra solución con interfaces :http://blog.koalite.com/2015/03/interfaces-marcadoras-atributos-y-convenciones/
viernes, 13 de febrero de 2015
Formación
¿Estudias o trabajas? Bueno yo siempre contesto que la dos cosas, te dediques a lo que te dediques siempre hay que estar formándose. La informática no es una excepción.
Podríamos hablar de formación de en la empresa, pero si están en una consultora para un cliente, lo tendrás bastante mal.
Aquí un par de sugerencias , se hacen on-line, son gratis, en castellano.. el interés lo pones tú
http://www.microsoftvirtualacademy.com/
https://www.miriadax.net/
Y
http://www.openeducationeuropa.eu/es/find/moocs
Podríamos hablar de formación de en la empresa, pero si están en una consultora para un cliente, lo tendrás bastante mal.
Aquí un par de sugerencias , se hacen on-line, son gratis, en castellano.. el interés lo pones tú
http://www.microsoftvirtualacademy.com/
https://www.miriadax.net/
Y
http://www.openeducationeuropa.eu/es/find/moocs
viernes, 23 de enero de 2015
JavaScript en el lado del servidor !!!
Para un aproximación
http://www.nodebeginner.org/index-es.html
http://blog.koalite.com/2011/11/tutorial-node-js-express-jquery-i-creando-la-aplicacion/
Paso a paso ..
1. Para instarlo en un IIS
http://searchwindowsserver.techtarget.com/tip/How-to-successfully-install-Nodejs-applications-on-IIS
http://strongloop.com/strongblog/node-js-net-getting-started-part-two/
Con visual studio
http://blogs.msdn.com/b/esmsdn/archive/2014/09/11/c-243-mo-desarrollar-aplicaciones-de-node-js-en-visual-studio.aspx
Por que?
http://www.wintellect.com/blogs/jlane/five-reasons-asp.net-developers-shouldn%E2%80%99t-worry-about-node
viernes, 14 de noviembre de 2014
Curioseando Debugger
Bueno lo de hoy no lo sabía. Pero no está mal, sobre todo para facilitar el debugger y lo que se muestra son las etiquetas DebuggerStepThrough y DebuggerHidden
En una aplicación WindowsForm DebuggerStepThrough está en la parte del diseñador
Está bien porque eso evita que entres en la función aunque te equivoques de tecla, si tienes un punto de ruptura si entra.
He de decir que me parece que aquí lo explican super-bien
http://varionet.wordpress.com/2008/05/29/depurar-sin-complicarnos-la-vida-utilizando-debugging-attributes/
Pero como siempre.. no está demás verlo en el msdn
En una aplicación WindowsForm DebuggerStepThrough está en la parte del diseñador
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Está bien porque eso evita que entres en la función aunque te equivoques de tecla, si tienes un punto de ruptura si entra.
He de decir que me parece que aquí lo explican super-bien
http://varionet.wordpress.com/2008/05/29/depurar-sin-complicarnos-la-vida-utilizando-debugging-attributes/
Pero como siempre.. no está demás verlo en el msdn
Suscribirse a:
Entradas (Atom)