estándares de desarrollo en microsoft net - luis dueñas

33
Estándares de Desarrollo en Microsoft .NET Por Luis Dueñas

Upload: tdadarksoul

Post on 28-Oct-2015

158 views

Category:

Documents


23 download

TRANSCRIPT

Page 1: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

Estándares de

Desarrollo en

Microsoft .NET

Por Luis Dueñas

Page 2: Estándares de Desarrollo en Microsoft NET - 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

Page 3: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 4: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 5: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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();

Page 6: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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 = += -= *= /*

= += -= *= /*

Page 7: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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 --

Page 8: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 9: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 10: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 11: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 12: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 13: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 14: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 15: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 16: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 17: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 18: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 19: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 20: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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).

Page 21: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 22: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 23: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 24: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 25: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 26: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 27: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 28: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 29: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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.

Page 30: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 31: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 32: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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

Page 33: Estándares de Desarrollo en Microsoft NET - Luis Dueñas

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