Estándares de Desarrollo en Microsoft NET - Luis Dueñas
-
Upload
tdadarksoul -
Category
Documents
-
view
171 -
download
23
Transcript of Estándares de Desarrollo en Microsoft NET - Luis Dueñas
Estándares de
Desarrollo en
Microsoft .NET
Por Luis Dueñas
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
INDICE
1. PATRÓN DE ARQUITECTURA DE APLICACIONES EN NET
1.1. Arquitectura de Aplicaciones
1.2. Lenguajes .NET
1.2.1. C#
1.2.2. Visual Basic
1.2.3. Diferencias entre Visual Basic y C# .NET
1.3. Instrucciones de Nomenclatura
1.3.1. Normas referentes al uso de minúsculas y mayúsculas
1.3.2. Convenciones Generales de Nomenclatura
1.3.3. Nombres de ensamblados y bibliotecas DLL
1.3.4. Nombres de espacios de nombres
1.3.5. Nombres de clases, estructuras e interfaces
1.3.6. Nombres de miembros de tipos
1.3.7. Nombres de parámetros
1.3.8. Nombres de recursos
1.4. Nombres de Controles
2. BUENAS PRÁCTICAS DE DESARROLLO DE APLICACIONES WEB EN NET
2.1. Diseño de Paginas
2.2. Manejo de Cadenas
2.3. Expresiones Lógicas
2.4. Manejo de Objetos
2.5. Cierre de Recursos
2.6. Manejo del Estado
2.7. Navegación entre Páginas
2.8. Uso de Controles de Servidor
2.9. Manejo de Errores
2.10. Acceso a Datos con ADO NET
2.11. Bases de Datos
2.12. Configuración de la Página
2.13. Configuración de la Aplicación
2.14. Minimizar Llamadas al Servidor Web
3. ARQUITECTURA DE BASE DE DATOS SQL SERVER
3.1. Consideraciones Generales
3.2. Nomenclatura
3.2.1. Base de Datos
3.2.2. Tabla
3.2.3. Columna
3.2.4. Índices
3.2.5. Restricciones
3.2.6. Vistas
3.2.7. Procedimientos Almacenados
3.2.8. Desencadenantes
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
1 PATRÓN DE ARQUITECTURA DE APLICACIONES EN NET
A continuación se describe la arquitectura de las aplicaciones a desarrollar usando el .NET Framework de Microsoft.
1.1 Arquitectura de Aplicaciones
Para todas las Aplicaciones creadas en .NET se usara el Modelo de Desarrollo Distribuido Orientado a Objetos (MDDOO) el cual consiste de los siguientes niveles de servicios lógicos: 1. Servicios de Usuario
1.1. Interfaces de Usuario: Aplicaciones Windows o Web, Librería de Controles, etc.
1.2. Servicios de Procesamiento de la Interface de Usuario: Librerías de Código. 2. Servicios de Negocios
2.1. Entidades del Negocio: Clases con Propiedades 2.2. Reglas del Negocio: Clases con Métodos
3. Servicios de Datos 3.1. Servicios de Acceso a Datos: Clases que acceden a la BD de Datos del
Negocio. 3.2. Agentes de Servicios: Clases que acceden a otras BDs, Servicios Web, APIs,
etc.
Arquitectura de Aplicaciones Web en .NET
IIS
Aplicación Web
Reglas del
Negocio
Base de Datos
I
N
T
R
A
N
E
T
Acceso a Datos
(ADO .NET)
Entidades
Negocio
Entidades
Negocio
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
1.2 Lenguajes .NET
Existen más de 30 Lenguajes .NET, de los cuales algunos le pertenecen a Microsoft como C#, Visual Basic, J#, C++ pero otros No, tales como: Phyton, Oberon, Cobol, etc. En general todos los lenguajes de alto nivel necesitan un compilador .NET y este creará un archivo Ensamblado .NET (Assembly) en Lenguaje de Nivel Intermedio Microsoft (MSIL) el cual es interceptado por el Compilador JIT del Common Language Runtime (CLR) y se creará un Assembly Nativo en Lenguaje de Bajo Nivel. El CLR ejecutará este código nativo para comunicarse con el sistema, por tanto la performance de la Aplicación la da el CLR y el Lenguaje solo representa la sintaxis de los desarrolladores para escribir el código .NET, que en su mayoría esta formado por llamadas a las Bibliotecas de Clases Bases (BCL), el Lenguaje es una mínima parte del código. En general, se elige un Lenguaje .NET de acuerdo a la comodidad que sienta cada programador, y también de acuerdo a su experiencia, a continuación algunos directivas para elegir entre C# y Visual Basic .NET:
1.2.1 C#
Este Lenguaje es muy parecido a C y Java, y debe ser usado por personas que tengan conocimiento cualquiera de los 2.
1.2.2 Visual Basic
Este Lenguaje es parecido a Visual Basic 6 y se recomienda que lo usen los desarrolladores que hayan trabajado con Visual Basic 3, 4, 5, o 6, Visual Foxpro, Power Builder o cualquiera que use un Lenguaje Conducido por Eventos.
1.2.3 Diferencias entre Visual Basic y C# .NET
En general, las diferencias entre Visual Basic y C# .NET son:
Sensitivo a mayúsculas y minúsculas C# es sensitivo al tipo de escritura con mayúsculas y minúsculas, en cambio Visual Basic .NET no lo es.
Declaración de variables y asignación de valores En Visual Basic las variables son declaradas antes del tipo de dato, en C# es al revés la variable precede al tipo de dato.
Visual Basic .NET Visual C# .NET
Dim i, j As Integer int i, j;
Dim i As Integer = 7 int i = 7;
Dim i(6) As Integer or Dim i() As Integer = New Integer(6) {}
int[] i = new int[6];
Dim con As SqlConnection SqlConnection con;
Dim x As New Y("ABC") or Dim x As Y = New Y("ABC")
Y x = new Y("ABC");
Tipos de datos
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
El .NET Framework tiene sus tipos de datos base, pero cada Lenguaje le da un nombre distinto, a continuación una tabla con la equivalencia:
Visual Basic .NET Visual C# .NET .NET Framework
Boolean Bool System.Boolean
Byte Byte System.Byte
Short Short System.Int16
Integer Int System.Int32
Long Long System.Int64
Single Float System.Single
Double Double System.Double
Decimal Decimal System.Decimal
Date System.DateTime System.DateTime
String String System.String
Char Char System.Char
Object Object System.Object
n/a Sbyte System.Sbyte
n/a Ushort System.UInt16
n/a Uint System.UInt32
n/a Ulong System.UInt64
Fin de instrucción En Visual Basic las instrucciones terminan al final de la linea, si se desea continuar en la siguiente línea se usa el espacio en blanco seguido de un guión bajo ( _), en C# las instrucciones terminan en punto y coma (;)
Visual Basic .NET Visual C# .NET
A = 5 B = 7 : C = 8 MySub (Arg1, _ Arg2, _ Arg3)
A = 5; B = 7; C = 8; MySub (Arg1, Arg2, Arg3);
Bloques de instrucciones En Visual Basic No hay palabras clave para los bloques de instrucciones sino cada instrucción puede cerrar su bloque, tal como If – End If, For – Next, Do – Loop, etc. En cambio en C# los bloques de instrucciones se escriben entre llaves ({}).
Visual Basic .NET Visual C# .NET
If A = 5 Then DoSomething() DoSomethingAgain()
If (a == 5) { DoSomething();
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
End If DoSomethingAgain(); } or if (a == 5) DoSomething(); DoSomethingAgain();
Uso de () Vs [] Visual Basic usa los () para delimitar los elementos de los arreglos, argumentos de funciones e índices de propiedades, mientras que C# usa () solo para delimitar argumentos de funciones. Visual C# .NET usa [] para delimitar los elementos de los arreglos e índices de las propiedades.
Propósito Visual Basic .NET Visual C# .NET
Declarar un arreglo Dim a() As Long Dim a(3, 5) as Integer
int[] x = new int[5];
Inicializar an arreglo Dim a() As Long = {3, 4, 5} int[] x = new int[5] {1, 2, 3, 4, 5};
Reubicar un arreglo Redim n/a
Argumentos de Funciones X= A(5) MySub (A, B, C)
MySub(A, B, C);
Indices de Propiedades Y = MyDataSet.Tables_ ("Author").Rows(5)._ Columns("AuthorID")
Y = MyDataSet.Tables ["Author"].Rows[5].Columns["AuthorID"]
Operadores Los operadores son usados en Visual Basic .NET en forma distinta que en C#, a continuación las principales diferencias:
Operador Visual Basic .NET Visual C# .NET
Aditivos
Adición + +
Substracción - -
Multiplicativos
Multiplicación * *
División / /
División entera \ / (depending on the operands)
Modulo (retornando de la
división solo el residuo)
Mod %
Exponentiation ^ n/a
Asignación
Asignación = += -= *= /*
= += -= *= /*
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Operador Visual Basic .NET Visual C# .NET
División entera \= /= (depending on the operands)
Concatenar &= +=
Modulo n/a %=
Desplazamiento izquierda n/a <<=
Desplazamiento derecha n/a >>=
AND n/a &=
XOR n/a ^=
OR n/a |=
Relacional e igualdad
Menor que < <
Menoe o igual que <= <=
Mayor que > >
Mayor o igual que >= >=
Igual = ==
Diferente <> !=
Compara 2 objetos o
variables por referencia
Is ==
Compara objetos de tipo
por reference
TypeOf x Is Class1 x is Class1
Comparar cadenas = == or String.Equals()
Concatenar cadenzas & +
Corto circuito AND AndAlso &&
Corto circuito OR OrElse ||
Desplazamiento
Desplazamiento izquierda n/a <<
Desplazamiento derecha n/a >>
Resolución de alcance
Resolución de alcance . ., base
Sufijos
Conversión de tipos Cint, CDbl, …, CType (type)
Selección de miembros . .
Sufijo incremento n/a ++
Sufijo decremento n/a --
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Operador Visual Basic .NET Visual C# .NET
Unarios
Indirección n/a * (unsafe mode only)
Dirección de AddressOf & (unsafe mode only)
Logico NOT Not !
Complemento Not ~
Prefijo incremento n/a ++
Prefijo decremento n/a --
Tamaño de Tipo n/a sizeof
Bits
Bit a Bit NOT Not ~
Bit a Bit AND And &
Bit a Bit XOR Xor ^
Bit a Bit OR Or |
Logicos
AND And &&
OR Or ||
Condicional
Condicional IIf ?:
Puntero a miembro
Puntero a miembro n/a . (Unsafe mode only)
Instrucciones condicionales
Instrucciones
condicionales
Visual Basic .NET Visual C# .NET
Estructura de decision:
Selección
Select Case …, Case, Case Else, End Select
switch, case, default,
Estructura de decisión: Si
Entonces
If … Then, ElseIf … Then, Else, End If
if, else
Estructura de bucle:
Condicional
While… End While, Do [While, Until] …, Loop [While, Until]
do, while, continue
Estructura de bucle:
Iteración
For …, [Exit For,] Next For Each …, [Exit For,] Next
for, foreach
Estructuras de control de
flujo
Exit, GoTo, Stop, End, Return,
break, continue, goto, return, throw
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Manejo de Errores Visual Basic .NET tiene compatibilidad hacia atrás con Visual Basic por lo cual puede manejar errores no estructurados, como también maneja errores estructurados, en cambio C# solo maneja errores en forma estructurada.
Propósito Visual Basic .NET Visual C# .NET
Manejar errors
estructurados
Try … Catch … Finally … End Try
try, catch, finally, throw
Manejar errores no
estructurados
On Error GoTo … On Error Resume Next
n/a
Paso de parámetros Visual Basic .NET usa la instrucción ByVal para pasar los parámetros por valor y ByRef para pasarlos por referencia. Visual Basic .NET también usa parámetros opcionales los cuales no existen en C#.
Propósito Visual Basic .NET Visual C# .NET
Paso por valor Public Sub ABC (ByVal y As Long) … End Sub ABC(x) ABC((x))
void ABC(int x) { ... } ABC(i);
Paso por referencia Public Sub ABC(ByRef y As Long) … End Sub ABC(x)
void ABC(ref int x) { ... } ABC(ref i);
Parámetro opcional Soportado n/a
Palabras clave A continuación se muestra una table con las diferencias entre las palabras clave en cada lenguaje:
Propósito Visual Basic .NET Visual C# .NET
Programando Orientado
a Objetos
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Propósito Visual Basic .NET Visual C# .NET
Constructor de clase Public Class Class1 Public Sub New(..) MyBase.New … End Sub … End Class
Note: You have to call the
base class constructor
explicitly in Visual Basic
.NET.
public class Class1 { public Class1(..) { … } …. } Note: The call to the base class constructor (base()) is generated automatically by the compiler in Visual C# .NET if you do not include constructor initializers.
Destructor de clase
Nota: El método
Destructor o Finalize es
llamado por el Garbage
Collector.
Protected Overrides Sub Finalize() m_Gadget = Nothing m_Gear = Nothing MyBase.Finalize() End Sub
public class Class1 { public ~Class1() { …. } }
Declarar una clase Class class
Herencia de clase Public Class A Inherits B … End Class
public class A : B { … }
Clase puede ser solo
heredada y no puede ser
instanciada
MustInherit abstract
Clase no puede ser
heredada
NotInheritable sealed
Llamar tu propia
implementación del
método en vez de anular el
método en la clase
derivada
MyClass None
Referirse a la clase base
desde la clase derivada
MyBase base
Declarar una seguridad de
tipo referente al método de
una clase
Delegate delegate
Indicar que el método o la
propiedad sobre escribe la
implementación en esta
clase base
Overrides override
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Propósito Visual Basic .NET Visual C# .NET
Indicar que éstos métodos
no tienen implementación
y deberían ser
implementados en la clase
derivada
MustOverride (in MustInherit class)
abstract (in abstract class)
Indicar que el método o la
propiedad no puede ser
anulada en la clase
derivada
NotOverridable Note: By default, methods are not overridable.
sealed
Indicar que el método o la
propiedad puede ser
anulada en una clase
heredada
Overridable virtual
Sobre cargar un
procedimiento, una
función, o un método
Overloads None. Define functions with same name but different signatures.
Especificar que una
variable puede contener un
objeto cuyo evento quieres
manejar
WithEvents No specific keyword
Especificar los eventos
para los cuales un
procedimiento de evento
puede ser llamado
Handles (Event procedures can still be associated with a WithEvents variable by naming pattern.)
n/a
Evaluar una expresión
objeto una vez para
acceder a múltiples
miembros
With objExpr <.member> <.member> End With
n/a
Referirse al objeto actual Me This
Declarar un tipo
enumerado
Enum … End Enum
Enum
Declarar una interface Interface interface
Implementar una interface Implements class C1 : I1
Indicar un indice Default Property public string this[int index] { get {return List[index];} set {List[index]=value;} }
Modificadores de acceso
a clases
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Propósito Visual Basic .NET Visual C# .NET
Indica que el modificador
es accesible fuera del
proyecto o el ensamblado
Public public
Indica que el modificador
es accesible solo dentro
del ensamblado
Friend internal
Indica que el modificador
es accesible solo en el
proyecto (para clases
anidadas, en la clase
adjunta)
Private private
Modificadores de acceso
a miembros de clases
Indica que el modificador
es accesible fuera de la
clase y el proyecto
Public public
Indica que el modificador
es accesible fuera de la
clase pero dentro del
proyecto
Friend internal
Indica que el modificador
es solo accesible en una
clase o modulo
Private private
Indica que el modificador
es solo accesible a la clase
actual y la derivada
Protected protected
Indica la unión del
Protected y Friend o
Internal
Protected Friend protected internal
Indica que los miembros
son compartidos a través
de todas las instancias
Shared static
Tiempo de Vida
Preserva la variable local
para el procedimiento
Static n/a
Otros
Llamar a las APIs de
Windows
Declare statement use Platform Invoke
Indicar un comentario ‘, Rem //, /* */ for miltine comments, /// for XML comments
Indicar una constant Const Const, readonly
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Propósito Visual Basic .NET Visual C# .NET
Crear un nuevo objeto New, CreateObject new
Declarar una función o un
método sin valor de
retorno
Sub void
Declarar que un objeto
puede ser modificado
asíncronamente
n/a volatile
Declarar una variable Private, Public, Friend, Protected, Static, Shared, Dim
declarators (keywords include user-defined types and built-in types)
Declarar una variable
explicitamente
Option Explicit None (All variables must be declared before use)
Declarar y llamar un
evento
Event, RaiseEvent event
Declarar una estructura Structure … End Structure
struct
Definir una propiedad por
defecto
Default by using indexers
Declarar un objeto nulo Nothing null
Declarar un namespace Namespace … End Namespace
Namespace { … }
Indicar uso de namespace Imports using
Recuperar un caractér de
una cadena
GetChar Function [ ]
Retornar la dirección de
una función
AddressOf (For class members, this operator returns a reference to a function in the form of a delegate instance)
delegate
Probar un objeto nulo Obj Is Nothing obj == null
Probar una expression
nula de base de datos
IsDbNull n/a
Primitivas de subprocesos SyncLock lock
1.3 Instrucciones de Nomenclatura
Las instrucciones de nomenclatura proporcionan indicaciones para seleccionar identificadores adecuados para los elementos que conforman las bibliotecas de clases, entre los que se incluyen ensamblados, espacios de nombres, tipos, miembros y parámetros. Elegir identificadores que siguen estas instrucciones mejora la utilidad de
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
su biblioteca e invita a los usuarios a confiar en que su biblioteca no requerirá el aprendizaje de un nuevo conjunto de convenciones.
Para proporcionar una experiencia de desarrollador coherente, estas instrucciones son necesarias para los elementos públicamente expuestos, como por ejemplo clases públicas y métodos protegidos. Sin embargo, por coherencia en todo su código y un mantenimiento mejorado, debería considerar utilizar estas convenciones de forma coherente en todo el código.
1.3.1 Normas referentes al uso de minúsculas y mayúsculas
Muchas de las convenciones de nomenclatura pertenecen al uso de mayúsculas y minúsculas en los identificadores. Es importante tener en cuenta que el CLR admite los lenguajes con distinción entre mayúsculas y minúsculas y sin distinción de ellas. Las convenciones del uso de mayúsculas y minúsculas explicadas en este tema facilitan a los desarrolladores la comprensión y el trabajo de la biblioteca.
Estilos de grafía
Las condiciones siguientes describen distintas maneras de usar mayúsculas y minúsculas de los identificadores.
1. Grafía Pascal La primera letra del identificador y la primera letra de las siguientes palabras concatenadas están en mayúsculas. El estilo de mayúsculas y minúsculas Pascal se puede utilizar en identificadores de tres o más caracteres. Por ejemplo:
BackColor
2. Grafía Camel La primera letra del identificador está en minúscula y la primera letra de las siguientes palabras concatenadas en mayúscula. Por ejemplo:
backColor
3. Mayúsculas Todas las letras del identificador van en mayúsculas. Por ejemplo:
IO
Reglas de uso de mayúsculas y minúsculas para los identificadores
Cuando un identificador está compuesto de varias palabras, no utilice separadores, como guiones de subrayado ("_") ni guiones ("-"), entre las palabras. En su lugar, utilice la grafía para señalar el principio de cada palabra.
Las instrucciones siguientes proporcionan reglas generales para los identificadores.
Utilice la grafía Pascal para todos los nombres de miembros públicos, tipos y espacios de nombres que constan de varias palabras.
Tenga en cuenta que esta regla no se aplica a las instancias de campos. Por los motivos que se detallan en Instrucciones de diseño de miembros, no debería utilizar campos de instancia públicos.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Utilice el uso combinado de mayúsculas y minúsculas tipo Camel para los nombres de parámetros.
En la tabla siguiente se resumen las reglas de uso de mayúsculas y minúsculas para los identificadores y se proporcionan ejemplos de los diferentes tipos de identificadores.
Identificador Uso de mayúsculas o minúsculas Ejemplo
Clase Pascal AppDomain
Tipo de enumeración Pascal ErrorLevel
Valores de enumeración Pascal FatalError
Evento Pascal ValueChanged
Clase de excepción Pascal WebException
Campo estático de sólo lectura Pascal RedValue
Interfaz Pascal IDisposable
Método Pascal ToString
Espacio de nombres Pascal System.Drawing
Parámetro Camel typeName
Propiedad Pascal BackColor
Reglas de uso de mayúsculas para los acrónimos
Un acrónimo es una palabra formada a partir de las letras de las palabras de un término o frase. Por ejemplo, HTML es un acrónimo de Hypertext Markup Language (lenguaje de marcado de hipertexto). Sólo debería incluir acrónimos en identificadores cuando son muy conocidos y están bien entendidos. Los acrónimos se diferencian de las abreviaturas en que una abreviatura acorta una sola palabra. Por ejemplo, ID es una abreviatura de identifier. En general, los nombres de biblioteca no deberían utilizar las abreviaturas.
Nota
Las dos abreviaturas que se pueden utilizar en los identificadores son ID y OK. En identificadores con grafía Pascal, deberían aparecer como Id y Ok. Si se utilizan como la primera palabra de un identificador con grafía tipo Camel, deberían aparecer como id y ok, respectivamente.
La grafía de los acrónimos depende de la longitud del acrónimo. Todos los acrónimos tienen al menos dos caracteres de longitud. A efectos de estas instrucciones, si un acrónimo tiene exactamente dos caracteres, se considera como acrónimo corto. Un acrónimo de tres o más caracteres es un acrónimo largo.
Las instrucciones siguientes especifican la grafía apropiada para los acrónimos cortos y los largos. Las reglas de grafía de identificadores tienen prioridad sobre las reglas de grafía de acrónimos.
Ponga en mayúsculas ambos caracteres de los acrónimos de dos caracteres, excepto cuando se trata de la primera palabra de un identificador con grafía tipo Camel.
Una propiedad denominada DBRate es un ejemplo de un acrónimo corto (DB) utilizado como la primera palabra de un identificador con grafía Pascal. Un parámetro denominado ioChannel es un ejemplo de un acrónimo corto (IO) utilizado como la primera palabra de un identificador con grafía Camel.
Ponga en mayúsculas sólo el primer carácter de los acrónimos con tres o más caracteres, excepto si es la primera palabra de un identificador con grafía Camel.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Una clase denominada XmlWriter es un ejemplo de un acrónimo largo utilizado como la primera palabra de un identificador con grafía Camel. Un parámetro denominado htmlReader es un ejemplo de un acrónimo largo utilizado como la primera palabra de un identificador con grafía Camel.
No ponga en mayúsculas ninguno de los caracteres de los acrónimos, independientemente de su longitud, al principio de un identificador con grafía Camel.
Un parámetro denominado xmlStream es un ejemplo de un acrónimo largo (xml) utilizado como la primera palabra de un identificador con grafía Camel. Un parámetro denominado dbServerName es un ejemplo de un acrónimo corto (db) utilizado como la primera palabra de un identificador con grafía Camel.
Reglas de uso de mayúsculas para palabras compuestas y términos comunes
No ponga en mayúsculas todas las palabras en las denominadas palabras compuestas con formato cerrado. Éstas son palabras compuestas escritas como una sola palabra, como por ejemplo "endpoint".
Por ejemplo, hashtable es una palabra compuesta con formato cerrado que se debería tratar como una sola palabra y se debería utilizar la grafía correspondiente. En la grafía Pascal, es Hashtable; mientras que en la grafía Camel, es hashtable. Para determinar si una palabra es una palabra compuesta con formato cerrado, compruebe un diccionario actualizado.
La lista siguiente identifica algunos términos comunes que no son palabras compuestas con formato cerrado. La palabra se muestra en la grafía Pascal seguida por el formato de grafía Camel entre paréntesis.
BitFlag (bitFlag)
FileName (fileName)
LogOff (logOff)
LogOn (logOn)
SignIn (signIn)
SignOut (signOut)
UserName (userName)
WhiteSpace (whiteSpace)
Distinguir mayúsculas de minúsculas
Las instrucciones del uso de mayúsculas solamente se utilizan para facilitar la lectura y el reconocimiento de los identificadores. La grafía no se puede utilizar como medio para evitar que se produzcan colisiones entre los elementos de biblioteca.
No dé por supuesto que todos los lenguajes de programación distinguen entre mayúsculas y minúsculas. No es así. Los nombres no se pueden diferenciar exclusivamente por su grafía.
1.3.2 Convenciones Generales de Nomenclatura
Las convenciones generales de nomenclatura explican la elección de los nombres más adecuados para los elementos de sus bibliotecas. Estas instrucciones se aplican a
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
todos los identificadores. Las secciones posteriores tratan la nomenclatura de elementos concretos, como espacios de nombres o propiedades.
Elección de palabra
Elija los nombres fácilmente legibles para los identificadores. Por ejemplo, una propiedad denominada HorizontalAlignment es más legible en inglés que AlignmentHorizontal.
Es preferible la legibilidad a la brevedad. El nombre de propiedad CanScrollHorizontally es mejor que ScrollableX (una referencia oculta al eje X).
No utilice guiones de subrayado, guiones ni ningún otro carácter no alfanumérico.
No utilice la notación húngara.
La notación húngara consiste en incluir un prefijo en los identificadores para codificar ciertos metadatos sobre el parámetro, como puede ser el tipo de datos del identificador.
Evite utilizar identificadores que están en conflicto con palabras clave de lenguajes de programación ampliamente utilizados.
Aunque los lenguajes compatibles con CLS deben proporcionar una manera de utilizar palabras clave como palabras normales, los procedimientos recomendados indican que no debería obligar a los desarrolladores a saber cómo hacerlo. Para la mayoría de los lenguajes de programación, la documentación de la referencia del lenguaje contiene una lista de las palabras clave utilizada por los lenguajes.
Abreviaturas y acrónimos
En general, no debería utilizar abreviaturas ni acrónimos. Estos elementos hacen que los nombres sean menos legibles. De igual forma, es difícil saber cuándo es seguro suponer que un acrónimo es ampliamente reconocido.
Para las reglas de uso de mayúsculas para las abreviaturas, vea Reglas de uso de mayúsculas para los acrónimos.
No utilice abreviaturas ni contracciones como parte de nombres de identificadores.
Por ejemplo, use OnButtonClick en lugar de OnBtnClick.
No utilice cualquier ningún acrónimo que no esté ampliamente aceptado y, además, sólo cuando necesario.
Nombres específicos de lenguajes
Para los nombres de tipos, utilice nombres con interés semántico en lugar de palabras clave específicas de lenguaje. Por ejemplo, GetLength es mejor nombre que GetInt.
Utilice nombres de tipos de CLR en lugar de nombres específicos de lenguaje, en los pocos casos en los que un identificador no tiene ningún significado semántico más allá de su tipo.
Por ejemplo, un método que convierte los datos en Int16 se debería denominar ToInt16, no ToShort porque Short es el nombre de tipo específico de lenguaje para Int16.
La tabla siguiente muestra los nombres de tipo específicos de lenguaje para los lenguajes de programación más comunes y sus homólogos de CLR.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Nombre de tipo C#
Nombre de tipo Visual Basic
Nombre de tipo JScript
Representación Ilasm.exe
Nombre de tipo de CLR
sbyte SByte sByte int8 SByte
byte Byte byte unsigned int8 Byte
short Short short int16 Int16
ushort UInt16 ushort unsigned int16 UInt16
int Integer int int32 Int32
uint UInt32 uint unsigned int32 UInt32
long Long long int64 Int64
ulong UInt64 ulong unsigned int64 UInt64
float Single float float32 Single
double Double double float64 Double
bool Boolean boolean bool Boolean
char Char char char Char
string String string string String
object Object object
Utilice un nombre común, como un valor o elemento, en lugar de repetir el nombre de tipo en los raros casos en los que un identificador no tenga significado semántico y el tipo del parámetro no sea importante.
1.3.3 Nombres de ensamblados y bibliotecas DLL
En la mayoría de los escenarios, un ensamblado contiene toda una biblioteca reutilizable o parte de ella y está contenido en una única biblioteca de vínculos dinámicos (DLL). Un ensamblado se puede dividir entre varios archivos DLL pero esto es un caso muy raro y no es el objetivo de esta instrucción.
Si los ensamblados y archivos DLL son la organización física de una biblioteca, los espacios de nombres son una organización lógica y deben generarse independientemente de la organización del ensamblado. Los espacios de nombres pueden extenderse por varios ensamblados y a menudo lo hacen.
Elija nombres para las bibliotecas DLL de su ensamblado que sugieran grandes fragmentos de funcionalidad como System.Data. No es necesario que los nombres de ensamblado y de DLL correspondan a los nombres de espacios de nombres, pero es razonable seguir el nombre del espacio de nombres al decidir las denominaciones de los ensamblados.
Considere asignar nombres a los archivos DLL según el modelo siguiente:
<Company>.<Component>.dll
Donde <Component> contiene una o más cláusulas separadas por puntos.
Por ejemplo, Contoso.WebControls.dll.
1.3.4 Nombres de espacios de nombres
El nombre elegido para un espacio de nombres debería indicar la funcionalidad que proporcionan los tipos incluidos en el espacio de nombres. Por ejemplo, el espacio de nombres System.Net.Sockets contiene tipos que permiten a los desarrolladores utilizar sockets para realizar comunicaciones a través de las redes.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
El formato general para un nombre de espacio de nombres es como se explica a continuación:
<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
Por ejemplo, Microsoft.WindowsMobile.DirectX.
Prefije los nombres de espacios de nombres con un nombre de compañía para evitar que los espacios de nombres de distintas compañías tengan los mismos nombres y prefijos.
Utilice un nombre de producto estable, independiente de la versión, en el segundo nivel de un nombre de espacio de nombres.
No utilice las jerarquías de organización como base para los nombres usados en jerarquías de espacios de nombres, ya que los nombres de grupo dentro de las corporaciones tienen tendencia a que su duración sea limitada.
El nombre de los espacios de nombres es un identificador de larga duración que no varía. Con la evolución de las organizaciones, los cambios no deberían hacer que quedara obsoleto el nombre del espacio de nombres.
Utilice la grafía Pascal y separe los componentes del espacio de nombres con puntos (por ejemplo, Microsoft.Office.PowerPoint). Si su marca utiliza una grafía no tradicional, debería seguir la grafía definida por su marca, incluso aunque no sea exactamente igual que la grafía usual de los espacios de nombres.
Considere utilizar nombres plurales para los espacios de nombres cuando sea adecuado. Por ejemplo, utilice System.Collections en lugar de System.Collection. Sin embargo, los nombres de marcas y acrónimos son excepciones a esta regla. Por ejemplo, utilice System.IO en vez de System.IOs.
No utilice el mismo nombre para un espacio de nombres y un tipo incluido en ese espacio de nombres. Por ejemplo, no utilice Debug para un nombre de espacio de nombres y proporcione en el mismo espacio de nombres una clase denominada Debug. Algunos compiladores requieren que los nombres de dichos tipos sean completos.
Conflictos de espacios de nombres y nombres de tipos
Si elige un nombre de espacio de nombres o de tipo que está en conflicto con un nombre existente, los usuarios de la biblioteca deberán utilizar referencias completas a los elementos afectados. Éste no debería ser el caso en la mayoría de los escenarios de desarrollo.
Algunas de las instrucciones presentadas en esta sección son pertinentes para las siguientes categorías de espacios de nombres:
Espacios de nombres de modelo de aplicación Espacios de nombres de infraestructura Espacios de nombres básicos Grupos de espacios de nombres de tecnología
Los espacios de nombres de un modelo de aplicación proporcionan el conjunto de funcionalidad específico para una clase de aplicaciones. Por ejemplo, los tipos incluidos en los espacios de nombres System.Windows.Forms proporcionan la funcionalidad necesaria para escribir aplicaciones cliente de formularios Windows Forms. Los tipos incluidos en los espacios de nombres System.Web admiten la escritura de aplicaciones de servidor basadas en Web. En general, en la misma aplicación no se utilizan espacios de nombres de distintos modelos de aplicación, por
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
lo que es menos probable que los desarrolladores que usan su biblioteca se vean afectados por conflictos de nombres.
Las aplicaciones de la infraestructura proporcionan compatibilidad especializada y raramente se hace referencia a ellas en el código de los programas. Por ejemplo, las herramientas de desarrollo de programas utilizan los tipos incluidos en los espacios de nombres *.Designer. Los espacios de nombres *.Permissions son otro ejemplo de espacios de nombres de la infraestructura. No es probable que los conflictos de nombres con los tipos de los espacios de nombres de la infraestructura afecten a los desarrolladores que utilizan su biblioteca.
Los espacios de nombres básicos son los espacios de nombres System.* (excepto los espacios de nombres de la aplicación y de la infraestructura). System y System.Text son ejemplos de espacios de nombres básicos. Debería hacer todo lo posible para evitar conflictos de nombres con los tipos incluidos en los espacios de nombres básicos.
Los espacios de nombres pertenecientes a una tecnología determinada tendrán los mismos identificadores de primer y segundo nivel (Company.technology.*). Debe evitar la existencia conflictos de nombres dentro de una tecnología.
Instrucciones generales para los espacios de nombres
No introduzca nombres de tipos genéricos como Element, Node, Log y Message. Hay una probabilidad muy alta de que provocaría conflictos de nombres de tipos en los escenarios comunes. Debería calificar los nombres de tipos genéricos (FormElement, XMLNode EventLog, SoapMessage).
Instrucciones para los espacios de nombres de la aplicación
No asigne el mismo nombre a los tipos incluidos en espacios de nombres dentro de un único modelo de aplicación.
Por ejemplo, si estuviera escribiendo una biblioteca de controles especiales para que la utilizaran desarrolladores de aplicaciones de Windows Forms, no debería introducir un tipo denominado Checkbox porque ya existe un tipo con este nombre para el modelo de aplicaciones (CheckBox).
Instrucciones para el espacio de nombres básico
No proporcione nombres de tipos que entrarían en conflicto con los de cualquier tipo de los espacios de nombres básicos.
Por ejemplo, no utilice Directory como nombre de tipo porque entraría en conflicto con el tipo Directory.
Instrucciones para el espacio de nombres de tecnología
No asigne nombres de tipos que estarían en conflicto con otros tipos incluidos en una única tecnología.
No introduzca conflictos de nombres de tipos entre los tipos incluidos en los espacios de nombres de tecnología y un espacio de nombres de modelo de aplicación (a menos que la tecnología no esté pensada para ser usada con el modelo de aplicaciones).
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
1.3.5 Nombres de clases, estructuras e interfaces
En general, los nombres de tipo deberían ser sintagmas nominales, donde el nombre es la entidad representada por el tipo. Por ejemplo, Button, Stack y File tienen nombres que identifican la entidad representada por el tipo. Elija nombres que identifican la entidad desde el punto de vista del desarrollador; los nombres deberían reflejar escenarios de uso.
Las instrucciones siguientes se aplican a la selección de nombres de tipo.
Denomine las clases, interfaces y tipos de valor con nombres, sintagmas nominales o, en ocasiones, con sintagmas adjetivales, utilizando la grafía Pascal.
No utilice prefijos para los nombres de clases (como la letra C).
Las interfaces, que deberían comenzar con la letra I, son la excepción a esta regla.
Considere finalizar los nombres de las clases derivadas con el nombre de la clase base.
Por ejemplo, los tipos del marco de trabajo que heredan de Stream terminan con Stream y tipos que heredan de Exception finalizan con Exception.
Incluya para los nombres de interfaz el prefijo de la letra I para indicar que el tipo es una interfaz.
Asegúrese de que, al definir un par clase-interfaz en el que la clase es una implementación estándar de la interfaz, los nombres sólo se diferencian en el prefijo de la letra I usado en el nombre de la interfaz.
Por ejemplo, el marco de trabajo proporciona la interfaz IAsyncResult y la clase AsyncResult.
Nombres de parámetros de tipo genérico
Los genéricos son una nueva característica principal de la versión 2.0 de .NET Framework. Las instrucciones siguientes explican cómo seleccionar nombres correctos para los parámetros de tipo genérico.
Denomine los parámetros de tipo genérico con nombres descriptivos, a menos que un nombre de una sola letra sea autodescriptivo y usar un nombre descriptivo no agregue ningún valor.
IDictionary es un ejemplo de interfaz que sigue esta instrucción.
Considere la posibilidad de utilizar la letra T como el nombre del parámetro de tipo para los tipos cuyo parámetro de tipo sólo tiene una letra.
Prefije los nombres de parámetros de tipo descriptivos con la letra T.
Considere indicar en el nombre de parámetro las restricciones situadas en un parámetro de tipo. Por ejemplo, un parámetro restringido a ISession se puede denominar TSession.
Nombres de tipos comunes
Las instrucciones siguientes explican las convenciones de nomenclatura que ayudan a los desarrolladores a reconocer el escenario de uso previsto para determinadas clases. Cuando la instrucción se refiere a los tipos que heredan de algún otro tipo, esto se aplica a todos los herederos, no sólo a los tipos que heredan directamente. Por ejemplo, la instrucción "Agregue el sufijo Exception a los tipos que heredan de
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Exception." significa que cualquier tipo que tenga una excepción Exception en su jerarquía de herencia debería tener un nombre terminado en Exception.
Cada una de estas instrucciones también sirve para reservar el sufijo especificado; a menos que su tipo cumpla los criterios establecidos por la instrucción, no debería utilizar el sufijo. Por ejemplo, si su tipo no hereda directa o indirectamente de Exception, su nombre no debe terminar en Exception.
Agregue el sufijo Attribute a las clases de atributo personalizadas.
ObsoleteAttribute y AttributeUsageAttribute son nombres de tipo que siguen esta instrucción.
Agregue el sufijo EventHandler a los nombres de tipos que se utilizan en eventos (como tipos de valor devueltos de un evento de C#).
AssemblyLoadEventHandler es un nombre de delegado que sigue esta instrucción.
Agregue el sufijo Callback al nombre de un delegado que no sea un controlador de eventos.
No agregue el sufijo Delegate a un delegado.
Agregue el sufijo EventArgs a las clases que extienden System.EventArgs.
No derive de la clase System.Enum; utilice en su lugar la palabra clave admitida por el lenguaje usado. Por ejemplo, en C#, utilice la palabra clave enum.
Agregue el sufijo Exception a los tipos que heredan de System.Exception.
Agregue el sufijo Dictionary a los tipos que implementan System.Collections. IDictionary o System.Collections.Generic.IDictionary<TKey, TValue>. Tenga en cuenta que System. Collections. IDictionary es un tipo específico de colección, pero que esta instrucción tiene prioridad sobre la instrucción de colecciones más general especificada más adelante.
Agregue el sufijo Collection a tipos que implementan System.Collections.IEnumerable, System.Collections.ICollection, System.Collections.IList, System.Collections.Generic. IEnumerable<T>, System.Collections.Generic.ICollection<T> o System.Collections. Generic. IList<T>.
Agregue el sufijo Stream a los tipos que heredan de System.IO.Stream.
Agregue el sufijo Permission a los tipos que heredan de System.Security.CodeAccess Permission o implementan System.Security.IPermission.
Nombres de las enumeraciones
No utilice un prefijo en nombres de valor de enumeración. Por ejemplo, no utilice un prefijo como por ejemplo ad para las enumeraciones ADO, rtf para las enumeraciones de texto enriquecido, etc.
Esto también implica que no debería incluir el nombre de tipo de enumeración en los nombres de los valores de enumeración. El ejemplo de código siguiente explica la denominación incorrecta de los valores de una enumeración.
No utilice Enum como sufijo para los tipos de enumeración.
No agregue Flags como sufijo para los nombres de enumeraciones de indicadores.
Utilice un nombre singular para una enumeración, a menos que sus valores sean campos de bits.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Utilice un nombre plural para las enumeraciones que tienen campos de bits como valores, también denominados enumeraciones de indicadores.
1.3.6 Nombres de miembros de tipos
Los tipos contienen los tipos siguientes de miembros:
Métodos Propiedades Campos Eventos
Las instrucciones de esta sección ayudan a los diseñadores de bibliotecas de clases a seleccionar nombres para los miembros que sean coherentes con .NET Framework.
Nombres de métodos
Proporcione nombres de métodos que sean verbos o sintagmas verbales.
Normalmente los métodos actúan en datos, por lo que usar un verbo para describir la acción del método facilita a los desarrolladores la comprensión de lo que hace el método. Al definir la acción realizada por el método, tenga cuidado de seleccionar un nombre que proporciona claridad desde el punto de vista del desarrollador. No seleccione un verbo que describa cómo hace el método lo que hace; en otras palabras, no utilice detalles de implementación para el nombre del método.
Nombres de propiedades
Asigne nombres a las propiedades mediante un sustantivo, un sintagma nominal o un adjetivo.
Los sintagmas nominales o los adjetivos son adecuados para las propiedades porque éstas contienen datos.
No utilice propiedades que tengan los mismos nombres que los métodos Get.
Por ejemplo, no utilice un nombre de propiedad EmployeeRecord y denomine también un método GetEmployeeRecord. Los desarrolladores no sabrán qué miembro utilizar para conseguir su tarea de programación.
Denomine las propiedades booleanas con una frase afirmativa (CanSeek en lugar de CantSeek). Opcionalmente, también puede prefijar las propiedades booleanas con Is, Can o Has, pero sólo donde el prefijo aporte valor.
Considere la posibilidad de dar a una propiedad el mismo nombre que a su tipo.
Cuando se tiene una propiedad con establecimiento inflexible de tipos como enumeración, el nombre de la propiedad puede ser igual que el nombre de la enumeración. Por ejemplo, si tiene una enumeración denominada CacheLevel, una propiedad que devuelve uno de sus valores también se puede denominar CacheLevel.
Nombres de eventos
Denomine los eventos con un verbo o un sintagma verbal.
Asigne nombres de eventos a un concepto de antes y después, usando el tiempo presente y pasado. Por ejemplo, un evento de cierre que se inicie antes de que se cierre una ventana se podría llamar Closing y otro, llamado Closed, que se iniciara después de cerrarse la ventana.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
No utilice los prefijos o sufijos Before (antes) o After (después) para señalar eventos anteriores y posteriores.
Denomine los controladores de eventos (los delegados utilizados como tipos de eventos) con el sufijo EventHandler.
Utilice dos parámetros denominados sender (remitente) y e en las firmas del controlador de eventos.
El parámetro sender debería ser del tipo Object y el parámetro e una instancia de EventArgs o heredar de ella.
Denomine las clases de argumento de evento con el sufijo EventArgs.
Nombres de campos
Las instrucciones de nomenclatura de campos se aplican a los campos públicos estáticos y protegidos. No debería definir campos de instancia como públicos o protegidos. Para obtener más información, vea Diseño de campos.
Utilice la grafía Pascal para los nombres de campos.
Denomine los campos con nombres o sintagmas nominales.
No utilice prefijos en los nombres de campos. Por ejemplo, no utilice g_ o s_ para distinguir los campos estáticos de los no estáticos.
1.3.7 Nombres de parámetros
Elegir buenos nombres de parámetros puede mejorar significativamente la utilidad de su biblioteca. Un buen nombre de parámetro debería indicar los datos o la funcionalidad a los que afecta el parámetro.
Utilice la grafía tipo Camel en los nombres de parámetros.
Utilice nombres de parámetros descriptivos.
En la mayoría de los escenarios, el nombre del parámetro y su tipo debería ser suficiente para determinar el uso del parámetro.
Considere la posibilidad de utilizar nombres basados en el significado de un parámetro en lugar de los nombres basados en el tipo del parámetro.
En las herramientas de desarrollo y documentación, el tipo del parámetro está normalmente visible. Seleccionando un nombre que describe el uso o el significado del parámetro, se da a los desarrolladores información valiosa que les ayuda a identificar el miembro adecuado para su tarea y los datos correctos que pasar al miembro.
1.3.8 Nombres de recursos
Las instrucciones de este tema se aplican a los recursos traducibles como mensajes de error y textos de menú.
Utilice la grafía Pascal para las claves de recurso.
Proporcione identificadores descriptivos en lugar de cortos. Siempre que sea posible, mantenga su concisión, pero no sacrifique la confiabilidad.
No utilice palabras clave específicas de lenguaje de los lenguajes de programación de CLR.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Utilice sólo caracteres alfanuméricos y guiones de subrayado para nombrar los recursos.
Utilice el separador de punto (".") para anidar los identificadores con una jerarquía clara.
Por ejemplo, los nombres como Menus.FileMenu.Close.Text y Menus.FileMenu.Close.Color siguen a esta instrucción.
Utilice la convención de nomenclatura siguiente para los recursos de mensajes de excepción. El identificador de recursos debería estar formado por el nombre del tipo de excepción más un identificador corto de la excepción separado por un punto.
Por ejemplo, ArgumentException.BadEnumValue sigue esta instrucción.
1.4 Nombres de Controles
Para desarrollar aplicaciones Web en ASP .NET debemos tener en cuenta los nombres de los controles, ya sea Web o HTML, los cuales deben tener los siguientes prefijos:
Categoría Nombre del Control Prefijo a usar
Controles Web Estándar
Button btn
CheckBox chk
CheckBoxList cbl
DropDownList ddl
FileUpload fup
HiddenField hdf
HiperLink hlk
Image Img
ImageMap Imm
Label Lbl
ListBox lst
Literal lit
MultiView mvw
View vw
Panel pnl
PlaceHolder phd
RadioButton rbn
RadioButtonList rbl
Table tbl
TableRow tbr
TableCell tbc
TextBox txt
Controles Web de Datos
GridView gvw
ListView lvw
Repeater rpr
DataList dls
Controles Web de Validación
RequiredFiledValidator rfv
RangeValidator rgv
CompareValidator cpv
CustomValidator ctv
RegularExpressionValidator rev
ValidationSummary vsr
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Controles Web de Navegación
Menu mnu
TreeView tvw
SiteMapPath smp
Controles Web AJAX ScriptManager smg
UpdatePanel upn
UpdateProgress upg
Controles HTML División div
Regla Horizontal hbr
Imagen img
Input (Button) ibt
Input (Checkbox) icb
Input (File) ifl
Input (Hidden) ihd
Input (Password) ipw
Input (Radio) ird
Input (Reset) irs
Input (Submit) ism
Input (Text) itx
Selección sel
Tabla tbl
Area de Texto txa
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
2 BUENAS PRÁCTICAS DE DESARROLLO DE APLICACIONES WEB EN NET
Para crear Aplicaciones Web en .NET es necesario ciertas consideraciones para mejorar el rendimiento de las aplicaciones, las cuales mencionamos a continuación:
2.1 Diseño de Paginas
Usar tablas para organizar los controles de la página.
Usar Hojas de Estilo en Cascada (CSS) para cambiar el formato de un conjunto de controles que tiene la misma regla de diseño.
Para crear Fichas usar el MultiView con varios Views, al renderizar HTML solo se considera la Ficha actual (ActiviewIndex).
2.2 Manejo de Cadenas
Si se desea sumar (concatenar) solo 2 cadenas usar el + o &.
Si se va a realizar muchas concatenaciones usar un objeto de tipo System.Text.StringBuilder, este es mucho más eficiente en velocidad.
2.3 Expresiones Lógicas
Usar los operadores lógicos de corto circuito: AndAlso en vez de And y OrElse en vez de Or, ambos mejoran la rapidez con que se evaluá una expresión lógica al cortar sino se cumple una condición.
2.4 Manejo de Objetos
Hay varias formas de crear objetos, en lo posible No declarar variables públicas o privadas a nivel de pagina, tratar de que sean variables dinámicas para que sean liberadas.
Siempre declarar la variable antes de usarse (por ejemplo una línea antes) y no desde el inicio.
Nunca declarar variables dentro de un bucle, es preferible declararla fuera del bucle y asignarle el valor o crear la instancia (si es un objeto) dentro del bucle.
Es preferible usar tipos de datos especializados como los genéricos List Of, en vez de Arrays () o ArrayList.
2.5 Cierre de Recursos
Los recursos abiertos por el código, como por ejemplo conexiones a base de datos y archivos deben cerrarse explícitamente mediante el método close o automáticamente usando Using en VB y using() en C#.
2.6 Manejo del Estado
Por defecto los Formularios Web (paginas aspx) tienen habilitado el estado de vista (EnableViewState) que permite guardar todo dato ingresado en un
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
control de entrada y recuperarlo en el cliente después de enviarlo al servidor. Este aumenta el tamaño de la pagina en el cliente, si se desea reducir el tamaño del estado configurar la propiedad EnableViewState del control en False.
En lo posible evitar el uso de variables de sesión ya que consumen memoria, sobre todo si son muchas es preferible definir una sola Entidad que agrupe a varios datos en vez de tener varias variables de sesión.
Para guardar pocos datos y que no sean de importancia, se puede usar el objeto ViewState que guarda en el cliente dichos datos. Nunca usar este para guardar mucha data como DataSet, DataTables, Listas, etc.
2.7 Navegación entre Páginas
Para navegar desde una página ASP .NET hacia otra por código o programación hay varias formas: Server.Transfer, Response.Redirect o Server.Execute. La más eficiente para navegar entre paginas de la misma aplicación, sin regresar al cliente ni comprobar seguridad al navegar es Server.Transfer.
2.8 Uso de Controles del Servidor
Evitar el uso de controles Web que generen mucho HTML en el cliente y tomen mucho tiempo en renderizarse. Por ejemplo el Calentar y el GridView.
Si solo se desea presentar datos en forma de tabla, es preferible usar el control Web Repeater (es más trabajo su creación pero es más rápido).
2.9 Manejo de Errores
Controlar la mayoría de errores mediante lógica de programación antes que usar un Try Catch, por ejemplo divisiones entre cero, si un DataReader esta vació, si una sesión está vacía.
2.10 Acceso a Datos con ADO NET
Usar DataReaders en vez de DataSet para leer datos desde una BD, ya que el DataSet mantiene toda la data en memoria en cambio el DataReader solo trabaja una fila a la vez ahorrando memoria.
Para referirse a un campo del DataReader No hacerlo por su nombre sino por el índice.
Para evitar cambiar el código con la posición del campo, usar el método GetOrdinal del DataReader.
Cuando un campo en una consulta devuelve nulo es preferible controlarlo por la función IsNull de SQL en vez de usar IsDBNull del DataReader.
Evitar mostrar muchos datos en un control web por ejemplo en un GridView si son muchos registros usar Paginación.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
2.11 Bases de Datos
Crear índices para los campos de las tablas donde se realizarán búsquedas y/o ordenaciones, para que sean más rápidas.
Usar Store Procedures para almacenar el resultado en el servidor y que sea más rápida la ejecución de las consultas o actualizaciones.
2.12 Configuración de la Página
AutoEventWireup="false"
AspCompact nunca incluir sino se usa componentes COM+ 1.0
Async nunca incluir sino se usa comandos asíncronos.
Transaction nunca incluir sino se usa transacciones de COM+.
2.13 Configuración de la Aplicación
En vez de definir los Imports en VB y using en CS en cada pagina usar el atributo <add namespace="System"/> del Web.config
Antes de distribuir la Aplicación hay que deshabilitar el trace y debug en el Web.Config:
<trace enabled="false" pageOutput="false" />
<compilation debug="false" />
El modo de guardar la sesión que consume menos recursos es el Inproc:
<sessionState mode="inProc" />
2.14 Minimizar Llamadas al Servidor Web
Evitar que se ejecute código al hacer PostBack sino se necesita, para ello se escribe en el evento Page_Load el siguiente código: If Not Page.IsPostBack Then...
Usar controles de validación o programar con secuencias de comandos (Scripts) las validaciones en el cliente para que No se realice un viaje al servidor con datos inválidos.
Usar AJAX o cualquier tecnología para evitar la renderización total de la pagina en vez de renderizar solo un bloque.
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
3 ARQUITECTURA DE BASE DE DATOS SQL SERVER
3.1 Consideraciones Generales
Las siguientes instrucciones son válidas para cualquier objeto de Base de Datos, tales como tablas, vistas, procedimientos almacenados, desencadenantes, reglas, etc.:
La principal regla para nombrar objetos es asignar nombres entendibles o que sean fáciles de leer.
Los nombres de objetos deben tener máximo 50 caracteres.
Usar la notación Pascal para nombrar objetos, es decir, solo las iniciales de palabras en Mayúsculas.
Usar solo letras y el guión abajo (_) para nombrar objetos.
Evitar usar dígitos en los nombres de objetos.
No usar espacio en blanco.
No usar caracteres especiales, tales como: (“, #, &, /, (, ), ¿, ‘, ¡, !, +, *, {, })
Evitar usar abreviaciones para nombrar objetos.
Limitar el uso de Siglas, excepto que sean muy populares y se sobre entienda su significado.
El carácter guión abajo (_) solo debe usarse para separar dos palabras que se encuentren en mayúsculas, por ejemplo dos siglas.
Ejemplos
Característica Nombres Incorrectos Nombres Correctos Notación Pascal reportserver ReportServer
Evitar dígitos Direccion1 DireccionPrincipal
No blancos Fecha Nacimiento FechaNacimiento
Evitar abreviaciones FechIngAlm FechaIngresoAlmacen
Uso de siglas MontoImpuestoGeneral MontoIGV
Uso de _ Ruc_Ong RUC_ONG
Nombres entendibles FactDet FacturaDetalle
3.2 Nomenclatura
3.2.1 Base de Datos
Deber ser un nombre único en el Servidor de Datos.
Deberá ser un nombre referente al aplicativo.
3.2.2 Tabla
Deber ser un nombre único en la Base de Datos.
Deberá ser un nombre referente a la Entidad a Modelar.
Nombre debe estar en singular no en plural.
No usar Prefijos, como por ejemplo tb, tbl, etc.
Usar Notación Pascal.
Evitar usar el carácter _, excepto para separa una Sigla.
No usar abreviaciones.
Ejemplos
Característica Nombres Incorrectos Nombres Correctos Nombre en singular Clientes Cliente
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
No usar prefijos tbEmpleado Empleado
Notación Pascal ordenDetalle OrdenDetalle
No usar _ Orden_Detalle OrdenDetalle
No abreviar OrdDet OrdenDetalle
3.2.3 Columna
No usar Prefijos, tales como: fld, col, PK, FK, etc.
Evitar abreviaciones en los nombres.
Para los campos de tipo clave primaria o de tipo identificador como los códigos, el nombre debe ser el de la tabla mas la palabra Id.
Para los campos de tipo clave foránea es similar, el nombre de la tabla relacionada mas la palabra Id.
Si hubieran más de 2 campos de tipo clave foránea referidos a la misma tabla, entonces aumentar al medio un nombre más que complemente el dato.
Para los campos de clave compuesta que sean clave primaria mejor crear una columna de tipo identidad como clave.
Los campos de tipo Boolean deben nombrarse con una palabra que indique su estado en verdadero.
Los campos de tipo DateTime deben nombrarse con una palabra que indique si es Fecha y/o hora.
Ejemplos
Característica Nombres Incorrectos Nombres Correctos No prefijos colClienteCodigo ClienteId
Evitar abreviación FecEntPed FechaEntregaPedido
Clave primaria PK_Cod_Empleado EmpleadoId
Clave foránea FK_Cod_Empleado EmpleadoId
Varias claves foráneas a una misma tabla relacionada
DireccionId_Trabajo, DireccionId_Casa
DireccionTrabajoId, DireccionCasaId
Clave compuesta DepartamentoId, ProvinciaId, DistritoId
UbigeoId
Tipo Boolean NoTieneRUC TieneRUC
Tipo Date FecNac FechaNacimiento
Tipo Time HorSal HoraSalida
Tipo DateTime FHRegistro FechaHoraRegistro
3.2.4 Índices
Los índices creados automáticamente por SQL Server como los de clave primaria (PK) y clave foránea (FK) deben quedarse con el nombre por defecto, por ejemplo para la clave primaria siempre es PK_<NombreTabla>.
Los índices creados por el usuario si pueden cambiarse de nombre, siguiendo la regla: IX<TipoIndice>_<NombreTabla><NombreIndice>, donde el Tipo de Índice puede ser U indica si es único y N si no lo es.
Ejemplos
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Característica Nombres Incorrectos Nombres Correctos Índice de clave primaria Empleado_PK01 PK_Empleado
Índice único Empleado_AK02 IXU_EmpleadoCorrelativo
Índice no único Empleado_AK03 IXN_EmpleadoArea
3.2.5 Restricciones
Las restricciones (Constraints) son a nivel de columna o campo y deben tener la siguiente estructura: CK_<NombreTabla><NombreCampo>.
Ejemplo
Característica Nombres Incorrectos Nombres Correctos Restricción para campo fecha
Empleado_CK01 CK_EmpleadoFechaIngreso
3.2.6 Vistas
Las reglas para nombrar vistas son muy similares que para las tablas, pero hay que agregar el prefijo VW, tal como se muestra a continuación: VW_<NombreTabla><Acción>.
La acción en una vista solo puede ser Listar cuando la consulta devuelve varios registros, Obtener cuando la consulta devuelve un registro o un verbo como Calcular, Habilitar, Validar si la consulta devuelve un solo valor conocido como escalar.
Para las vistas que se guardan en cache como si fueran tablas, llamadas vistas indizadas o materializadas usar el prefijo VWI, tal como se muestra: VWI_<NombreTabla><Acción>.
Si la vista se obtiene de varias tablas colocar solo la acción, tal como sigue: VW_<Acción>.
Ejemplos
Característica Nombres Incorrectos Nombres Correctos Vista clásica Empleado_VW01 VW_EmpleadoListarTodo
Vista indizada Empleado_VM02 VWI_EmpleadoObtenerPorId
Vista de varias tablas
OrdenDetalle_VW01 VW_ObtenerDetallesPorOrden
3.2.7 Procedimientos Almacenados
Si el procedimiento almacenado afecta a una sola tabla, el nombre se compone del prefijo USP (User Store Procedure) seguido del nombre de la tabla y la acción, tal como sigue: USP_<NombreTabla><Acción>.
La acción debe ser un verbo como Listar (cuando el resultado devuelve varios registros), Obtener (si el resultado devuelve un solo registro), Calcular, Habilitar, Validar, etc. (si el resultado devuelve un solo valor o escalar), Adicionar (si se inserta registros), Actualizar (si se modifica registros), Eliminar (si se elimina registros).
Si el procedimiento almacenado se obtiene de varias tablas colocar solo el prefijo seguido de la acción, tal como sigue: USP_<Acción>.
Ejemplos
Estándares de Desarrollo en Microsoft .NET
Autor: Luis Dueñas
Característica Nombres Incorrectos Nombres Correctos SP lista solo una tabla
Empleado_SP01 USP_EmpleadoListar
SP adiciona solo una tabla
Empleado_SP02 USP_EmpleadoAdicionar
SP actualiza solo un dato
Empleado_SP03 USP_EmpleadoActualizarStock
SP obtiene datos de varias tablas
OrdenDetalleProducto_SP01 USP_ObtenerDetallesPorOrden
3.2.8 Desencadenantes
Si el desencadenante afecta a una sola tabla, el nombre se compone del prefijo TR (Trigger) seguido de un carácter que indica la operación y después el nombre de la tabla y finalmente la acción, tal como se muestra a continuación: TR<Operación>_<NombreTabla><Acción>.
La operación es un carácter que puede ser I (si ocurre al insertar registros), U (si ocurre al modificar registros), D (si ocurre al eliminar registros) o M (si ocurre al combinar 2 o más operaciones: MDL).
La acción debe ser un verbo como EnviarMail, EliminarDetalles, ActualizarInventario, GrabarLog, etc.
Si el desencadenante se obtiene de varias tablas colocar solo el prefijo seguido de la operación y luego la acción, tal como sigue: TR<Operación>_<Acción>.
Ejemplos
Característica Nombres Incorrectos Nombres Correctos TR al insertar una tabla Empleado_TR_INS TRI_EmpleadoEnviarMail
TR al eliminar una tabla Orden_TR_DEL TRD_OrdenEliminarDetalles
TR al insertar o actualizar Producto_TR_MDL TRM_ProductoActualizarInventario
TR al insertar o actualizar o eliminar cualquier tabla
BD_TR_MDL TRM_GrabarLog