مرحبا يا هبر! يعتقد زميلنا سكوت هانسلمان أنه كجزء من تعلم لغة البرمجة ، من المهم ليس فقط كتابة التعليمات البرمجية وممارسة الكتابة ، ولكن أيضًا تعلم رمز شخص آخر. يقول سكوت: "اقرأ كود شخص آخر" ، ويستشهد بمواد مفيدة وجدها في عمل زميله. مزيد من التفاصيل تحت الخفض!
أمرر الكلمة إلى سكوت هانسلمان . هل تتفق معه؟
أفضل طريقة لتعلم لغة البرمجة ليست فقط كتابة المزيد من التعليمات البرمجية ، ولكن أيضًا
للتعرف على أمثلةها ! لن تكون هذه دائمًا أمثلة على كود مثالي ، والكثير مما تراه لن يكون مفيدًا ، ولكن هذه طريقة رائعة لتوسيع آفاقك.
أعتقد أن قراءة التعليمات البرمجية في الواقع لا تحظى بالاهتمام الواجب. ربما لا توجد قواعد تعليمات برمجية نظيفة كافية.
لذلك فوجئت بسرور عندما اكتشفت قاعدة رمز تسمى
جامعة جيمي بوجارد
كونتوسو .
يحتوي هذا المستودع على الكثير من المواد الجيدة ، لكنني لن أقول إنني قرأت كل شيء ومدروس كما نود. لدراسة كل شيء بالتفصيل ، تحتاج إلى قضاء اليوم كله. ومع ذلك ، فقد أحببت بعض النقاط ، وأخذت علما بها. من الواضح أن قطع الرموز الفردية مصنوعة بأسلوب جيمي ، حيث كتبها لنفسه.
هذا ليس عتابا على الإطلاق. بمرور الوقت ، نقوم جميعًا بتجميع القوالب وإنشاء المكتبات وتطوير أنماطنا المعمارية الخاصة. أحب حقيقة أن جيمي جمع تطورات مثيرة للاهتمام قام بها بنفسه أو بمشاركته على مر السنين ، وأعد مواد قراءة جيدة. يشير جيمي إلى أن
ContosoUniversityDotNetCore-Pages بها الكثير من الأشياء المفيدة:
يعمل الاستنساخ والتجميع بشكل جيد
سوف تفاجأ بمدى انخفاضي في بعض الأحيان. في كثير من الأحيان أقوم باستنساخ مستودع بوابة شخص آخر لم يتم اختباره في أي مكان. وأحصل على مكافأة للتنزيل في build.ps1 كل ما هو مطلوب.
.NET Core 2.x مثبت بالفعل على النظام الخاص بي ، يتلقى build.ps1 الحزم الضرورية ويقوم بإنشاء التعليمات البرمجية بالكامل.
هناك العديد من الآراء حول هذا المشروع. وهذا أمر رائع ، لأن هذه هي الطريقة التي أتعلم بها عن الأساليب والأدوات التي لم أستخدمها من قبل. إذا كان شخص ما يستخدم نهجًا غير قياسي ، فعندئذٍ لا توجد ضرورة من بين الأدوات القياسية!
- يستخدم Build.ps1 نمط بناء البرنامج النصي المأخوذ من PSake ، وهو أداة أتمتة بناء PowerShell.
- يضع التجميع في مجلد باسم قياسي.
- يستخدم Build.ps1 Roundhouse ، وهي أداة مساعدة لترحيل قاعدة البيانات لـ .NET تستخدم ملفات SQL والإصدارات التي تم إنشاؤها باستخدام أداة التحكم في إصدار projectroundhouse .
- تم تكوينه للتكامل المستمر في AppVeyor ، نظام CI / CD الممتاز الذي أستخدمه بنفسي.
- تستخدم أداة Octo.exe من OctopusDeploy لحزم العناصر.
كود منظم وواضح
في رأيي ، جميع التعليمات البرمجية سهلة القراءة. لقد بدأت مع Startup.cs لفهم فقط ما هو الوسيطة المستخدمة.
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>(); }); }
هنا أرى المكتبات والمساعدين المستخدمين ، على سبيل المثال ، AutoMapper و MediatR و HtmlTags. بعد ذلك ، يمكنني الذهاب إلى أقسام منفصلة ودراسة كل أداة.
مبرد صغير
لطالما أحببت أداة
MiniProfiler . تم إنشاء كنز .NET السري هذا لفترة طويلة وهو مفيد دائمًا في العمل.
لقد ذكرته في عام 2011! إنه موجود بشكل غير مرئي على صفحة الويب الخاصة بك ويوفر بيانات مفيدة حقًا حول سلوك الموقع وقيم وقت التشغيل الرئيسية.

من المستحسن استخدامه مع EF Core لرؤية أيضًا كود SQL الذي تم إنشاؤه. وكل شيء مضمن في الموقع أثناء إنشائه.

فقط رائع!
اختبارات الوحدة الواضحة
يستخدم Jimmy XUnit ، وأرى ملف
IntegrationTestBase في القائمة
. لا أفهم بعض النقاط ، على سبيل المثال ، تشغيل ملف
SliceFixture . أخذته إلى ملاحظة لفهم كل شيء بدقة. من غير المحتمل أن يتم إنشاء إنشاء مكتبة مساعدة اختبار جديدة هنا: نهج عالمي وجاد للغاية لاستخدامها في هذا القالب.
يستخدم جيمي
نمط CQRS (فصل مسؤولية استعلام الأوامر). في البداية ، يتم إنشاء الأمر Create وتشغيله ، ثم يتم تنفيذ الاستعلام لتأكيد النتائج. كل شيء واضح للغاية ، نحصل على اختبار منعزل للغاية.
[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); }
Fluidvalidation
يعد
fluentvalidation مكتبة مفيدة لإنشاء قواعد تحقق واضحة مع تحكم قوي في النوع. يستخدمه جيمي في كل مكان ويحصل على رمز تحقق واضح للغاية.
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(); } }
حلول مفيدة
دعونا نرى ما هي الأساليب التي يستخدمها مؤلف مشروع ملحق C #. وهذا يوضح ما يفتقر إليه ، في رأيه ، من الوظائف الأساسية. تتيح لك الطريقة إرجاع البيانات بتنسيق JSON من صفحات 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" }; } }
قائمة الترقيم
تساءلت دائمًا عما يجب فعله مع الطبقات المساعدة مثل PaginatedList. صغير جدًا للتغليف ، محدد جدًا للتضمين. ما رأيك؟
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); } }
أستمر في استكشاف مصادر الشفرة التي يمكنني العثور عليها. أحيط علما بالأشياء التي أحبها ، وألاحظ ما لا أعرفه أو لا أفهمه ، وأعد قائمة بالموضوعات للقراءة. أنصحك أن تفعل الشيء نفسه! شكرا ،
جيمي ، لكتابة
مثل هذا القالب الرائع الذي يمكننا قراءته وتعلمه!