Jorge Serrano
  • Home

My C# Style Sheet

  • By jorge
  • Jul-20-2011
  • Sin categoría
  • 2 Comments.

 

 

Abstract

This is my own style sheet about C#.

To prepare this document, I have used the help file of StyleCop v4.5, the Juval Lowy’s recommendations and my own experience with .NET applications.

Note that this document is a personal document that I have used succesfully in the last years, and with this guide you will be prepared to generate the chm help file of the project with SandCastle.

I know that each software team has their own particular form to apply their naming code. Here is my own manner to do it.

I hope that helps.

 

Introducción

Llevo ya algo más de 10 años programando en .NET (nunca son suficientes).

Antes de .NET estuve «trasteando» con diferentes lenguajes de programación (C, C++, Clipper, Fortran, Cobol, SmallTalk, Pascal, Java,…) pero por encima de ellos, uno sobre el que guardo un especial cariño… VB.

Sin embargo, y antes de eso, en mi Universidad no me enseñaron a programar bien… sí, cierto… mucho enfoque de gestión, dirección de empresa, marketing, etc… pero programación,… lo que se dice programación, más bien «null«.

Vicios adquiridos

Así que os podéis imaginar en qué se convierte lo que antes comentaba… si apenas me enseña nadie a programar y lo hago de forma autodidacta, eso significa que uno sabe hacer primero un «Hello World«, una pequeña agenda de texto o editor de texto después, y finalmente una aplicación de base de datos que lo único que hace es mantener una agenda de teléfonos, cumpleaños y direcciones… y a partir de ahí todo lo demás, pero… ¿sabemos realmente programar?.

Si conseguimos nuestros objetivos y la aplicación funciona, pero sabemos que eso no es suficiente, es decir, sabemos programa a base de lo que «Dios buenamente me dió a entender«, sin mucha organización y con muchos (muchísimos) vicios adquiridos.

Renovar o morir

No obstante, ya conocemos la frase que todo geek que se precie debe tener en su mente siempre… renovar o morir, así que cuando apareció .NET me embarqué a dicha plataforma, su modelo de programación, y decidí renovar mis conocimientos sobre programación (que no eran muchos) de forma que pudiera aprender a hacer las cosas lo mejor posible.

Esa curva es tan amplia y tan grande que nunca dejas de aprender a hacer las cosas de una manera u otra.

Y embarcado en esa curva de aprendizaje (y muchas más cosas obviamente), he estado trabajando en los últimos años en diferentes empresas.

En todas ellas he visto diferentes formas de hacer las cosas (a veces mejor y a veces peor, con sus pros y sus contras), pero siempre me ha pasado lo mismo cuando llego a una empresa de nuevas… ¿qué nomenclatura utiliza?.

Nomenclatura como puerta de entrada hacia la calidad de codificación

Una cosa sí tengo clara, y es que cuando codificamos, estamos «obligados» a utilizar una nomenclatura de codificación general que nos permita a todos entendernos.

Hablando de DDD, existe un término muy importante que siempre tenemos en cuenta (y no es nuevo, existe de siempre incluso obviamente antes de la existencia de DDD) y que se refiere al lenguaje ubicuo.

A la hora de programar, también debemos intentar utilizar un «lenguaje ubicuo«. La importancia de que todo el código se escriba de una forma homogénea es fundamental, ya que aporta calidad, claridad y facilita la localización y mantenimiento del código de una aplicación (entre otras cosas).

Sirva como ejemplo de todo esto que hoy Pedro está trabajando con el código, pero mañana Pedro se va de vacaciones y María debe trabajar sí o sí con su código. Si María codifica al 99% (el 100% es muy complicado alcanzarlo) de la misma manera, María entenderá lo que Pedro ha hecho y podrá continuar su trabajo, prácticamente como si Pedro fuera el que estuviera codificando (con sus lógicas diferencias claro está).

Si dentro de tres años Juan llega a la empresa y tanto Pedro como María ya no están en la compañía, le será relativamente sencillo ponerse a trabajar con el código (aquí deberíamos extendernos mucho más sobre lo de «relativamente sencillo«, pero esto es para otro día).

Lo que he comentado anteriormente es siempre y cuando Pedro, María y Juan utilicen el mismo documento de nomenclatura global, el mismo lenguaje ubicuo, las mismas reglas y formas de hacer las cosas.

De esta «forma» de trabajar depende la calidad de codificación.

Existen más mecanismos que aportan calidad a la codificación (no es momento de enumerarlos ahora mismo), pero permitidme que exprese que este es para mí el punto inicial y principal que debemos cumplir todos los que nos dedicamos a esto de la codificación.

Siempre con lo mismo

Y aquí es donde me debato, que siempre que llego a un sitio nuevo y debo actuar como arquitecto, responsable del proyecto o con un rol de responsabilidad, me veo inmerso en la misma problemática de siempre una y otra vez… «hay que hacer un documento de nomenclatura«.

Y ya un poco cansado con esto, que se repite una y otra vez en mi recorrido profesional como si del día de la marmota fuera, me he visto animado a hacer una lista de atajos que sirva de apoyo para los programadores, para que utilicen ese lenguaje ubicuo del que hago mención en esta entrada.

My C# Style Sheet

En mi caso, y pese a mi querido VB, he creado un documento con atajos para C#.

Son prácticamente aplicables a VB, pero el documento que he creado está pensado para C# y hay pequeñas puntualizaciones que no aplican sobre VB o aplicarían de otra manera distinta.

Se trata de un documento de nomenclatura y codificación que he hecho basado en los siguientes puntos:

 

  • StyleCop v4.5
  • Recomendaciones y nomenclatura de Juval Lowy
  • Mi propia experiencia (como no)

 

Quiero que quede muy claro, que es un documento basado en mi personal punto de vista y teniendo en cuenta en más del 95% las reglas de StyleCop.

El documento lo he generado porque no es lo mismo dar a un programador un documento de más de 20 páginas sobre las reglas de codificación y nomenclatura que condensarlo en un pequeño documento de 2 páginas a modo resumen de cómo codificar y que todo programador puede tener encima de la mesa para consultarlo ante una duda puntual.

En el documento indico incluso las reglas de StyleCop que dejo fuera del análisis de código realizado con Visual Studio 2010 teniendo en cuenta que el código lo paso revisando todas las reglas de codificación de StyleCop.

Como todas las cosas, seguro que hay personas y por lo tanto opiniones que no están muy de acuerdo con algunos de los planteamientos que pongo aquí, pero a mí siempre me ha dado un excelente resultado escribir así y trataré de no cambiar esta manera de hacer las cosas.

Ni que decir que el código escrito así me permite incluso generar el documento de ayuda (chm) del proyecto con SandCastle como herramienta.

Descarga / Download

Pongo por aquí los atajos (en inglés) para que los descarguen y utilicen todas las personas que quieran (formato pdf [128 Kb] y xps [232 Kb]).

Acceder a los documentos aquí.

Access here to the documents (pdf and xps format).

Espero que le sirva a más de uno.

 

Comments

2 Responsesso far

  1. etomas dice:
    20 julio, 2011 a las 1:07 pm

    Buenas Jorge!
    Les he echado un vistazo y me parecen muy razonables 🙂 Un MUY buen trabajo.

    No diré que estoy de acuerdo con todas porque mentiría, pero si con una gran mayoría. Y en las que NO estoy de acuerdo es un tema puramente personal 🙂

    Echo en falta lo siguiente (ahora saco mi vena criticona :P):

    1. Cuando usar ‘var’ y cuando no.
    2. Nombre del delegate de handler de evento, nombre de evento y nombre de clase de parametros de evento (en la sección naming rules).

    Cosas que yo añadiría (todas ellas discutibles!):

    1. Uso de readonly
    2. Usar EventHandler antes que custom delegate
    3. Usar inicializadores de objeto cuando sea posible antes que new + asignar propiedades
    4. [C#4 sólo] Usar parámetros nombrados antes que N sobrecargas de constructor

    Y abro un debate:

    Si tenemos lo siguiente:
    class C
    {
    public int Foo {get; private set;}
    public C()
    {
    this.Foo = 10; // Foo se asigna SOLO aquí
    }
    }

    sería mejor hacer lo siguiente?

    class C
    {
    private readonly int foo;
    public int Foo { get { return this.foo;} }
    public C()
    {
    this.foo = 10; // foo se asigna solo aquí
    }
    }

    😉

    Saludos!

    Responder
  2. anonymous dice:
    20 julio, 2011 a las 3:55 pm

    Excelente! Muy buen trabajo…
    Al igual que muchos (imagino) no estoy de acuerdo con todo, y tampoco los aplico todos; pero si que son buenos consejos a seguir.

    Gracias!

    Responder

Deja un comentario Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

← Previous Post Next Post →

Jorge Serrano

MVP Reconnect


Donaciones
Donation

Entradas recientes

  • Go – Tipos de Datos
  • Go – Variables
  • Hello Go-rld!
  • Introducción a Go o Golang
  • JSON Patch en ASP.NET Core 5 Web API
  • Null Checking en C#
  • ¿Porqué mi página web por defecto de ASP.NET Core no se vé en mi Azure Web App y me da un 404?
  • .NET 5 lanzado oficialmente – detalles y consideraciones
  • Configurar el Pipeline de Azure DevOps para compilar proyectos .NET 5
  • ¿Cómo puedo probar .NET 5 y C# 9?

Categorías

  • .NET 5
  • .NET Core
  • .NET Core 3.0
  • .NET Core 3.1
  • .NET Framework 2.0
  • .NET Framework 3.0
  • .NET Framework 3.5
  • .NET Framework 4.0
  • .NET Framework 4.5
  • .NET Framework 4.6
  • .NET Framework 4.7
  • .NET Framework 4.8
  • .NET Standard 2.0
  • .NET Standard 2.1
  • AMQP
  • Android
  • Angular
  • API REST
  • Apple
  • Apple iOS
  • Apple macOs
  • Arquitectura
  • ASP.NET
  • ASP.NET Core
  • ASP.NET Core 3
  • ASP.NET Core 5
  • AWS
  • Azure App Service
  • Azure Application Insights
  • Azure Cosmos DB
  • Azure Database Migration Service
  • Azure Databricks
  • Azure DevOps
  • Azure Event Grid
  • Azure Functions
  • Azure IoT
  • Azure Portal
  • Azure PowerShell
  • Azure Queue Storage
  • Azure SQL
  • Azure Storage
  • Azure Virtual Datacenter
  • Azure WebApps
  • Big Data
  • Bing
  • Blazor
  • Blog
  • Bots
  • C#
  • C# 7.0
  • C# 7.1
  • C# 7.2
  • C# 7.3
  • C# 8.0
  • C# 9.0
  • Channel 9
  • Codeplex
  • Codespaces
  • Containers
  • Debugging
  • DevOps
  • Docker
  • Electron
  • Entity Framework
  • Entity Framework Core
  • Entity Framework Core 3.0
  • Entity Framework Core 5
  • Eventos
  • F#
  • FaaS
  • FeatureFlags
  • FeatureToggles
  • Feeds
  • Fluent Assertions
  • General
  • GIMP
  • Git
  • GitHub
  • Go
  • Google
  • Google Analytics
  • Gradle
  • gRPC
  • GSA
  • Historia de la Informática
  • HoloLens
  • HtmlAgilityPack
  • IdentityServer4
  • Inkscape
  • Ionic
  • iOS
  • IoT
  • Java
  • JavaScript
  • JDBC
  • JSON
  • Kubernetes
  • Lenguajes de Programación
  • Libros y Cursos
  • LINQ
  • Linux
  • LiteDB
  • Machine Learning
  • macOS
  • Microservices
  • Microsoft
  • Microsoft .NET Framework 4.5
  • Microsoft 365
  • Microsoft Azure
  • Microsoft Build
  • Microsoft Ignite
  • Microsoft Learn
  • Microsoft Orleans
  • Microsoft Surface Go
  • Microsoft Teams
  • ML.NET
  • MQTT
  • MRO
  • MS-DOS
  • MsCoders Madrid
  • MVP
  • NancyFx
  • Node.js
  • NoSQL
  • NuGet
  • NUnit
  • OData
  • ODP.NET Core
  • Office 2007
  • Office 2010
  • Office 2013
  • Office 2016
  • Office 2019
  • Office 365
  • Open Source
  • Open XML SDK
  • Opinión
  • Orchard CMS
  • OT
  • PaaS
  • Patterns
  • PdfSharpCore
  • Performance
  • PHP
  • Postman
  • Power BI
  • PowerShell
  • PowerShell Core
  • Productividad
  • Project Server 2019
  • R
  • Rendimiento
  • Scala
  • Scraper
  • Security
  • Serverless
  • Service Fabric
  • SharePoint Server 2019
  • SignalR
  • Sin categoría
  • Sistemas Distribuidos
  • Skype
  • Skype for Business Server 2019
  • Small Basic Online
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • SQL Server 2017
  • SQL Server 2019
  • STOMP
  • Swagger
  • Testing
  • TFS 2017
  • TFS 2018
  • Tools
  • TypeScript
  • Unity
  • UWP
  • UX
  • Visio
  • Visual Basic
  • Visual Studio 2010
  • Visual Studio 2012
  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2017 for Mac
  • Visual Studio 2019
  • Visual Studio 2019 for Mac
  • Visual Studio App Center
  • Visual Studio Code
  • Visual Studio IntelliCode
  • Visual Studio Live Share
  • Visual Studio Live Share Audio
  • Visual Studio Online
  • VS Anywhere
  • Vue.js
  • Web API
  • WebAssembly
  • WinDbg
  • Windows
  • Windows 10
  • Windows Compatibility Pack
  • Windows Phone 10
  • Windows Phone 7
  • Windows Phone 8
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016
  • Windows Server 2019
  • Windows Service
  • WinForms
  • WinUI
  • WPF
  • Xamarin
  • Xbox
  • Xcode
  • Xiaomi Mi Band 2
  • xUnit
  • YAML

Archivos

  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • diciembre 2018
  • noviembre 2018
  • octubre 2018
  • septiembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • abril 2018
  • marzo 2018
  • febrero 2018
  • enero 2018
  • diciembre 2017
  • noviembre 2017
  • octubre 2017
  • septiembre 2017
  • agosto 2017
  • julio 2017
  • junio 2017
  • febrero 2015
  • octubre 2014
  • junio 2014
  • marzo 2014
  • febrero 2014
  • enero 2014
  • diciembre 2013
  • septiembre 2013
  • agosto 2013
  • julio 2013
  • junio 2013
  • abril 2013
  • febrero 2013
  • enero 2013
  • diciembre 2012
  • noviembre 2012
  • septiembre 2012
  • agosto 2012
  • junio 2012
  • mayo 2012
  • abril 2012
  • marzo 2012
  • febrero 2012
  • enero 2012
  • diciembre 2011
  • noviembre 2011
  • octubre 2011
  • septiembre 2011
  • agosto 2011
  • julio 2011
  • junio 2011
  • mayo 2011
  • abril 2011
  • marzo 2011
  • enero 2011
  • diciembre 2010
  • noviembre 2010
  • octubre 2010
  • septiembre 2010
  • agosto 2010
  • julio 2010
  • junio 2010
  • mayo 2010
  • abril 2010
  • marzo 2010
  • febrero 2010
  • enero 2010
  • diciembre 2009
  • noviembre 2009
  • octubre 2009
  • septiembre 2009
  • agosto 2009
  • julio 2009
  • junio 2009
  • mayo 2009
  • abril 2009
  • marzo 2009
  • febrero 2009
  • enero 2009
  • diciembre 2008
  • noviembre 2008
  • octubre 2008
  • septiembre 2008
  • agosto 2008
  • julio 2008
  • junio 2008
  • mayo 2008
  • abril 2008
  • marzo 2008
  • febrero 2008
  • enero 2008
  • diciembre 2007
  • noviembre 2007
  • octubre 2007
  • septiembre 2007
  • agosto 2007
  • julio 2007
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007
  • febrero 2007
  • enero 2007
  • diciembre 2006
  • noviembre 2006
  • octubre 2006
  • septiembre 2006
  • agosto 2006
  • julio 2006
  • junio 2006
  • mayo 2006
About This Site

A cras tincidunt, ut tellus et. Gravida scel ipsum sed iaculis, nunc non nam. Placerat sed phase llus, purus purus elit.

Archives Widget
  • January 2010
  • December 2009
  • November 2009
  • October 2009
Categories
  • Entertainment
  • Technology
  • Sports & Recreation
  • Jobs & Lifestyle
Search
  • twitter

Powered by WordPress  |  Business Directory by InkThemes.

This site uses cookies: Find out more.