Halo, Habr! Rekan kami, Scott Hanselman, percaya bahwa sebagai bagian dari belajar bahasa pemrograman, penting tidak hanya untuk kode dan berlatih menulis, tetapi juga untuk mempelajari kode orang lain. "Baca kode orang lain," kata Scott, dan mengutip bahan berguna yang ia temukan dalam karya rekannya. Lebih detail di bawah cut!
Saya melewati lantai untuk Scott Hanselman . Apakah Anda setuju dengannya?
Pendekatan terbaik untuk belajar bahasa pemrograman tidak hanya untuk menulis lebih banyak kode, tetapi juga untuk
berkenalan dengan contoh-contohnya ! Ini tidak akan selalu menjadi contoh kode teladan, dan banyak dari apa yang Anda lihat tidak akan berguna, tetapi ini adalah cara yang bagus untuk memperluas wawasan Anda.
Saya percaya bahwa sebenarnya membaca kode tidak diperhatikan. Mungkin tidak ada basis kode bersih yang cukup.
Jadi saya terkejut ketika saya menemukan basis kode bernama Jimmy Bogard
Contoso University .
Repositori ini memiliki banyak materi bagus, tetapi saya tidak akan mengatakan bahwa saya membaca semuanya dan dengan serius seperti yang kita inginkan. Untuk mempelajari semuanya secara terperinci, Anda harus menghabiskan sepanjang hari. Namun, saya menyukai beberapa poin, dan mencatatnya. Potongan-potongan kode individual jelas dibuat dengan gaya Jimmy, saat ia menulisnya sendiri.
Ini sama sekali bukan cela. Seiring waktu, kita semua mengumpulkan template, membuat perpustakaan, dan mengembangkan gaya arsitektur kita sendiri. Saya suka fakta bahwa Jimmy mengumpulkan perkembangan menarik yang dibuat sendiri atau dengan partisipasinya selama bertahun-tahun, dan menyiapkan bahan bacaan yang bagus. Jimmy mencatat bahwa
ContosoUniversityDotNetCore-Pages memiliki banyak hal berguna:
Kloning dan perakitan bekerja dengan sangat baik
Anda akan terkejut betapa rendahnya saya terkadang menurunkan bilah. Sangat sering saya mengkloning git repositori orang lain yang belum diuji di mana pun. Dan saya mendapatkan bonus untuk mengunduh semua yang diperlukan di build.ps1.
.NET Core 2.x sudah diinstal pada sistem saya, build.ps1 menerima paket yang diperlukan dan sepenuhnya membangun kode.
Ada banyak pendapat tentang proyek ini. Dan ini luar biasa, karena ini adalah cara saya belajar tentang metode dan alat yang belum pernah saya gunakan sebelumnya. Jika seseorang menggunakan pendekatan non-standar, maka di antara alat standar tidak perlu!
- Build.ps1 menggunakan gaya skrip build yang diambil dari PSake , alat otomasi build PowerShell.
- Ini menempatkan perakitan dalam folder dengan nama standar ./artifacts.
- Build.ps1 menggunakan Roundhouse , utilitas migrasi database untuk .NET yang menggunakan file SQL dan versi yang dibuat menggunakan alat kontrol versi projectroundhouse .
- Ini dikonfigurasi untuk integrasi berkesinambungan ke AppVeyor , sistem CI / CD yang sangat baik yang saya gunakan sendiri.
- Dia menggunakan alat Octo.exe dari OctopusDeploy untuk mengemas artefak.
Kode tertib dan jelas
Menurut saya, semua kode sangat mudah dibaca. Saya mulai dengan Startup.cs untuk memahami middleware apa yang sedang digunakan.
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>(); }); }
Di sini saya melihat perpustakaan dan pembantu yang digunakan, misalnya, AutoMapper, MediatR, dan HtmlTags. Selanjutnya, saya bisa masuk ke bagian yang terpisah dan mempelajari setiap alat.
Miniprofiler
Saya selalu menyukai alat
MiniProfiler . Harta karun .NET rahasia ini telah dibuat untuk waktu yang lama dan selalu bermanfaat dalam pekerjaan.
Saya menyebutkan dia kembali pada 2011! Ini tidak terlihat hadir di halaman web Anda dan memberikan data yang SANGAT berguna tentang perilaku situs dan nilai runtime kunci.

Dianjurkan untuk menggunakannya dengan EF Core untuk melihat juga kode SQL yang dihasilkan. Dan semuanya tertanam di situs saat dibuat.

Luar biasa!
Hapus unit test
Jimmy menggunakan XUnit, dan saya melihat file
IntegrationTestBase dalam daftar
. Saya tidak mengerti beberapa poin, misalnya, pengoperasian file
SliceFixture . Membawanya ke catatan untuk mengerti segalanya. Tidak mungkin bahwa penciptaan perpustakaan bantu pengujian baru diluncurkan di sini: pendekatan yang terlalu universal dan serius untuk menggunakannya dalam templat ini.
Jimmy menggunakan pola
CQRS (Command Query Responsibility Segregation). Pada awalnya, perintah Buat dibuat dan dijalankan, kemudian kueri dijalankan untuk mengkonfirmasi hasil. Semuanya sangat jelas, kami mendapatkan tes yang sangat terisolasi.
[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); }
Validasi Fluid
fluentvalidation adalah pustaka yang berguna untuk membuat aturan validasi yang jelas dengan kontrol tipe yang kuat. Jimmy menggunakannya di mana-mana dan mendapatkan kode verifikasi yang sangat jelas.
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(); } }
Solusi yang berguna
Mari kita lihat metode apa yang digunakan ekstensi proyek C # oleh penulis. Ini menunjukkan apa yang menurutnya kurang dalam fungsi dasar. Metode ini memungkinkan Anda untuk mengembalikan data dalam format JSON dari Halaman Razor.
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" }; } }
Daftar paginasi
Saya selalu bertanya-tanya apa yang harus dilakukan dengan kelas pembantu seperti PaginatedList. Terlalu kecil untuk pengemasan, terlalu spesifik untuk disematkan. Apa yang kamu pikirkan
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); } }
Saya terus mengeksplorasi sumber kode yang dapat saya temukan. Saya mencatat hal-hal yang saya sukai, perhatikan apa yang saya tidak tahu atau tidak mengerti, dan membuat daftar topik untuk dibaca. Saya akan menyarankan Anda untuk melakukan hal yang sama! Terima kasih,
Jimmy , untuk menulis
template kode yang luar biasa sehingga kita dapat membaca dan belajar!