¿Qué se puede encontrar en el código de otra persona? Una selección de materiales útiles para .NET

Hola Habr! Nuestro colega, Scott Hanselman, cree que, como parte del aprendizaje de un lenguaje de programación, es importante no solo codificar y practicar la escritura, sino también aprender el código de otra persona. "Lee el código de otra persona", dice Scott, y cita material útil que encontró en el trabajo de su colega. Más detalles debajo del corte!



Le paso la palabra a Scott Hanselman . ¿Estás de acuerdo con él?

¡El mejor enfoque para aprender un lenguaje de programación es no solo escribir más código, sino también familiarizarse con sus ejemplos ! Estos no siempre serán ejemplos de código ejemplar, y gran parte de lo que ve no será útil, pero esta es una excelente manera de ampliar sus horizontes.

Creo que, de hecho, la lectura del código no recibe la debida atención. Quizás no haya suficientes bases de código limpias.

Así que me sorprendió gratamente cuando descubrí una base de código llamada Jimmy Bogard Contoso University .

Este repositorio tiene mucho material bueno, pero no diré que lo leí todo y tan cuidadosamente como quisiéramos. Para estudiar todo en detalle, debe pasar todo el día. Sin embargo, me gustaron algunos puntos y tomé nota de ellos. Las piezas individuales de código están claramente hechas al estilo de Jimmy, tal como las escribió él mismo.

Esto no es un reproche en absoluto. Con el tiempo, todos acumulamos plantillas, creamos bibliotecas y desarrollamos nuestros propios estilos arquitectónicos. Me gusta el hecho de que Jimmy recopiló desarrollos interesantes realizados por él mismo o con su participación a lo largo de los años, y preparó un buen material de lectura. Jimmy señala que ContosoUniversityDotNetCore-Pages tiene muchas cosas útiles:


La clonación y el ensamblaje funcionan bastante bien


Te sorprenderá lo bajo que a veces bajo la barra. Muy a menudo clono el repositorio git de otra persona que no ha sido probado en ningún lado. Y obtengo una bonificación por descargar en build.ps1 todo lo que se necesita. .NET Core 2.x ya está instalado en mi sistema , build.ps1 recibe los paquetes necesarios y construye completamente el código.

Hay muchas opiniones sobre este proyecto. Y esto es genial, porque así es como aprendo sobre métodos y herramientas que no he usado antes. Si alguien usa un enfoque no estándar, entonces, entre las herramientas estándar, ¡no es necesario!

  • Build.ps1 utiliza un estilo de script de compilación tomado de PSake , una herramienta de automatización de compilación de PowerShell.
  • Coloca el ensamblaje en una carpeta con el nombre estándar ./artifacts.
  • Build.ps1 usa Roundhouse , una utilidad de migración de bases de datos para .NET que usa archivos SQL y versiones creadas con la herramienta de control de versiones projectroundhouse .
  • Está configurado para una integración continua en AppVeyor , el excelente sistema CI / CD que utilizo yo mismo.
  • Ella usa la herramienta Octo.exe de OctopusDeploy para empacar artefactos.

Código ordenado y claro


En mi opinión, todo el código es muy fácil de leer. Comencé con Startup.cs para entender qué middleware se está utilizando.

public void ConfigureServices(IServiceCollection services) { services.AddMiniProfiler().AddEntityFramework(); services.AddDbContext<SchoolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddAutoMapper(typeof(Startup)); services.AddMediatR(typeof(Startup)); services.AddHtmlTags(new TagConventions()); services.AddMvc(opt => { opt.Filters.Add(typeof(DbContextTransactionPageFilter)); opt.Filters.Add(typeof(ValidatorPageFilter)); opt.ModelBinderProviders.Insert(0, new EntityModelBinderProvider()); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddFluentValidation(cfg => { cfg.RegisterValidatorsFromAssemblyContaining<Startup>(); }); } 

Aquí veo las bibliotecas y ayudantes utilizados, por ejemplo, AutoMapper, MediatR y HtmlTags. A continuación, puedo ir a secciones separadas y estudiar cada herramienta.

Miniprofiler


Siempre me ha gustado la herramienta MiniProfiler . Este tesoro secreto de .NET se ha creado durante mucho tiempo y siempre es útil en el trabajo. ¡Lo mencioné en 2011! Está invisible en su página web y proporciona datos REALMENTE útiles sobre el comportamiento del sitio y los valores clave de tiempo de ejecución.



Es recomendable usarlo con EF Core para ver también el código SQL generado. Y todo está incrustado en el sitio a medida que se crea.



Simplemente genial!

Pruebas unitarias claras


Jimmy usa XUnit, y veo el archivo IntegrationTestBase en la lista . No entiendo algunos puntos, por ejemplo, el funcionamiento del archivo SliceFixture . Lo llevó a una nota para comprender completamente todo. Es poco probable que se inicie la creación de una nueva biblioteca auxiliar de prueba aquí: un enfoque demasiado universal y serio para usarla en esta plantilla.

Jimmy utiliza el patrón CQRS ( segmentación de responsabilidad de consulta de comando). Al principio, se crea y ejecuta el comando Crear, luego se ejecuta una consulta para confirmar los resultados. Todo está muy claro, tenemos una prueba muy aislada.

 [Fact] public async Task Should_get_edit_details() { var cmd = new Create.Command { FirstMidName = "Joe", LastName = "Schmoe", EnrollmentDate = DateTime.Today }; var studentId = await SendAsync(cmd); var query = new Edit.Query { Id = studentId }; var result = await SendAsync(query); result.FirstMidName.ShouldBe(cmd.FirstMidName); result.LastName.ShouldBe(cmd.LastName); result.EnrollmentDate.ShouldBe(cmd.EnrollmentDate); } 

Validación de fluidos


validación fluida es una biblioteca útil para crear reglas de validación claras con un fuerte control de tipo. Jimmy lo usa en todas partes y obtiene un código de verificación extremadamente claro.

 public class Validator : AbstractValidator<Command> { public Validator() { RuleFor(m => m.Name).NotNull().Length(3, 50); RuleFor(m => m.Budget).NotNull(); RuleFor(m => m.StartDate).NotNull(); RuleFor(m => m.Administrator).NotNull(); } } 

Soluciones utiles


Veamos qué métodos utiliza la extensión del proyecto C # por el autor. Esto muestra lo que, en su opinión, carece de la funcionalidad básica. El método le permite devolver datos en formato JSON desde Razor Pages.

 public static class PageModelExtensions { public static ActionResult RedirectToPageJson<TPage>(this TPage controller, string pageName) where TPage : PageModel { return controller.JsonNet(new { redirect = controller.Url.Page(pageName) } ); } public static ContentResult JsonNet(this PageModel controller, object model) { var serialized = JsonConvert.SerializeObject(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return new ContentResult { Content = serialized, ContentType = "application/json" }; } } 

Lista paginada


Siempre me pregunté qué hacer con las clases auxiliares como PaginatedList. Demasiado pequeño para el embalaje, demasiado específico para incrustar. Que piensas

 public class PaginatedList<T> : List<T> { public int PageIndex { get; private set; } public int TotalPages { get; private set; } public PaginatedList(List<T> items, int count, int pageIndex, int pageSize) { PageIndex = pageIndex; TotalPages = (int)Math.Ceiling(count / (double)pageSize); this.AddRange(items); } public bool HasPreviousPage { get { return (PageIndex > 1); } } public bool HasNextPage { get { return (PageIndex < TotalPages); } } public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize) { var count = await source.CountAsync(); var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(); return new PaginatedList<T>(items, count, pageIndex, pageSize); } } 

Sigo explorando cualquier fuente de código que pueda encontrar. Tomo nota de las cosas que me gustan, noto lo que no sé o no entiendo, y hago una lista de temas para leer. ¡Te aconsejaría que hagas lo mismo! ¡Gracias, Jimmy , por escribir una plantilla de código tan genial que podemos leer y aprender!

Source: https://habr.com/ru/post/es418519/


All Articles