توی زبان برنامه نویسی Go شما توانایی هندل کردن Exception ها رو به صورت try catch ندارید یعنی اصلا سینتکسی در اون وجود نداره که بخواهید خطاهایی که رخ میده رو catch کنید، این یعنی همه ی خطاهارو باید موقع خروجی گرفتن از توابع هندل کنید و همیشه شرط بذارید، اینکار اشتباه نیست برای همین رعایت ها زبان گو پرفورمنس بسیار بالایی داره.
یه بحثی بود قبلا کرده بودم که throw exception کردن برای اینکه به کاربرامون بفهمونیم خطای ولیدیشن دارن یا خطاهای user friendly خوردن صحیح نیست. چندتا نکته:
1.خطا throw کردن به صورت دستی وقتی یک نفر api شمارو صدا میزنه باعث ایجاد وقفه توی سیستم شما میشه و پردازش های Cpu و Ram رو بیشتر می کنه.
2.کلا استفاده از try و catch پروفورمنس کد شمارو پایین میاره حتی اگر به خطا نخورید و چیزی throw نشه.
3.خوانایی کد رو پایین میاره و فانکشنالیتی کد شمارو بهم میریزه.
حالا توی زبان برنامه نویسی Go یکم از اون ور پشت بوم افتاده چون وقتی سیستم به خطایی بخوره که هندل نشده اپ شما کرش می کنه یعنی به برنامه نویس ها میگن شما باید در هر صورت جلوی رخ دادن خطا رو بگیرید و موقع مواجه با استثناها شما عملا باید اپ رو مجدد اجرا کنید و ریسک این نوع برنامه نویسی هم بالاست چون اگر یک درخواست از سمت کلاینت بتونه روی سرور شما exception ایجاد کنه، بوم!!
من بهتون پیشنهاد میکنم خوبی های هر کدوم رو داشته باشید و فقط وقتی throw exception کنید که واقعا لازمه و تا جایی که میتونید استفاده از try catch رو توی کدهاتون کم کنید.
@CSharpTips
یه بحثی بود قبلا کرده بودم که throw exception کردن برای اینکه به کاربرامون بفهمونیم خطای ولیدیشن دارن یا خطاهای user friendly خوردن صحیح نیست. چندتا نکته:
1.خطا throw کردن به صورت دستی وقتی یک نفر api شمارو صدا میزنه باعث ایجاد وقفه توی سیستم شما میشه و پردازش های Cpu و Ram رو بیشتر می کنه.
2.کلا استفاده از try و catch پروفورمنس کد شمارو پایین میاره حتی اگر به خطا نخورید و چیزی throw نشه.
3.خوانایی کد رو پایین میاره و فانکشنالیتی کد شمارو بهم میریزه.
حالا توی زبان برنامه نویسی Go یکم از اون ور پشت بوم افتاده چون وقتی سیستم به خطایی بخوره که هندل نشده اپ شما کرش می کنه یعنی به برنامه نویس ها میگن شما باید در هر صورت جلوی رخ دادن خطا رو بگیرید و موقع مواجه با استثناها شما عملا باید اپ رو مجدد اجرا کنید و ریسک این نوع برنامه نویسی هم بالاست چون اگر یک درخواست از سمت کلاینت بتونه روی سرور شما exception ایجاد کنه، بوم!!
من بهتون پیشنهاد میکنم خوبی های هر کدوم رو داشته باشید و فقط وقتی throw exception کنید که واقعا لازمه و تا جایی که میتونید استفاده از try catch رو توی کدهاتون کم کنید.
@CSharpTips
نوشتن ابزار هایی که جلوی اشتباهات برنامه نویس هارو بگیره موقع اجرا بیشتر باعث صرف جویی میشه تا اینکه کدهاتون کلین باشه، منظورم این نیست که کلین کد در اولویت نیست منظورم اینه که اولویت اول نیست، توی پروژه اینترپرایز در مدیریت بالای 50 میکروسرویس اگر تعداد برنامه نویسها کمه مثلا 5 نفر😒! و سرعت توسعه و اضافه کردن فیچر ها و رفع باگ ها خیلی زیاده، ابزار ها مهمه.
مثلا:
1.جلوگیری از اشتباهات در کانفیگ ها مثلا کلید هایی که دیگه توی کانفیگ استفاده نمیشن حذف بشن تا کانفیگ ها کلین بمونن و شلوغ نشن.
2.جلوگیری از اشتباهات برنامه نویس ها در اجرای تست کیس ها، مثلا کانفیگ رو بذارن رو لایو و شروع کنن به اجرای تست کیس ها 😒😂
3.جلوگیری از اشتباهات پابلیش، به جای اینکه روی تست بفرستن، روی لایو بفرستن !!
4.جلوگیری از اجرای اتو مایگریشن ها روی لایو
5.جلوگیری از اینکه دیتابیس رو تغییر بدن و یادشون بره مایگریشن بزنن
6.جلوگیری از اینکه مپر های لوپ بزنن و باعث بوجود اومدن خطا های استک اور فلو بشن که پیدا کردنش شکستن شاخ غول میخواد
7.همیشه علاوه بر سرور بلو و گرین یک بلک هم داشته باشید که دقیقا مثل لایو باشه ولی فقط داخل شرکت کاربرد داشته باشه که دیتابیسش کاملا مجزاست و استفاده ی بیزینسی نداره و برای تسته اما داده ها لایوه، اونوقت تست های دیتابیسی و مایگریشن و پچ و ... رو ابتدا روی اون انجام بدید تا مطمئن بشید همه چیز به خوبی کار می کنه.
8.همیشه یک کلیک بهتر از ده کلیکه، پس به جای کامند زدن سعی کنید ابزار داشته باشید که کارتون سریع باشه برای همینه که ویندوز ابزار هایی که UI داره کاربردش خیلی سریعتره تا سیستم عاملی که فقط کامند قبول می کنه.مثلا به جای استفاده ممتد از گیت clr از گیتهاب دسکتاپ استفاده کنید و با یک یا دو کلیک همه چیز رو هندل کنید.به جای اینکه روی کیبرد صد تا کلیک بزنید تا به مرادتون برسید (سیستم عامل رو شما نساختید پس روش تعصب نداشته باشید و برای وقتتون ارزش قائل بشید)
9.کارهارو اتوماتیک کنید و از انجام کارهای دستی جلوگیری کنید.هرچی کارها اتوماتیک تر بشه و محاسباتش توسط کامپیوتر انجام بشه ایجاد خطاهای انسانی کمتر میشه.
10.اگر با دیتابیس ممکنه سرو کار داشته باشید و بخواید توش کوئری بزنید همیشه یک یوزر ReadOnly بسازید و مطمئن بشید که روی لایو کوئری های ویرایشی سهوا اجرا نمیشن.
@CsharpTips
مثلا:
1.جلوگیری از اشتباهات در کانفیگ ها مثلا کلید هایی که دیگه توی کانفیگ استفاده نمیشن حذف بشن تا کانفیگ ها کلین بمونن و شلوغ نشن.
2.جلوگیری از اشتباهات برنامه نویس ها در اجرای تست کیس ها، مثلا کانفیگ رو بذارن رو لایو و شروع کنن به اجرای تست کیس ها 😒😂
3.جلوگیری از اشتباهات پابلیش، به جای اینکه روی تست بفرستن، روی لایو بفرستن !!
4.جلوگیری از اجرای اتو مایگریشن ها روی لایو
5.جلوگیری از اینکه دیتابیس رو تغییر بدن و یادشون بره مایگریشن بزنن
6.جلوگیری از اینکه مپر های لوپ بزنن و باعث بوجود اومدن خطا های استک اور فلو بشن که پیدا کردنش شکستن شاخ غول میخواد
7.همیشه علاوه بر سرور بلو و گرین یک بلک هم داشته باشید که دقیقا مثل لایو باشه ولی فقط داخل شرکت کاربرد داشته باشه که دیتابیسش کاملا مجزاست و استفاده ی بیزینسی نداره و برای تسته اما داده ها لایوه، اونوقت تست های دیتابیسی و مایگریشن و پچ و ... رو ابتدا روی اون انجام بدید تا مطمئن بشید همه چیز به خوبی کار می کنه.
8.همیشه یک کلیک بهتر از ده کلیکه، پس به جای کامند زدن سعی کنید ابزار داشته باشید که کارتون سریع باشه برای همینه که ویندوز ابزار هایی که UI داره کاربردش خیلی سریعتره تا سیستم عاملی که فقط کامند قبول می کنه.مثلا به جای استفاده ممتد از گیت clr از گیتهاب دسکتاپ استفاده کنید و با یک یا دو کلیک همه چیز رو هندل کنید.به جای اینکه روی کیبرد صد تا کلیک بزنید تا به مرادتون برسید (سیستم عامل رو شما نساختید پس روش تعصب نداشته باشید و برای وقتتون ارزش قائل بشید)
9.کارهارو اتوماتیک کنید و از انجام کارهای دستی جلوگیری کنید.هرچی کارها اتوماتیک تر بشه و محاسباتش توسط کامپیوتر انجام بشه ایجاد خطاهای انسانی کمتر میشه.
10.اگر با دیتابیس ممکنه سرو کار داشته باشید و بخواید توش کوئری بزنید همیشه یک یوزر ReadOnly بسازید و مطمئن بشید که روی لایو کوئری های ویرایشی سهوا اجرا نمیشن.
@CsharpTips
از پیچیدگی هسته هراسان نباشید، هسته همیشه پیچیدگی خودش رو خواهد داشت، نحوه ی استفاده از Component شما بسیار مهمه.برای مثال در طراحی ماشین باید براتون خیلی مهم باشه که فرمون جای راحتی باشه، قابل دسترسی باشه، نرم باشه دنده در جای خودش باشه و حتی حذف بشه! کامپیوتر جلوی چشم باشه و گاز و ترمز در جای مناسب و استفاده اش آسون باشه ولی وقتی موتور ماشین رو پیاده سازی می کنید نمیشه براش جای صندلی برای نشستن بذارید یا مثل دنده و فرمون زیبا و زینت بهش بدید و انتظار داشته باشید کسی که پشت فرمون میشینه از موتور ماشین هم سردربیاره.
هسته ی ابزار ها توی برنامه نویسی همیشه مثل موتور ماشین پیچیدگی خودش رو خواهد داشت، یادگیریش سخت خواهد بود بخاطر اینکه ده ها و صد ها و هزاران چیز دارن تبدیل میشن به چهار تا چیز که کارش برای End User راحت باشه.شما هسته ی دات نت یا EF رو ببینید باید در مورد IL و Expression و Reflection ها خیلی چیزها بدونین و مسلط باشید.با این ها میتونید ابزار ها و هسته هایی بسازید که کار برنامه نویس های توسعه دهنده و حتی جونیور هم راحت بشه ولی انتظار نداریم که یک جونیور براحتی بفهمه داخل هسته داره چه اتفاقی میوفته.
هرچی که بخواید کار برنامه نویس استفاده کننده از ابزار شما آسون تر بشه، بخاطر رعایت مسائل پرفورمنس و مموری و OOP و ... شما هسته رو پیچیده تر طراحی خواهید کرد، مثل جویدن لقمه برای نوزادی میمونه که خودش توانایی انجام اینکار رو نداره و شما هم ازش این انتظار رو ندارید.
@CSharpTips
هسته ی ابزار ها توی برنامه نویسی همیشه مثل موتور ماشین پیچیدگی خودش رو خواهد داشت، یادگیریش سخت خواهد بود بخاطر اینکه ده ها و صد ها و هزاران چیز دارن تبدیل میشن به چهار تا چیز که کارش برای End User راحت باشه.شما هسته ی دات نت یا EF رو ببینید باید در مورد IL و Expression و Reflection ها خیلی چیزها بدونین و مسلط باشید.با این ها میتونید ابزار ها و هسته هایی بسازید که کار برنامه نویس های توسعه دهنده و حتی جونیور هم راحت بشه ولی انتظار نداریم که یک جونیور براحتی بفهمه داخل هسته داره چه اتفاقی میوفته.
هرچی که بخواید کار برنامه نویس استفاده کننده از ابزار شما آسون تر بشه، بخاطر رعایت مسائل پرفورمنس و مموری و OOP و ... شما هسته رو پیچیده تر طراحی خواهید کرد، مثل جویدن لقمه برای نوزادی میمونه که خودش توانایی انجام اینکار رو نداره و شما هم ازش این انتظار رو ندارید.
@CSharpTips
در راستای توضیح هسته:
این دو تابع دوتا ورودی فانکشن رو با هم And و Or میکنن و تبدیل به یک func می کنن.
نحوه ی استفاده از Expression ها برای And و Or کردن دو Func ورودی که جلوتر توضیح خواهم داد.
#Expression
#CSharp
@CSharpTips
این دو تابع دوتا ورودی فانکشن رو با هم And و Or میکنن و تبدیل به یک func می کنن.
نحوه ی استفاده از Expression ها برای And و Or کردن دو Func ورودی که جلوتر توضیح خواهم داد.
#Expression
#CSharp
@CSharpTips
C# Programming Guide
در راستای توضیح هسته: این دو تابع دوتا ورودی فانکشن رو با هم And و Or میکنن و تبدیل به یک func می کنن. نحوه ی استفاده از Expression ها برای And و Or کردن دو Func ورودی که جلوتر توضیح خواهم داد. #Expression #CSharp @CSharpTips
تابع OrAlso که در تصویر می بینید در اصل دو فانکشن میگیره و اونارو با هم Or میکنه و تبدیل به یک فانکشن به صورت Experssion میکنه به طوری که برای ORM هایی مثل EF Core قابلیت تبدیل به کوئری های دیتابیس رو داره.
حالا چطوری یاد بگیریم که با Experssion ها کار کنیم و باهاش چیزای جالبی خلق کنیم؟
چندتا قانون رو باید در نظر بگیرید:
1.اینکه Experssion ها دقیقا مثل کد نویسی شما نیستند بنابراین انتظار نداشته باشید بدون اینکه به Experssion بگید که این قسمت کدم باید اجرا بشه و نتیجه اش مقایسه بشه به صورت جادو وار خودش بفهمه.پس صدا زدن Expression.Invoke مهمه.
2.اگر Experssion رو کامپایل کنید بهتون خروجی delegate رو میده پس حواستون باشه که اگر کامپایلش کنید دیگه ORM نمیتونه تبدیلش کنه به کوئری دیتابیس.منظور از کامپایل کردن صدا زدن تابع Compile هست.
3.و اینکه Experssion ها توابع قابل تبدیل و ترجمه شدن در Runtime هستند که چون توی یک delegate به صورت خیلی ساده و مستقیم نوشته میشن خیلی هم ساده قابلیت تبدیل شدن و ترجمه دارن پس انتظار نداشته باشید یک تابع با body چند خطی که کلی توش ضرب و تقسیم کردید براتون تبدیل به experssion بشه که قابل ترجمه برای ORM ها باشه.
میخوام تابع زیر رو تبدیل به experssion در حالت runtime کنم:
در کد زیر میبینید که من با استفاده از تابع OrElse دوتا فانکشن رو با هم Or کردم که همون عملگر || توی سی شارپ هست. وقتی نوشتم Expression.Invoke به این معنی هست که خروجی اون فانکشن باید با خروجی فانکشن دومی Or بشه.دوتا ورودی داریم که من ورودی اول رو همون فانکشن میذارم و بهش میگم که پارامترم رو به ورودی فانکشن بفرست.این به این معنی هست که من الان دارم یک فانکشنی میسازم که داخلش دوتا فانکشن رو با هم Or میکنم پس فانکشن اصلی من یک ورودی به نام x داره که x رو توی دوتا فانکشنی که دارم به عنوان ورودی بعدی پاس میدم تا ازش خروجی بگیرم.
حالا در کد های بعدی ما سه تا بلاک داریم:
1.Expression.Invoke(left, param)
2.Expression.Invoke(right, param)
3.Expression.OrElse
شماره یک و دو دارن ورودی x رو به عنوان پارامتر به فانکشن های ورودی میفرستن تا خروجی رو بگیرن یعنی یکبار x => x.Name == "Ali" و یکبار x => x.Age > 10 اجرا میشه و بعد توسط تابع Expression.OrElse با هم Or میشن.
حالا قدم بعدی اینه که وقتی پارامتر هارو ساختیم حالا باید از کاری که کردیم یک خروجی delegate از نوع experssion بسازیم که در خط آخر میبینید:
امیدوارم این آموزش براتون قابل استفاده بوده باشه.
کانال تلگرام:
@CSharpTips
حالا چطوری یاد بگیریم که با Experssion ها کار کنیم و باهاش چیزای جالبی خلق کنیم؟
چندتا قانون رو باید در نظر بگیرید:
1.اینکه Experssion ها دقیقا مثل کد نویسی شما نیستند بنابراین انتظار نداشته باشید بدون اینکه به Experssion بگید که این قسمت کدم باید اجرا بشه و نتیجه اش مقایسه بشه به صورت جادو وار خودش بفهمه.پس صدا زدن Expression.Invoke مهمه.
2.اگر Experssion رو کامپایل کنید بهتون خروجی delegate رو میده پس حواستون باشه که اگر کامپایلش کنید دیگه ORM نمیتونه تبدیلش کنه به کوئری دیتابیس.منظور از کامپایل کردن صدا زدن تابع Compile هست.
3.و اینکه Experssion ها توابع قابل تبدیل و ترجمه شدن در Runtime هستند که چون توی یک delegate به صورت خیلی ساده و مستقیم نوشته میشن خیلی هم ساده قابلیت تبدیل شدن و ترجمه دارن پس انتظار نداشته باشید یک تابع با body چند خطی که کلی توش ضرب و تقسیم کردید براتون تبدیل به experssion بشه که قابل ترجمه برای ORM ها باشه.
میخوام تابع زیر رو تبدیل به experssion در حالت runtime کنم:
public static Func<T, bool> OrAlso2<T>(this Func<T, bool> left, Func<T, bool> right)توضیحات:
{
return x => left(x) || right(x);
}
var param = Expression.Parameter(typeof(T), "x");در خط کد بالا شما میبینید که من دارم یک پارامتر تعریف می کنم.
در کد زیر میبینید که من با استفاده از تابع OrElse دوتا فانکشن رو با هم Or کردم که همون عملگر || توی سی شارپ هست. وقتی نوشتم Expression.Invoke به این معنی هست که خروجی اون فانکشن باید با خروجی فانکشن دومی Or بشه.دوتا ورودی داریم که من ورودی اول رو همون فانکشن میذارم و بهش میگم که پارامترم رو به ورودی فانکشن بفرست.این به این معنی هست که من الان دارم یک فانکشنی میسازم که داخلش دوتا فانکشن رو با هم Or میکنم پس فانکشن اصلی من یک ورودی به نام x داره که x رو توی دوتا فانکشنی که دارم به عنوان ورودی بعدی پاس میدم تا ازش خروجی بگیرم.
var body = Expression.OrElse(Expression.Invoke(left, param), Expression.Invoke(right, param));مثال بارز استفاده اش اینطوریه:
Expression<Func<MyClass, bool>> firstQuery = x => x.Name == "Ali";در کد های بالا ورودی اصلی x ما همون کلاس MyClass خواهد بود و ما وقتی توی خط اول Experssion هامون گفتیم Expression.Parameter(typeof(T), "x") یعنی همون ورودی x که از نوع MyClass هست رو تعریف کردیم.
Expression<Func<MyClass, bool>> secondQuery = x => x.Age > 10;
Expression<Func<MyClass, bool>> mergedQuery = ExpressionHelper.OrAlso(firstQuery, secondQuery);
حالا در کد های بعدی ما سه تا بلاک داریم:
1.Expression.Invoke(left, param)
2.Expression.Invoke(right, param)
3.Expression.OrElse
شماره یک و دو دارن ورودی x رو به عنوان پارامتر به فانکشن های ورودی میفرستن تا خروجی رو بگیرن یعنی یکبار x => x.Name == "Ali" و یکبار x => x.Age > 10 اجرا میشه و بعد توسط تابع Expression.OrElse با هم Or میشن.
حالا قدم بعدی اینه که وقتی پارامتر هارو ساختیم حالا باید از کاری که کردیم یک خروجی delegate از نوع experssion بسازیم که در خط آخر میبینید:
var lambda = Expression.Lambda<Func<T, bool>>(body, param);اینجا پارامتر اصلی experssion خودمون رو به عنوان ورودی از نوع param دادیم و منطق اصلی experssion مون که توسط OrElse ساختیم رو به عنوان body میدیم و انتظار داریم که خروجی ای که به ما میده یک experssion از نوع or کردن دو فانکشن experssion باشه که برای ORM ها قابل ترجمه باشه.
امیدوارم این آموزش براتون قابل استفاده بوده باشه.
کانال تلگرام:
@CSharpTips
این قابلیت Fetch and merge گیتهاب واقعا کار راه اندازه، خوبای گیت میدونن که اگر این قابلیت نبود چقدر دردسر برای Rebase کردن و مرج کردن با upstream داشتن
این فیچر باعث میشه پروژه ی اصلی با فورک شما مرج بشه و آخرین تغییرات همیشه روی فورک شما اعمال بشه، با این حال اگر از تغییرات روی پروژه های اصلی گیتهاب عقب بمونید دیگه لازم نیست کلی دردسر برای Rebase کردن بکشید که در نهایت کلی وقتتون گرفته بشه که فقط فورک خودتون رو با upstream اصلی مرج کنید
@CSharpTips
#گیتهاب
#مرج
#ریبیس
#git
#github
#rebase
این فیچر باعث میشه پروژه ی اصلی با فورک شما مرج بشه و آخرین تغییرات همیشه روی فورک شما اعمال بشه، با این حال اگر از تغییرات روی پروژه های اصلی گیتهاب عقب بمونید دیگه لازم نیست کلی دردسر برای Rebase کردن بکشید که در نهایت کلی وقتتون گرفته بشه که فقط فورک خودتون رو با upstream اصلی مرج کنید
@CSharpTips
#گیتهاب
#مرج
#ریبیس
#git
#github
#rebase
دوباره، اینبار توی دات نت رانتایم، فقط 5 دیقه وقتم رو گرفت به زودی یه داستان برای اینکه چطوری تونستم توی پنج دیقه عضو کانتریبیوتر های دات کور با یک تغییر ساده بشم براتون میذارم.
https://github.com/dotnet/runtime/pull/62633
@CSharpTips
https://github.com/dotnet/runtime/pull/62633
@CSharpTips
GitHub
Cleanup, use camel case name conventions of method parameters by Ali-YousefiTelori · Pull Request #62633 · dotnet/runtime
I just Cleaned up using camel case name conventions of some method parameters.
توی سی شارپ چطوری بتونیم کلاس هایی که کپسوله کردیم رو از بیرون براش تست کیس بنویسیم؟
وقتی کلاس هاتون رو کپسوله میکنید مثلا لایه ی دسترسی اون کلاس رو internal می کنید یعنی فقط درون اون dll برای بقیه کلاس ها public محسوب میشه و بیرون اون dll یا اسمبلی دیگه برای ویژوال استادیو قابل دیدن نیست و بدون رفلکشن نمی تونید توابعش رو صدا بزنید.
حالا چطوری براش تست کیس بنویسیم؟ چون پروژه تست ما یک پروژه خارجی هست و داره از اون اسمبلی استفاده میکنه و اینطوری به کلاس های internal ما دسترسی نداره.
پاسخ:
از طریق خصیصه (attribute) ای به نام InternalsVisibleTo می تونید اینکار رو انجام بدید.
فرض کنید من یک اسمبلی Logic دارم به نام TestNamespace.Logics و یک اسمبلی تست دارم به نام TestNamespace.Tests حالا فقط کافیه برم توی csproj اسمبلی لاجیکم و اینو بنویسم:
نکته: این کد برای دات نت Core 5.0 به بالا جواب میده احتمالا برای نسخه های پایین تر باید درگیر نصب پکیج بشید یا توی AssemblyInfo.cs این تغییرات رو اعمال کنید که با یه جستجو توی اینترنت روش هاش رو می تونید پیدا کنید.
@CsharpTips
وقتی کلاس هاتون رو کپسوله میکنید مثلا لایه ی دسترسی اون کلاس رو internal می کنید یعنی فقط درون اون dll برای بقیه کلاس ها public محسوب میشه و بیرون اون dll یا اسمبلی دیگه برای ویژوال استادیو قابل دیدن نیست و بدون رفلکشن نمی تونید توابعش رو صدا بزنید.
حالا چطوری براش تست کیس بنویسیم؟ چون پروژه تست ما یک پروژه خارجی هست و داره از اون اسمبلی استفاده میکنه و اینطوری به کلاس های internal ما دسترسی نداره.
پاسخ:
از طریق خصیصه (attribute) ای به نام InternalsVisibleTo می تونید اینکار رو انجام بدید.
فرض کنید من یک اسمبلی Logic دارم به نام TestNamespace.Logics و یک اسمبلی تست دارم به نام TestNamespace.Tests حالا فقط کافیه برم توی csproj اسمبلی لاجیکم و اینو بنویسم:
<ItemGroup>
<InternalsVisibleTo Include="TestNamespace.Tests" />
</ItemGroup>
نکته: این کد برای دات نت Core 5.0 به بالا جواب میده احتمالا برای نسخه های پایین تر باید درگیر نصب پکیج بشید یا توی AssemblyInfo.cs این تغییرات رو اعمال کنید که با یه جستجو توی اینترنت روش هاش رو می تونید پیدا کنید.
@CsharpTips
C# Programming Guide
https://dev.to/dotnetsafer/leaked-c-11-features-the-best-christmas-gift-from-microsoft-pn1
بالاخره جنریک اتریبیوت ها هم دارن میان 🥰💪
#یاگیری_عمیق
#Deep_Learning
#برنامه_نویسی
خیالتون رو راحت کنم نه با کتاب، نه با #ویدئو ها و #صوت های #آموزشی، نه با #مقالات و نه حتی با #استاد و هیچ کدوم از این ها #یادگیری_عمیق اتفاق نمیوفته
چطوری اتفاق میوفته؟
دوستان عزیزم دوست ندارم وقتتون رو برای اینکه توی یک چیزی عمیق بشید حروم تبلیغات و کتاب و مقاله کنید پس دقت کنید و بببینید که چطوری باید توی چیزی عمیق بشید.
بدن انسان طوری پیاده سازی شده که درد ها رو رنج ها رو خیلی دیر فراموش میکنه ولی خوشحالی ها و تفریحات رو خیلی زود فراموش میکنه.
یادگیری عمیق برای همین مهمه، اتفاقیه که فقط با درد و رنج و تلاش بسیار اتفاق میوفته نه نشستن یه گوشه و لای کتاب رو باز کردن، خیالتون رو راحت کنم هرچی توی کتاب ها و مقالات بخونید خیلی زود فراموش می کنید.
یکی از عزیزان ازم سوال پرسیدن که چطوری توی یه موضوعی توی برنامه نویسی عمیق بشیم؟
امروزه به خاطر وجود ابزار های زیاد برنامه نویسی عمیق شدن خیلی سخت شده چون ممکنه دیگه ابزاری نباشه که سازندش شما باشید و کسانی که میخوان شروع کنن باعث بشه توی چیزی عمیق بشن و به چالش های زیادی بخورن، خب با وجود این مساله چطوری باید توی چیزی عمیق بشیم؟
مثالی که من همیشه میزنم:
اگر ایده ای ندارید چرخ رو دوباره اختراع کنید، تمرین سازی کنید فقط و فقط توی همین حالته که یک که هیچ صد قدم از بقیه جلوترید، چرا؟
اختراع کردن چرخ مثلا یک پکیج و محصولی که قبلا توسط یک شخص نوشته شده رو مجدد پیاده سازی کنید، اینطوری چندتا اتفاق جالب میوفته:
1.به چالش های جدید برنامه نویسی می خورید
2.رنج ها و تلاش های بسیاری میکشید و یاد میگیرید
3.ممکنه ایده ی نو و جدیدی به ذهنتون برسه و دنیا رو تکون بدید
برای مثال من به یکی از دوستان گفتم اگر میخوای توی مبحث Reflection عمیق بشی، برو و Newtonsoft Json رو از صفر بزن (نه همشو) و با سریالایز و دیسرالایز کردن جیسون و چالش هایی که توش میخوری براحتی با مبحث Reflection آشنا میشی و قوی میشی و این میشه که شما اون بحث رو عمیقا یاد میگیری و تا سالها از یادت نمیره
فراموش نکنید #یادگیری با #یادگیری_عمیق متفاوت هستند
@CSharpTips
#Deep_Learning
#برنامه_نویسی
خیالتون رو راحت کنم نه با کتاب، نه با #ویدئو ها و #صوت های #آموزشی، نه با #مقالات و نه حتی با #استاد و هیچ کدوم از این ها #یادگیری_عمیق اتفاق نمیوفته
چطوری اتفاق میوفته؟
دوستان عزیزم دوست ندارم وقتتون رو برای اینکه توی یک چیزی عمیق بشید حروم تبلیغات و کتاب و مقاله کنید پس دقت کنید و بببینید که چطوری باید توی چیزی عمیق بشید.
بدن انسان طوری پیاده سازی شده که درد ها رو رنج ها رو خیلی دیر فراموش میکنه ولی خوشحالی ها و تفریحات رو خیلی زود فراموش میکنه.
یادگیری عمیق برای همین مهمه، اتفاقیه که فقط با درد و رنج و تلاش بسیار اتفاق میوفته نه نشستن یه گوشه و لای کتاب رو باز کردن، خیالتون رو راحت کنم هرچی توی کتاب ها و مقالات بخونید خیلی زود فراموش می کنید.
یکی از عزیزان ازم سوال پرسیدن که چطوری توی یه موضوعی توی برنامه نویسی عمیق بشیم؟
امروزه به خاطر وجود ابزار های زیاد برنامه نویسی عمیق شدن خیلی سخت شده چون ممکنه دیگه ابزاری نباشه که سازندش شما باشید و کسانی که میخوان شروع کنن باعث بشه توی چیزی عمیق بشن و به چالش های زیادی بخورن، خب با وجود این مساله چطوری باید توی چیزی عمیق بشیم؟
مثالی که من همیشه میزنم:
اگر ایده ای ندارید چرخ رو دوباره اختراع کنید، تمرین سازی کنید فقط و فقط توی همین حالته که یک که هیچ صد قدم از بقیه جلوترید، چرا؟
اختراع کردن چرخ مثلا یک پکیج و محصولی که قبلا توسط یک شخص نوشته شده رو مجدد پیاده سازی کنید، اینطوری چندتا اتفاق جالب میوفته:
1.به چالش های جدید برنامه نویسی می خورید
2.رنج ها و تلاش های بسیاری میکشید و یاد میگیرید
3.ممکنه ایده ی نو و جدیدی به ذهنتون برسه و دنیا رو تکون بدید
برای مثال من به یکی از دوستان گفتم اگر میخوای توی مبحث Reflection عمیق بشی، برو و Newtonsoft Json رو از صفر بزن (نه همشو) و با سریالایز و دیسرالایز کردن جیسون و چالش هایی که توش میخوری براحتی با مبحث Reflection آشنا میشی و قوی میشی و این میشه که شما اون بحث رو عمیقا یاد میگیری و تا سالها از یادت نمیره
فراموش نکنید #یادگیری با #یادگیری_عمیق متفاوت هستند
@CSharpTips
سیگنالگو 5.7 به همراه افزونه ی ویژوال استادیو 2022 منتشر شد.
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
👍4
Forwarded from کدهک
#برنامه_نویس عزیزم، آیا میدونستی اگر #کد_تمیز بزنی توانایی این رو داری که در مصرف #برق شهر و کشورت #صرف_جویی کنی؟
چطوری؟
#کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند.
به همین علت اگر کدهاتون رو تمیز و #بهینه بزنید و البته بدونید چه متغیر هایی رو چه جاهایی استفاده کنید که مصرف کامپیوتر یا گوشی یا هر دستگاهی رو کاهش بدید عملا باعث شدید اون دستگاه برق کمتری رو مصرف کنه.
پس دوست برنامه نویس عزیزم برای پایین آوردن مصرف برق شهر و کشورت هم که شده شما با بهینه کد زدن توانایی این رو داری که میزان اسراف رو کم کنی و کارهایی انجام بدی که حتی نمیدونی به چه جاهایی بعدا کمک خواهد کرد.
یوسفی
چطوری؟
#کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند.
به همین علت اگر کدهاتون رو تمیز و #بهینه بزنید و البته بدونید چه متغیر هایی رو چه جاهایی استفاده کنید که مصرف کامپیوتر یا گوشی یا هر دستگاهی رو کاهش بدید عملا باعث شدید اون دستگاه برق کمتری رو مصرف کنه.
پس دوست برنامه نویس عزیزم برای پایین آوردن مصرف برق شهر و کشورت هم که شده شما با بهینه کد زدن توانایی این رو داری که میزان اسراف رو کم کنی و کارهایی انجام بدی که حتی نمیدونی به چه جاهایی بعدا کمک خواهد کرد.
یوسفی
👍4
C# Programming Guide
#برنامه_نویس عزیزم، آیا میدونستی اگر #کد_تمیز بزنی توانایی این رو داری که در مصرف #برق شهر و کشورت #صرف_جویی کنی؟ چطوری؟ #کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند. به همین علت…
جهت شفافیت بیشتر که چرا هم کد تمیز و هم کد بهینه باعث کاهش مصرف انرژی میشن:
اجازه بدید یک مثال ملموس بزنم تا متوجه بشیم که کد تمیز ربطی به مصرف انرژی داره یا نه؟ و علت اینکه چرا توی پست هم اشاره به کد تمیز شده و هم اشاره به کد بهینه.
وقتی شما کد تمیز میزنید در طی زمان طولانی وقتی برمیگردید و میخواهید کدهاتون رو توسعه بدید سریعتر میتونید کد رو بخونید، تحلیل کنید و توسعه بدید یا رفع باگ کنید، اینجا یک مولفه ای وجود داره به نام زمان.
اگر شما ساعتی صد هزارتومان حقوق دریافت کنید، کد های تمیز، وقت و زمان و انرژی کمتری از شما میگیرن تا فیچر های جدید اضافه بشن یا باگ ها رفع بشن، اما اگر کد ها کثیف باشن شما به جای یک ساعت ممکنه ده ساعت وقت بذارید بناراین شما به جای صدهزار تومان در واقع 1 میلیون تومان براتون هزینه داشته تا اون فیچر و اون باگ رو رفع کنید (فقط بخاطر اینکه کد ها ناخوانا بودن و اصلا بهینه بودن اینجا مطرح نیست) که بر حسب ساعت کاری براتون حساب میشه پس زمان بیشتری از شما گرفته.
همچنین در مصرف هزینه های کارفرما صرف جویی میشه، وقتی شما در مصرف هزینه ها صرف جویی کنید اتوماتیکوار مصرف انرژی رو کاهش دادید چون برای بدست آوردن اون پول ها انرژی زیادی مصرف شده و پول ها بدون مصرف انرژی تولید نمی شن
امیدوارم صریح و شفاف گفته باشم که چطور کد تمیز و کد بهینه باعث کاهش مصرف انرژی میشن
اجازه بدید یک مثال ملموس بزنم تا متوجه بشیم که کد تمیز ربطی به مصرف انرژی داره یا نه؟ و علت اینکه چرا توی پست هم اشاره به کد تمیز شده و هم اشاره به کد بهینه.
وقتی شما کد تمیز میزنید در طی زمان طولانی وقتی برمیگردید و میخواهید کدهاتون رو توسعه بدید سریعتر میتونید کد رو بخونید، تحلیل کنید و توسعه بدید یا رفع باگ کنید، اینجا یک مولفه ای وجود داره به نام زمان.
اگر شما ساعتی صد هزارتومان حقوق دریافت کنید، کد های تمیز، وقت و زمان و انرژی کمتری از شما میگیرن تا فیچر های جدید اضافه بشن یا باگ ها رفع بشن، اما اگر کد ها کثیف باشن شما به جای یک ساعت ممکنه ده ساعت وقت بذارید بناراین شما به جای صدهزار تومان در واقع 1 میلیون تومان براتون هزینه داشته تا اون فیچر و اون باگ رو رفع کنید (فقط بخاطر اینکه کد ها ناخوانا بودن و اصلا بهینه بودن اینجا مطرح نیست) که بر حسب ساعت کاری براتون حساب میشه پس زمان بیشتری از شما گرفته.
همچنین در مصرف هزینه های کارفرما صرف جویی میشه، وقتی شما در مصرف هزینه ها صرف جویی کنید اتوماتیکوار مصرف انرژی رو کاهش دادید چون برای بدست آوردن اون پول ها انرژی زیادی مصرف شده و پول ها بدون مصرف انرژی تولید نمی شن
امیدوارم صریح و شفاف گفته باشم که چطور کد تمیز و کد بهینه باعث کاهش مصرف انرژی میشن
#تریدآف
#Tradeoff
یکی از واژه هایی که از سنیور ها می شنوید و احتمالا خیلی زیاد به گوشتون خورده، از این واژه وقتی استفاده میشه که برنامه نویس به این باور رسیده که راه چاره ای نداره و نمیتونه دوتا چیز رو همزمان در پروژه اش داشته باشه، یکی از این مسائل پرفورمنس به همراه کد تمیزه.
برنامه نویس های مجرب به این باور رسیدن که نمیشه هم پرفورمنس بالایی داشت و هم کد تمیز داشت، من میخوام امروز به این موضوع بپردازم که چقدر این حرف درسته و آیا دلیل موجهی برای اثباتش دارم یا خیر؟
من معتقدم استفاده از کلمه ی تریدآف فقط به این معنیه که من برنامه نویس تا همینجا علمش رو داشتم، بیشتر از این نمی تونم کمکتون کنم و از نظر اعتقادی باور کرده که نمیشه این دوتا چیز رو همزمان داشت اما آیا اون اعتقاد درسته؟ همیشه یه راه سومی وجود داره و اگر به ذهنتون نرسیده دلیل بر این نیست که وجود نداره باید باور کنیم ما علامه و عالم به همه چیز نیستیم ما بر این باوریم که همیشه میشه بهتر فکر کرد و راه های بهتری پیدا کرد برای همین دیدگاه هست که علم پیشرفت میکنه چون یه عده مخالف گوشی های دکمه ای بودن و فکر میکردن که باید راه بهتری باشه پس گوشی های لمسی رو اختراع کردن. بنابراین ذهن خودتون رو بسته نگه ندارید و نذارید به این موضوع باور کنید که شما همه چیز رو درست میگید، اگر به این باور رسیدید دروازه های پیشرفت و خلاقیت رو به روی ذهن خودتون بستید.
خب بریم سراغ اینکه من چطوری میخوام این موضوع رو اثبات کنم؟
همه میدونیم grpc خیلی سریعه و messagepack هم همینطور، اما هر دوی اینها قسمتی از کدهای شمارو کثیف میکنن و وابستگی به پروژه ی شما اضافه میکنن.
چطور؟
توی grpc شما حتما باید protobuf بسازید، فایل هایی که خروجی و ورودی سرویس ها و پروپرتی مدل های شمارو برای سریالایز و دیسریالایز مشخص میکنن.پس وابستگی grpc به پروژه های شما شد این فایل هایی که همه جا همراه شما میان.چرا grpc به همچین فایل هایی احتیاج داره؟
چون grpc وقتی داده هارو سریالایز میکنه مثل json اطلاعات پروپرتی کلاس ها و نام پروپرتی ها رو و مرتب سازی اونها رو توی داده هایی که رد و بدل می کنه نگهداری نمی کنه به همین واسطه نیاز داره که از شما نحوه مرتب سازی پروپرتی ها و نام هاشون رو داشته باشه تا اگر حذفشون کردید یا تغییر نامشون دادید بتونه دیسریالایزشون کنه.
توی messagepack هم به همین شکله، چیزی به نام protobuf نداره ولی بالای پروپرتی های کلاس هاتون باید کلی اتریبیوت بذارید که ایندکسش رو مشخص کنید.
خب من پکیجی ساختم به نام BinaryGo که توی گیتهابم هست، این پکیج نه protobuf داره و نه لازمه بالای کلاسهاتون attribute بذارید در عین حال نزدیک به دوبرابر از grpc و messagepack سریعتره.این یعنی کد تمیزی برای شما به وجود میاره و در عین حال پرفورمنس بیشتری داره.
حالا از این به بعد اگر کسی به شما گفت این قضیه تریدآف داره و نمیشه کد تمیز داشت و بهینه هم باشه تنها یک جمله بهش بگید: مهندس نگو نمیشه، بگو من علمش رو ندارم یا نمی دونم.
#Tradeoff
یکی از واژه هایی که از سنیور ها می شنوید و احتمالا خیلی زیاد به گوشتون خورده، از این واژه وقتی استفاده میشه که برنامه نویس به این باور رسیده که راه چاره ای نداره و نمیتونه دوتا چیز رو همزمان در پروژه اش داشته باشه، یکی از این مسائل پرفورمنس به همراه کد تمیزه.
برنامه نویس های مجرب به این باور رسیدن که نمیشه هم پرفورمنس بالایی داشت و هم کد تمیز داشت، من میخوام امروز به این موضوع بپردازم که چقدر این حرف درسته و آیا دلیل موجهی برای اثباتش دارم یا خیر؟
من معتقدم استفاده از کلمه ی تریدآف فقط به این معنیه که من برنامه نویس تا همینجا علمش رو داشتم، بیشتر از این نمی تونم کمکتون کنم و از نظر اعتقادی باور کرده که نمیشه این دوتا چیز رو همزمان داشت اما آیا اون اعتقاد درسته؟ همیشه یه راه سومی وجود داره و اگر به ذهنتون نرسیده دلیل بر این نیست که وجود نداره باید باور کنیم ما علامه و عالم به همه چیز نیستیم ما بر این باوریم که همیشه میشه بهتر فکر کرد و راه های بهتری پیدا کرد برای همین دیدگاه هست که علم پیشرفت میکنه چون یه عده مخالف گوشی های دکمه ای بودن و فکر میکردن که باید راه بهتری باشه پس گوشی های لمسی رو اختراع کردن. بنابراین ذهن خودتون رو بسته نگه ندارید و نذارید به این موضوع باور کنید که شما همه چیز رو درست میگید، اگر به این باور رسیدید دروازه های پیشرفت و خلاقیت رو به روی ذهن خودتون بستید.
خب بریم سراغ اینکه من چطوری میخوام این موضوع رو اثبات کنم؟
همه میدونیم grpc خیلی سریعه و messagepack هم همینطور، اما هر دوی اینها قسمتی از کدهای شمارو کثیف میکنن و وابستگی به پروژه ی شما اضافه میکنن.
چطور؟
توی grpc شما حتما باید protobuf بسازید، فایل هایی که خروجی و ورودی سرویس ها و پروپرتی مدل های شمارو برای سریالایز و دیسریالایز مشخص میکنن.پس وابستگی grpc به پروژه های شما شد این فایل هایی که همه جا همراه شما میان.چرا grpc به همچین فایل هایی احتیاج داره؟
چون grpc وقتی داده هارو سریالایز میکنه مثل json اطلاعات پروپرتی کلاس ها و نام پروپرتی ها رو و مرتب سازی اونها رو توی داده هایی که رد و بدل می کنه نگهداری نمی کنه به همین واسطه نیاز داره که از شما نحوه مرتب سازی پروپرتی ها و نام هاشون رو داشته باشه تا اگر حذفشون کردید یا تغییر نامشون دادید بتونه دیسریالایزشون کنه.
توی messagepack هم به همین شکله، چیزی به نام protobuf نداره ولی بالای پروپرتی های کلاس هاتون باید کلی اتریبیوت بذارید که ایندکسش رو مشخص کنید.
خب من پکیجی ساختم به نام BinaryGo که توی گیتهابم هست، این پکیج نه protobuf داره و نه لازمه بالای کلاسهاتون attribute بذارید در عین حال نزدیک به دوبرابر از grpc و messagepack سریعتره.این یعنی کد تمیزی برای شما به وجود میاره و در عین حال پرفورمنس بیشتری داره.
حالا از این به بعد اگر کسی به شما گفت این قضیه تریدآف داره و نمیشه کد تمیز داشت و بهینه هم باشه تنها یک جمله بهش بگید: مهندس نگو نمیشه، بگو من علمش رو ندارم یا نمی دونم.
👍4