مطالب
آشنایی با Refactoring - قسمت 13

یکی از مواردی که حین کار کردن با iTextSharp واقعا اعصاب خردکن است، طراحی نامناسب ثوابت این کتابخانه می‌باشد. برای مثال:


public class PdfWriter
{
/** A viewer preference */
public const int PageLayoutSinglePage = 1;
/** A viewer preference */
public const int PageLayoutOneColumn = 2;
/** A viewer preference */
public const int PageLayoutTwoColumnLeft = 4;
/** A viewer preference */
public const int PageLayoutTwoColumnRight = 8;
/** A viewer preference */
public const int PageLayoutTwoPageLeft = 16;
/** A viewer preference */
public const int PageLayoutTwoPageRight = 32;

// page mode (section 13.1.2 of "iText in Action")

/** A viewer preference */
public const int PageModeUseNone = 64;
/** A viewer preference */
public const int PageModeUseOutlines = 128;
/** A viewer preference */
public const int PageModeUseThumbs = 256;
/** A viewer preference */
public const int PageModeFullScreen = 512;
/** A viewer preference */
public const int PageModeUseOC = 1024;
/** A viewer preference */
public const int PageModeUseAttachments = 2048;

//...
//...
}

6 ثابت اول مربوط به گروه PageLayout هستند و 6 ثابت دوم به گروه PageMode ارتباط دارند و این کلاس پر است از این نوع ثوابت (این کلاس نزدیک به 3200 سطر است!). این نوع طراحی نامناسب است. بجای گروه بندی خواص یا ثوابت با یک پیشوند، مثلا PageLayout یا PageMode، این‌ها را به کلاس‌ها یا در اینجا (حین کار با ثوابت عددی) به enum‌های متناظر خود منتقل و Refactor کنید. مثلا:

public enum ViewerPageLayout
{
SinglePage = 1,
OneColumn = 2,
TwoColumnLeft = 4,
TwoColumnRight = 8,
TwoPageLeft = 16,
TwoPageRight = 32
}

مزیت‌ها:
- طبقه بندی منطقی ثوابت در یک enum و گروه بندی صحیح آن‌ها، بجای گروه بندی توسط یک پیشوند
- استفاده بهینه از intellisense در visual studio
- منسوخ سازی استفاده از اعداد بجای معرفی ثوابت خصوصا عددی (در این کتابخانه شما می‌توانید بنویسید PdfWriter.PageLayoutSinglePage و یا 1 و هر دو صحیح هستند؛ این خوب نیست. ترویج استفاده از اصطلاحا magic numbers هم حین طراحی یک کتابخانه مذموم است.)
- کم شدن حجم کلاس اولیه (مثلا کلاس PdfWriter در اینجا) و در نتیجه نگهداری ساده‌تر آن در طول زمان

بازخوردهای پروژه‌ها
موقع ویرایش کاربر خطا داره
با سلام
با تشکراز پروژه خوبتون
من پروژه رو اجرا کردم موقعی که روی دگمه ویرایش کاربران کلیک میکنم خطای زیر رو بهم نشون میده
 LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

 هرچی تلاش کردم متوجه نشدم که دقیقا از کجا خطا میگیره و فقط میدونم که از متد GetUserByRoles موقع Map کردنش به EditUserViewModel  ایراد می‌گیره

 public Task<EditUserViewModel> GetUserByRoles(int id)
        {
            return _users.AsNoTracking()
                    .Include(a => a.Roles)
                    .Project(_mappingEngine)
                    .To<EditUserViewModel>()
                    .FirstOrDefaultAsync(a => a.Id == id);
           
               
        }

اشتراک‌ها
پیاده سازی یک پروژه مدیریت رزومه‌ها با React18 و ASP.NET Core7 WebAPI

Resume Management project with React18, ASP.NET Core7 WebAPI, TypeScript and Entity Framework Core
In this video, we will create a Fullstack Resume Management project using React18, ASP.NET Core WebAPI  (.NET 7),TypeScript and Entity Framework Core. The focus of this project is to show you how you can build a Fullstack project from 0 to 100 and build a simple CRUD application with ASP.NET Core WebAPI .
 

پیاده سازی یک پروژه مدیریت رزومه‌ها با React18 و ASP.NET Core7 WebAPI
اشتراک‌ها
پیاده سازی یک پروژه با React18 و ASP.NET Core7 WebAPI

Pet Store Fullstack project with React18, ASP.NET Core7 WebAPI, TypeScript and Entity Framework Core
In this video, we will create a Fullstack Pet Store project using React18, ASP.NET Core WebAPI  (.NET 7),TypeScript and Entity Framework Core. The focus of this project is to show you how you can build a Fullstack project from 0 to 100 and build a simple CRUD application with ASP.NET Core WebAPI . 

پیاده سازی یک پروژه با React18 و ASP.NET Core7 WebAPI
اشتراک‌ها
در C# 11 اگر نام نوعی را با حروف تمام کوچک وارد کنید، اخطار دریافت خواهید کرد

C# 11 is the next version of C# coming in .NET 7, and it is introducing a warning wave that issues a warning when a type is declared with all lower-case letters. This is being done so that in the future the language can begin moving away from conditional keywords and instead use full on keywords instead. The warning is alerting customers to types that may become keywords in future versions. 

در C# 11 اگر نام نوعی را با حروف تمام کوچک وارد کنید، اخطار دریافت خواهید کرد
اشتراک‌ها
نام اندروید Q به اندروید ۱۰ تغییر کرد

Over the last decade, Android's open platform has created a thriving community of manufacturers and developers that reach a global audience with their devices and apps. This has expanded beyond phones to tablets, cars, watches, TVs and more—with more than 2.5 billion active devices around the world. As we continue to build Android for everyone in the community, our brand should be as inclusive and accessible as possible—and we think we can do better in a few ways. 

نام اندروید Q به اندروید ۱۰ تغییر کرد
اشتراک‌ها
نوشتن متد های با معنی و خوانا در #C - نام گذاری های با معنی

We developers spend lot of our time reading code. We read code so that we know how to change it to implement a new feature, fix a bug, etc. It is much better to work in a code base where code is easy to read and understand.

One thing that can make code readable is good naming. Giving variables, classes, and methods good names makes code easier to read. 

نوشتن متد های  با معنی و خوانا در #C - نام گذاری های با معنی
اشتراک‌ها
Json.NET 8.0 منتشر شد

To reduce allocations and memory usage when serializing Json.NET 8.0 adds a new IArrayPool interface. Json.NET is already very lean when it comes to allocations, working with raw characters on array buffers instead of allocated strings, but those buffers can easily grow large, and a new buffer is created each time JSON is read or written. IArrayPool allows array buffers to be reused, similar to connection pooling with a database, or thread pooling in .NET. 

Json.NET 8.0 منتشر شد
اشتراک‌ها
کتابخانه JSIL
JSIL is a compiler that transforms .NET applications and libraries from their native executable format - CIL bytecode - into standards-compliant, cross-browser JavaScript. You can take this JavaScript and run it in a web browser or any other modern JavaScript runtime. Unlike other cross-compiler tools targeting JavaScript, JSIL produces readable, easy-to-debug JavaScript that resembles the code a developer might write by hand, while still maintaining the behavior and structure of the original .NET code.  Demo
کتابخانه JSIL
نظرات مطالب
تغییر نام دسته جمعی تعدادی فایل PDF بر اساس متادیتای فایل‌ها
بستگی داره چه تعداد رشته رو قراره با هم جمع بزنید. اگر 10هزار مورد است، استفاده از StringBuilder می‌تونه مفید باشه؛ اما اگر فقط سه قطعه است (مانند تشکیل newFile در مثال بالا)، تفاوتی را در کارآیی احساس نخواهید کرد؛ ضمن اینکه سربار تولید و وهله سازی StringBuilder برای اتصال فقط سه قطعه با هم می‌تونه تا چهار برابر حالت‌های معمولی باشه (مراجعه کنید به قسمت ابتدای نمودار مقاله Performance considerations for strings ؛ در این نمودار، تفاوت پس از اتصال 600 قطعه به هم، خودش رو نشون می‌ده.)