SlideShare una empresa de Scribd logo
1 de 29
C# Buenas prácticas y
código limpio
Mteheran.dev
Mteheran.dev
• Solutions Architect
• Microsoft MVP
• Alibaba MVP
• Avanet.org
• Mteheran.dev
Refinamiento o Refactoring
Cambias estructuras de código, sintaxis o
arquitectura para mejorar en:
• Rendimiento
• Lectura
• Tamaño o líneas de código
• Mantenibilidad
• Eliminar deuda técnica
• Seguridad
Buenas prácticas
Se refiere a los estándares que ya existen dentro del
código para garantizar:
• Rendimiento
• Lectura
• Tamaño o líneas de código
• Mantenibilidad
• Eliminar deuda técnica
• Seguridad
Código limpio
Se refiere un código que ha pasado por refinamiento
y sigue las mejores prácticas
Tip #1 - Naming / Nombramiento
Variables, Métodos, Clases, Interfaces
Mal:
int d;
Bien:
int daySinceModification;
Tip #1 - Naming / Nombramiento
Variables, Métodos, Clases, Interfaces
Mal:
public List<Users> getUsers()
Bien:
Public List<Users> GetActiveUsers()
Tip #1 - Naming / Nombramiento
Variables, Métodos, Clases, Interfaces
Mal:
public class ClassUser2
Bien:
public class User
Crea estándares, construyelos en
equipo y siempre respetalos
Tip #2 - Reduce código
Mantén el código legible pero reducido y apoyate en LINQ
Antes:
if (active == true)
{
return CurrentActiveUsers;
}
Después:
if (active) return CurrentActiveUsers;
Tip #2 - Reduce código
Mantén el código legible pero reducido y apoyate en LINQ
Antes:
foreach (var item in Users)
{
if(item.Name == UserName) return true;
}
Después:
return Users.Any(item => item.Name == UserName);
Cuando algo huele mal o no luce
bien, revisalo 2 veces o pide una
opinión
Demo - Ejemplo
https://replit.com/@mteheran/CodigoLimpio
Tip #3 - Utiliza las mejoras de C#
C# 6, 7, 8, 9 tiene muchas mejoras que te ayudan a reducir el código y usar una
mejor sintaxis
Antes:
string = “El resultado es ” + result;
Después:
string = $”El resultado es {result}”;
Tip #3 - Utiliza las mejoras de C#
Antes:
if (CurrentDate != null)
{
if(CurrentDate.Year > 2020) return true;
}
Después:
if(CurrentDate?.Year > 2020) return true;
Tip #4 - Evita muchos parámetros
Antes:
public void CreateNewUser(string name, string
lastname, int Id, string phone)
Después:
public void CreateNewUser(User newUser)
Tip #5 - Clases con una sola
responsabilidad
Antes:
public void SendEmailToListOfClients(string[] clients)
{
foreach (var client in clients)
{
var clientRecord = db.Find(client);
if (clientRecord.IsActive())
{
Email(client);
}
}
}
Tip #5 - Clases con una sola
responsabilidad
Después:
public void SendEmailToListOfClients(string[] clients)
{
var activeClients = Clients.GetActiveClients(clients);
Email(client);
}
public List<Client> GetActiveClients(string[] clients)
{
return db.Find(clients).Where(s => s.Status == "Active");
}
Tip #6 - Encapsular Condiciones
Antes:
if (article.state == "published")
{
// ...
}
Después:
if (article.IsPublished())
{
// ...
}
Principio KISS
Keep it simple Stupid
Mantenlo simple siempre
Fácil de entender,
fácil de mantener
Tip #7 - Comentarios
Tip #7 - Comentarios
^((w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*)s*[;]{0,1}s*)+$
Las expresiones regulares son un buen ejemplo para
comentar el código y explicar para que se usa
Tip #8 - SOLID Principles
Mitos que no son buenas práticas
• Reducir el código al mínimo
• Comentar todo
• Utilizar regions para ordenar
• Utiliza nomenclatura húngara
• Manejar patrones de diseño en toda la
arquitectura
¿Cómo conseguir un mejor
código?
• CodeReview
• Definir estándares
• Estudiar la sintaxis del lenguaje
• Se cuidadoso con los nombramientos y ortografía
• Escribir código en inglés
• Apoyarse de los IDEs
El mejor recurso
https://github.com/thangchung/clean-code-dotnet
Curso buenas prácticas y código
limpio
https://www.udemy.com/course/csharp-cleancode/?couponCode=GRATIS
couponCode=GRATIS
Curso buenas prácticas y código
limpio MEJOR PRECIO!
https://www.udemy.com/course/csharp-cleancode/?couponCode=COMUNIDAD
couponCode=COMUNIDAD
Preguntas?
Mteheran.dev

Más contenido relacionado

La actualidad más candente

Estandares y modelos de calidad del software
Estandares y modelos de calidad del softwareEstandares y modelos de calidad del software
Estandares y modelos de calidad del softwareaagalvisg
 
Tecnicas de estimacion de software
Tecnicas de estimacion de softwareTecnicas de estimacion de software
Tecnicas de estimacion de softwareAdes27
 
Unidad 1 verificacion y-validacion
Unidad 1 verificacion y-validacionUnidad 1 verificacion y-validacion
Unidad 1 verificacion y-validacionJorge Daza Gómez
 
Gestion de la configuracion del software
Gestion de la configuracion del softwareGestion de la configuracion del software
Gestion de la configuracion del softwareJohan Prevot R
 
Analisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A ObjetosAnalisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A Objetosyoiner santiago
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Giancarlo Aguilar
 
Analisis De Requerimientos Erick Rojas Figueroa
Analisis De Requerimientos   Erick Rojas FigueroaAnalisis De Requerimientos   Erick Rojas Figueroa
Analisis De Requerimientos Erick Rojas Figueroaedays
 
Norma ISO/IEC 9126 y Métrica de Calidad del Software
Norma ISO/IEC 9126 y Métrica de Calidad del Software Norma ISO/IEC 9126 y Métrica de Calidad del Software
Norma ISO/IEC 9126 y Métrica de Calidad del Software ehe ml
 
Programación de Aplicaciones Móviles
Programación de Aplicaciones MóvilesProgramación de Aplicaciones Móviles
Programación de Aplicaciones MóvilesGuadalupe Piedra Olano
 
Diagrama de clases
Diagrama de clasesDiagrama de clases
Diagrama de clasesNedoww Haw
 

La actualidad más candente (20)

Estandares y modelos de calidad del software
Estandares y modelos de calidad del softwareEstandares y modelos de calidad del software
Estandares y modelos de calidad del software
 
Rational rose
Rational roseRational rose
Rational rose
 
Tecnicas de estimacion de software
Tecnicas de estimacion de softwareTecnicas de estimacion de software
Tecnicas de estimacion de software
 
Unidad 1 verificacion y-validacion
Unidad 1 verificacion y-validacionUnidad 1 verificacion y-validacion
Unidad 1 verificacion y-validacion
 
Rup
RupRup
Rup
 
tecnicas de revisión del software
tecnicas de revisión del softwaretecnicas de revisión del software
tecnicas de revisión del software
 
Gestion de la configuracion del software
Gestion de la configuracion del softwareGestion de la configuracion del software
Gestion de la configuracion del software
 
Diseño de interfaces
Diseño de interfacesDiseño de interfaces
Diseño de interfaces
 
Analisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A ObjetosAnalisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A Objetos
 
Mapa mental de Ing. de requisito y requerimiento
Mapa mental de Ing. de requisito y requerimientoMapa mental de Ing. de requisito y requerimiento
Mapa mental de Ing. de requisito y requerimiento
 
Herramientas case
Herramientas caseHerramientas case
Herramientas case
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.
 
Analisis De Requerimientos Erick Rojas Figueroa
Analisis De Requerimientos   Erick Rojas FigueroaAnalisis De Requerimientos   Erick Rojas Figueroa
Analisis De Requerimientos Erick Rojas Figueroa
 
Norma ISO/IEC 9126 y Métrica de Calidad del Software
Norma ISO/IEC 9126 y Métrica de Calidad del Software Norma ISO/IEC 9126 y Métrica de Calidad del Software
Norma ISO/IEC 9126 y Métrica de Calidad del Software
 
Estilos Arquitectonicos-Capas
Estilos Arquitectonicos-CapasEstilos Arquitectonicos-Capas
Estilos Arquitectonicos-Capas
 
Sqa
SqaSqa
Sqa
 
Introducción a UML
Introducción a UMLIntroducción a UML
Introducción a UML
 
Programación de Aplicaciones Móviles
Programación de Aplicaciones MóvilesProgramación de Aplicaciones Móviles
Programación de Aplicaciones Móviles
 
Diagrama de clases
Diagrama de clasesDiagrama de clases
Diagrama de clases
 
Modelo de requerimientos
Modelo de requerimientosModelo de requerimientos
Modelo de requerimientos
 

Similar a Buenas practicas y código limpio en C#

Java Ago Dic07
Java Ago Dic07Java Ago Dic07
Java Ago Dic07adrianpro
 
Introducción al desarrollo guiado por pruebas
Introducción al desarrollo guiado por pruebasIntroducción al desarrollo guiado por pruebas
Introducción al desarrollo guiado por pruebasAlejandro Hernández
 
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...Luis775803
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campusSoftware Guru
 
Consejos parafuturosinstructores mx-marzo2011
Consejos parafuturosinstructores mx-marzo2011Consejos parafuturosinstructores mx-marzo2011
Consejos parafuturosinstructores mx-marzo2011GeneXus
 
2022.1P.02.IntroduccionCPP.Metodos numericos
2022.1P.02.IntroduccionCPP.Metodos numericos2022.1P.02.IntroduccionCPP.Metodos numericos
2022.1P.02.IntroduccionCPP.Metodos numericosJoseLuisPomaTorrez1
 
Programación estructurada presentación
Programación estructurada presentaciónProgramación estructurada presentación
Programación estructurada presentaciónIvarra
 
Elementos básicos de un lenguaje de alto nivel
Elementos básicos de un lenguaje de alto nivelElementos básicos de un lenguaje de alto nivel
Elementos básicos de un lenguaje de alto nivelRicardo Axel
 
Guia de ejercioccios de estudio c#.pptx
Guia de ejercioccios de estudio   c#.pptxGuia de ejercioccios de estudio   c#.pptx
Guia de ejercioccios de estudio c#.pptxJAVIERARTUROGARCIAMI
 

Similar a Buenas practicas y código limpio en C# (20)

2 poo u1 4 datos
2 poo u1 4 datos2 poo u1 4 datos
2 poo u1 4 datos
 
Java Ago Dic07
Java Ago Dic07Java Ago Dic07
Java Ago Dic07
 
0.2 Conceptos Basicos C++ II
0.2  Conceptos Basicos C++ II0.2  Conceptos Basicos C++ II
0.2 Conceptos Basicos C++ II
 
Introducción al desarrollo guiado por pruebas
Introducción al desarrollo guiado por pruebasIntroducción al desarrollo guiado por pruebas
Introducción al desarrollo guiado por pruebas
 
Cap0 2
Cap0 2Cap0 2
Cap0 2
 
Cuida tu código: Clean Code
Cuida tu código: Clean CodeCuida tu código: Clean Code
Cuida tu código: Clean Code
 
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...
Microsoft Reactor - Creando un modelo de Regresión con Azure Machine Learnin...
 
Tdd
TddTdd
Tdd
 
Buenasprcticas
BuenasprcticasBuenasprcticas
Buenasprcticas
 
Intro c sharp
Intro c sharpIntro c sharp
Intro c sharp
 
05 Creando Clases
05   Creando Clases05   Creando Clases
05 Creando Clases
 
Programación en C++
Programación en C++Programación en C++
Programación en C++
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
Consejos parafuturosinstructores mx-marzo2011
Consejos parafuturosinstructores mx-marzo2011Consejos parafuturosinstructores mx-marzo2011
Consejos parafuturosinstructores mx-marzo2011
 
2022.1P.02.IntroduccionCPP.Metodos numericos
2022.1P.02.IntroduccionCPP.Metodos numericos2022.1P.02.IntroduccionCPP.Metodos numericos
2022.1P.02.IntroduccionCPP.Metodos numericos
 
(22.04.2009) Cumuy Presenta - Novedades en la plataforma de desarrollo .NET ...
(22.04.2009) Cumuy Presenta -  Novedades en la plataforma de desarrollo .NET ...(22.04.2009) Cumuy Presenta -  Novedades en la plataforma de desarrollo .NET ...
(22.04.2009) Cumuy Presenta - Novedades en la plataforma de desarrollo .NET ...
 
Programación estructurada presentación
Programación estructurada presentaciónProgramación estructurada presentación
Programación estructurada presentación
 
Programacion en C#
Programacion en C#Programacion en C#
Programacion en C#
 
Elementos básicos de un lenguaje de alto nivel
Elementos básicos de un lenguaje de alto nivelElementos básicos de un lenguaje de alto nivel
Elementos básicos de un lenguaje de alto nivel
 
Guia de ejercioccios de estudio c#.pptx
Guia de ejercioccios de estudio   c#.pptxGuia de ejercioccios de estudio   c#.pptx
Guia de ejercioccios de estudio c#.pptx
 

Más de Miguel Angel Teheran Garcia

Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud Functions
Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud FunctionsPruebas Automatizadas con PlayWright sobre nuestras Google Cloud Functions
Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud FunctionsMiguel Angel Teheran Garcia
 
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...Miguel Angel Teheran Garcia
 
DevFest 2022 - El Arte de escribir sobre programacion.pptx
DevFest 2022 - El Arte de escribir sobre programacion.pptxDevFest 2022 - El Arte de escribir sobre programacion.pptx
DevFest 2022 - El Arte de escribir sobre programacion.pptxMiguel Angel Teheran Garcia
 
RoadMap y herramientas de Azure DevOps que debes conocer
RoadMap y herramientas de Azure DevOps que debes conocerRoadMap y herramientas de Azure DevOps que debes conocer
RoadMap y herramientas de Azure DevOps que debes conocerMiguel Angel Teheran Garcia
 
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de Plataforma
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de PlataformaMAUIConf - Adios Net Maui Essentials Bienvenida Integración de Plataforma
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de PlataformaMiguel Angel Teheran Garcia
 
Building Web Applications with Blazor and MudBlazor
Building Web Applications with Blazor and MudBlazorBuilding Web Applications with Blazor and MudBlazor
Building Web Applications with Blazor and MudBlazorMiguel Angel Teheran Garcia
 

Más de Miguel Angel Teheran Garcia (20)

Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud Functions
Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud FunctionsPruebas Automatizadas con PlayWright sobre nuestras Google Cloud Functions
Pruebas Automatizadas con PlayWright sobre nuestras Google Cloud Functions
 
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...
PlayWright, Cypress, Selenium Cual es la mejor opción para desarrolladores Ja...
 
Introduction to Blazor Hybrid
Introduction to Blazor HybridIntroduction to Blazor Hybrid
Introduction to Blazor Hybrid
 
La historia de api-colombia
La historia de api-colombiaLa historia de api-colombia
La historia de api-colombia
 
DevFest 2022 - El Arte de escribir sobre programacion.pptx
DevFest 2022 - El Arte de escribir sobre programacion.pptxDevFest 2022 - El Arte de escribir sobre programacion.pptx
DevFest 2022 - El Arte de escribir sobre programacion.pptx
 
RoadMap y herramientas de Azure DevOps que debes conocer
RoadMap y herramientas de Azure DevOps que debes conocerRoadMap y herramientas de Azure DevOps que debes conocer
RoadMap y herramientas de Azure DevOps que debes conocer
 
Taller de TDD con .NET y xUnit
Taller de TDD con .NET y xUnitTaller de TDD con .NET y xUnit
Taller de TDD con .NET y xUnit
 
Introduction to OpenTelemetry in .NET
Introduction to OpenTelemetry in .NETIntroduction to OpenTelemetry in .NET
Introduction to OpenTelemetry in .NET
 
PRISM con MAUI
PRISM con MAUIPRISM con MAUI
PRISM con MAUI
 
.NET MAUI Offline first
.NET MAUI Offline first .NET MAUI Offline first
.NET MAUI Offline first
 
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de Plataforma
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de PlataformaMAUIConf - Adios Net Maui Essentials Bienvenida Integración de Plataforma
MAUIConf - Adios Net Maui Essentials Bienvenida Integración de Plataforma
 
Servicios Nativos MAUI
Servicios Nativos MAUIServicios Nativos MAUI
Servicios Nativos MAUI
 
Aplicaciones para MacOS con .NET MAUI
Aplicaciones para MacOS con .NET MAUIAplicaciones para MacOS con .NET MAUI
Aplicaciones para MacOS con .NET MAUI
 
Primero pasos con Visual Studio for MAC
Primero pasos con Visual Studio for MACPrimero pasos con Visual Studio for MAC
Primero pasos con Visual Studio for MAC
 
Aplicaciones con web con Blazor + MudBlazor
Aplicaciones con web con Blazor + MudBlazorAplicaciones con web con Blazor + MudBlazor
Aplicaciones con web con Blazor + MudBlazor
 
Building Web Applications with Blazor and MudBlazor
Building Web Applications with Blazor and MudBlazorBuilding Web Applications with Blazor and MudBlazor
Building Web Applications with Blazor and MudBlazor
 
Tips para una entrevista Tech Exitosa
Tips para una entrevista Tech ExitosaTips para una entrevista Tech Exitosa
Tips para una entrevista Tech Exitosa
 
Metaverso y Microsoft Mesh
Metaverso y Microsoft MeshMetaverso y Microsoft Mesh
Metaverso y Microsoft Mesh
 
Mejoras en Blazor con .NET 6
Mejoras en Blazor con .NET 6Mejoras en Blazor con .NET 6
Mejoras en Blazor con .NET 6
 
Apis with dotnet postgreSQL and Apsaradb
Apis with dotnet postgreSQL and ApsaradbApis with dotnet postgreSQL and Apsaradb
Apis with dotnet postgreSQL and Apsaradb
 

Buenas practicas y código limpio en C#

  • 1. C# Buenas prácticas y código limpio Mteheran.dev
  • 2. Mteheran.dev • Solutions Architect • Microsoft MVP • Alibaba MVP • Avanet.org • Mteheran.dev
  • 3. Refinamiento o Refactoring Cambias estructuras de código, sintaxis o arquitectura para mejorar en: • Rendimiento • Lectura • Tamaño o líneas de código • Mantenibilidad • Eliminar deuda técnica • Seguridad
  • 4. Buenas prácticas Se refiere a los estándares que ya existen dentro del código para garantizar: • Rendimiento • Lectura • Tamaño o líneas de código • Mantenibilidad • Eliminar deuda técnica • Seguridad
  • 5. Código limpio Se refiere un código que ha pasado por refinamiento y sigue las mejores prácticas
  • 6. Tip #1 - Naming / Nombramiento Variables, Métodos, Clases, Interfaces Mal: int d; Bien: int daySinceModification;
  • 7. Tip #1 - Naming / Nombramiento Variables, Métodos, Clases, Interfaces Mal: public List<Users> getUsers() Bien: Public List<Users> GetActiveUsers()
  • 8. Tip #1 - Naming / Nombramiento Variables, Métodos, Clases, Interfaces Mal: public class ClassUser2 Bien: public class User
  • 9. Crea estándares, construyelos en equipo y siempre respetalos
  • 10. Tip #2 - Reduce código Mantén el código legible pero reducido y apoyate en LINQ Antes: if (active == true) { return CurrentActiveUsers; } Después: if (active) return CurrentActiveUsers;
  • 11. Tip #2 - Reduce código Mantén el código legible pero reducido y apoyate en LINQ Antes: foreach (var item in Users) { if(item.Name == UserName) return true; } Después: return Users.Any(item => item.Name == UserName);
  • 12. Cuando algo huele mal o no luce bien, revisalo 2 veces o pide una opinión
  • 14. Tip #3 - Utiliza las mejoras de C# C# 6, 7, 8, 9 tiene muchas mejoras que te ayudan a reducir el código y usar una mejor sintaxis Antes: string = “El resultado es ” + result; Después: string = $”El resultado es {result}”;
  • 15. Tip #3 - Utiliza las mejoras de C# Antes: if (CurrentDate != null) { if(CurrentDate.Year > 2020) return true; } Después: if(CurrentDate?.Year > 2020) return true;
  • 16. Tip #4 - Evita muchos parámetros Antes: public void CreateNewUser(string name, string lastname, int Id, string phone) Después: public void CreateNewUser(User newUser)
  • 17. Tip #5 - Clases con una sola responsabilidad Antes: public void SendEmailToListOfClients(string[] clients) { foreach (var client in clients) { var clientRecord = db.Find(client); if (clientRecord.IsActive()) { Email(client); } } }
  • 18. Tip #5 - Clases con una sola responsabilidad Después: public void SendEmailToListOfClients(string[] clients) { var activeClients = Clients.GetActiveClients(clients); Email(client); } public List<Client> GetActiveClients(string[] clients) { return db.Find(clients).Where(s => s.Status == "Active"); }
  • 19. Tip #6 - Encapsular Condiciones Antes: if (article.state == "published") { // ... } Después: if (article.IsPublished()) { // ... }
  • 20. Principio KISS Keep it simple Stupid Mantenlo simple siempre Fácil de entender, fácil de mantener
  • 21. Tip #7 - Comentarios
  • 22. Tip #7 - Comentarios ^((w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*)s*[;]{0,1}s*)+$ Las expresiones regulares son un buen ejemplo para comentar el código y explicar para que se usa
  • 23. Tip #8 - SOLID Principles
  • 24. Mitos que no son buenas práticas • Reducir el código al mínimo • Comentar todo • Utilizar regions para ordenar • Utiliza nomenclatura húngara • Manejar patrones de diseño en toda la arquitectura
  • 25. ¿Cómo conseguir un mejor código? • CodeReview • Definir estándares • Estudiar la sintaxis del lenguaje • Se cuidadoso con los nombramientos y ortografía • Escribir código en inglés • Apoyarse de los IDEs
  • 27. Curso buenas prácticas y código limpio https://www.udemy.com/course/csharp-cleancode/?couponCode=GRATIS couponCode=GRATIS
  • 28. Curso buenas prácticas y código limpio MEJOR PRECIO! https://www.udemy.com/course/csharp-cleancode/?couponCode=COMUNIDAD couponCode=COMUNIDAD