نگاهی به تاریخ 10 ساله TIOBE نشان میدهد این سیستم رتبه بندی می تواند تا اندازه زیادی قابل اعتماد باشد.
مشاهده می کنیم که Objective-C بعد از آنکه توسط Apple کنار گذاشته شد جایگاهش از رتبه 3 به 13 سقوط کرده است. در عوض زبان Swift که جایگزین آن شد از رتبه 17 به 9 صعود کرده است.
همچنین PHP که 10 سال پیش رتبه 3 داشت امروز بخشی از محبوبیت خود را به زبان Python داده است.
سی شارپ سالهاست که جایگاه خودش را در رتبه 5 حفظ کرده است که نشان دهنده ثبات و جا افتادگی آن در صنعت نرم افزار است.
مشاهده می کنیم که Objective-C بعد از آنکه توسط Apple کنار گذاشته شد جایگاهش از رتبه 3 به 13 سقوط کرده است. در عوض زبان Swift که جایگزین آن شد از رتبه 17 به 9 صعود کرده است.
همچنین PHP که 10 سال پیش رتبه 3 داشت امروز بخشی از محبوبیت خود را به زبان Python داده است.
سی شارپ سالهاست که جایگاه خودش را در رتبه 5 حفظ کرده است که نشان دهنده ثبات و جا افتادگی آن در صنعت نرم افزار است.
Forwarded from کدهک
وقتی در آخرین نتایج Techempower فریم ورک ASP NET Core در ربته اول آزمون Plaintext قرار گرفت برای خیلی ها جای تعجب داشت که چطور سی شارپ می تواند سریعتر از Rust یا ++C خروجی دهد. حتی اگر این نتیجه فقط برای یک آزمون آن هم یکبار اتفاق افتاده باشد باز هم اهمیت زیادی دارد.
مکث هایی که GC ایجاد میکند یکی از مهمترین عوامل افت پرفومنس اپلیکیشن های تحت وب است. زبانهای Rust و ++C بدون GC کار می کنند و Golang هم ساختار داده ای ساده تری دارد و انتظار میرود GC در آن سریعتر و سبکتر عمل کند.
اما برای تیم توسعه دات نت اما این یک اتفاق نبود. فریم ورک ASP NET Core دو سال پیش در ردیف 11 قرار داشت. در این مدت قابلیت های زیادی به زبان سی شارپ اضافه شد. ابزاری مثل Span یا استفاده از SIMD در RyuJIT نیاز به چند سال برنامه ریزی و توسعه داشت.
بهتر شدن پرفورمنس در شرایطی صورت میگیرد که استفاده از کلمه کلیدی Unsafe در فریم ورک و سرور کمتر شده است.
قرار گرفتن در رتبه نخست آزمون Plaintext نتیجه یک هدف گذاری مشخص بود که امروز هم با صرف وقت و هزینه زیاد ادامه دارد. نتیجه این هدف گذاری خودش را Composite Score به خوبی نشان داده است.
مکث هایی که GC ایجاد میکند یکی از مهمترین عوامل افت پرفومنس اپلیکیشن های تحت وب است. زبانهای Rust و ++C بدون GC کار می کنند و Golang هم ساختار داده ای ساده تری دارد و انتظار میرود GC در آن سریعتر و سبکتر عمل کند.
اما برای تیم توسعه دات نت اما این یک اتفاق نبود. فریم ورک ASP NET Core دو سال پیش در ردیف 11 قرار داشت. در این مدت قابلیت های زیادی به زبان سی شارپ اضافه شد. ابزاری مثل Span یا استفاده از SIMD در RyuJIT نیاز به چند سال برنامه ریزی و توسعه داشت.
بهتر شدن پرفورمنس در شرایطی صورت میگیرد که استفاده از کلمه کلیدی Unsafe در فریم ورک و سرور کمتر شده است.
قرار گرفتن در رتبه نخست آزمون Plaintext نتیجه یک هدف گذاری مشخص بود که امروز هم با صرف وقت و هزینه زیاد ادامه دارد. نتیجه این هدف گذاری خودش را Composite Score به خوبی نشان داده است.
Forwarded from کدهک
بهینه سازی GC در دات نت
در سی شارپ پاکسازی حافظه به عهده GC است. در این ویدیو به بررسی اثر منفی استفاده از Large Object Heap در پرفورمنس می پردازیم و سعی می کنیم از آن دوری کنیم.
https://codehaks.com/go/loh
در سی شارپ پاکسازی حافظه به عهده GC است. در این ویدیو به بررسی اثر منفی استفاده از Large Object Heap در پرفورمنس می پردازیم و سعی می کنیم از آن دوری کنیم.
https://codehaks.com/go/loh
Forwarded from DotNetZoom (محمد جواد ابراهیمی)
✅ تست کد های #C به صورت آنلاین
توی پست قبلی در مورد C# Interactive توضیح داده بودم الان میخوام روش آنلاینش رو بررسی کنیم.
واسه اینکار سایت های زیادی هست که امکان Syntax Highlighter و Run کردن کد رو بهتون میدن. با این ابزار ها میتونین کد سی شارپ تون رو انلاین و راحت تست کنین و یا کدتون رو با بقیه به اشتراک بگذارین
🔸اول از همه بهترینشون و با اختلاف فاحش، سایت SharpLab هست. امکانات فوق العاده ای داره، Intellisense خیلی قوی ایی داره که در نوع خودش واقعا بی نظیره، امکان Decompile کردن کد خروجی به IL و #C و حتی Jit Assembly رو بهتون میده. UX خوب و روون ایی داره و خیلی سریع، در لحظه کد رو اجرا میکنه.
https://sharplab.io/
🔹این سایت برای ویرایشگرش اش از پلاگین جاوااسکریپتی CodeMirror استفاده میکنه که یک Code Editor و Syntax Highlighter قوی هست و از تموم زبان ها پشتیبانی میکنه
مثلا اگه خواستین قابلیت اسکریپت نویسی و اجرای کد داینامیک رو برای پروژه تون اضافه کنین میتونین از این پلاگین استفاده کنین
https://github.com/codemirror/CodeMirror
[Demo] https://codemirror.net/
🔸 این سایت برای اجرای کد ها از Roslyn و برای Decompile کردنشون از ILSpy استاده میکنه که قوی ترین برنامه Decompiler دات نت هست و ابزار های حرفه دیگه از از جمله dnSpy از رو همین ساخته شدن
🔹سازنده این سایت اومده کل پکیج Code Editor سی شارپیش رو که بر روی CodeMirror و Roslyn ساخته شده رو به صورت سورس پاز تو گیتهاب گذاشته
بدین صورت مثلا میتونین یه ویرایشگر کامل سی شارپی به همراه Autocomplete واسه اسکریپت نویسی داینامیک به پروژه تون اضافه کنین
https://github.com/ashmind/mirrorsharp
🔰تنها ایرادی که سایت sharplab.io داره اینه که که امکان اضافه کردن Nuget Package به کد هاتون رو نداره
واسه همین یه سایت دیگه به نام NET Fiddle. هست (که البته به خوبی اون نیست ولی بعضی امکانات اضافه تر مثل همین nuget package داره)
https://dotnetfiddle.net/
____________________
@DotNetZoom
توی پست قبلی در مورد C# Interactive توضیح داده بودم الان میخوام روش آنلاینش رو بررسی کنیم.
واسه اینکار سایت های زیادی هست که امکان Syntax Highlighter و Run کردن کد رو بهتون میدن. با این ابزار ها میتونین کد سی شارپ تون رو انلاین و راحت تست کنین و یا کدتون رو با بقیه به اشتراک بگذارین
🔸اول از همه بهترینشون و با اختلاف فاحش، سایت SharpLab هست. امکانات فوق العاده ای داره، Intellisense خیلی قوی ایی داره که در نوع خودش واقعا بی نظیره، امکان Decompile کردن کد خروجی به IL و #C و حتی Jit Assembly رو بهتون میده. UX خوب و روون ایی داره و خیلی سریع، در لحظه کد رو اجرا میکنه.
https://sharplab.io/
🔹این سایت برای ویرایشگرش اش از پلاگین جاوااسکریپتی CodeMirror استفاده میکنه که یک Code Editor و Syntax Highlighter قوی هست و از تموم زبان ها پشتیبانی میکنه
مثلا اگه خواستین قابلیت اسکریپت نویسی و اجرای کد داینامیک رو برای پروژه تون اضافه کنین میتونین از این پلاگین استفاده کنین
https://github.com/codemirror/CodeMirror
[Demo] https://codemirror.net/
🔸 این سایت برای اجرای کد ها از Roslyn و برای Decompile کردنشون از ILSpy استاده میکنه که قوی ترین برنامه Decompiler دات نت هست و ابزار های حرفه دیگه از از جمله dnSpy از رو همین ساخته شدن
🔹سازنده این سایت اومده کل پکیج Code Editor سی شارپیش رو که بر روی CodeMirror و Roslyn ساخته شده رو به صورت سورس پاز تو گیتهاب گذاشته
بدین صورت مثلا میتونین یه ویرایشگر کامل سی شارپی به همراه Autocomplete واسه اسکریپت نویسی داینامیک به پروژه تون اضافه کنین
https://github.com/ashmind/mirrorsharp
🔰تنها ایرادی که سایت sharplab.io داره اینه که که امکان اضافه کردن Nuget Package به کد هاتون رو نداره
واسه همین یه سایت دیگه به نام NET Fiddle. هست (که البته به خوبی اون نیست ولی بعضی امکانات اضافه تر مثل همین nuget package داره)
https://dotnetfiddle.net/
____________________
@DotNetZoom
Telegram
Attach Files
Forwarded from کدهک
فونت FiraCode به صورت Mono Space است که برای کد نویسی بسیار مناسب است.
همچنین این فونت دارای لیگاتور است و بجای کاراکترهایی نظیر == یا => از نماد استفاده میکند.
دانلود :
https://bit.ly/2byEo9Y
همچنین این فونت دارای لیگاتور است و بجای کاراکترهایی نظیر == یا => از نماد استفاده میکند.
دانلود :
https://bit.ly/2byEo9Y
Forwarded from کدهک
آشنایی با Polly
چگونه در ASP NET Core قابلیت Fault Tolerance پیاده کنیم که در صورت وجود خطا در وب سرویس ها مجدد سعی کند؟
پیاده سازی مکانیزم Resilience و Retry در ASP NET Core
https://tinyurl.com/cdhk-polly
چگونه در ASP NET Core قابلیت Fault Tolerance پیاده کنیم که در صورت وجود خطا در وب سرویس ها مجدد سعی کند؟
پیاده سازی مکانیزم Resilience و Retry در ASP NET Core
https://tinyurl.com/cdhk-polly
Forwarded from کدهک
متوسط حقوق
موسسه کاریابی Vettery هر سال گزارشی از وضعیت حقوق و درآمد صنعت IT منتشر میکند. به تازگی گزارش 2019 این موسسه منتشر شده که در ادامه آمار مربوط به شهر سانفرانسیسکو آمده است.
شهر سانفراسیسکو در ایالت کالیفرنیا ی آمریکا مرکز فعالیت شرکتهای بزرگ تکنولوژی مثل فیس بوک ، گوگل ، اوبر و ... است.
طبق این گزارش توسعه دهندگان موبایل هم در شروع کار هم بعد از 5 سال تجربه حقوق بیشتری دریافت می کنند.
برنامه نویسان Back-end بعد از سال اول نسبت به سایر تخصص ها درآمد بیشتری دارند.
اختلاف دستمزد در هیچ تخصصی چشمگیر نیست و متوسط درآمد به طور کلی بهم نزدیک است.
در اولین سال فعالیت دستمزد متخصصین علوم دیتا از همه بیشتر است اما اگر مایل هستید بیشترین حقوق را در بین همه ی همکاران داشته باشید باید به دنبال سمت های مدیریتی باشید.
موسسه کاریابی Vettery هر سال گزارشی از وضعیت حقوق و درآمد صنعت IT منتشر میکند. به تازگی گزارش 2019 این موسسه منتشر شده که در ادامه آمار مربوط به شهر سانفرانسیسکو آمده است.
شهر سانفراسیسکو در ایالت کالیفرنیا ی آمریکا مرکز فعالیت شرکتهای بزرگ تکنولوژی مثل فیس بوک ، گوگل ، اوبر و ... است.
طبق این گزارش توسعه دهندگان موبایل هم در شروع کار هم بعد از 5 سال تجربه حقوق بیشتری دریافت می کنند.
برنامه نویسان Back-end بعد از سال اول نسبت به سایر تخصص ها درآمد بیشتری دارند.
اختلاف دستمزد در هیچ تخصصی چشمگیر نیست و متوسط درآمد به طور کلی بهم نزدیک است.
در اولین سال فعالیت دستمزد متخصصین علوم دیتا از همه بیشتر است اما اگر مایل هستید بیشترین حقوق را در بین همه ی همکاران داشته باشید باید به دنبال سمت های مدیریتی باشید.
Forwarded from کدهک
متوسط حقوق بر اساس زبان برنامه نویسی
به طور کلی در سانفرانسیسکو برنامه نویسان پایتون متوسط حقوقی بیشتری دارند و این برتری برای افراد در شروع کار و آنهایی که بیش از 6 سال تجربه دارند همچنان به چشم می خورد.
زبان Ruby در آمریکا همچنان پر طرفدار است و از نظر دستمزد بسیار نزدیک به پایتون پیش میرود.
به طور کلی در سانفرانسیسکو برنامه نویسان پایتون متوسط حقوقی بیشتری دارند و این برتری برای افراد در شروع کار و آنهایی که بیش از 6 سال تجربه دارند همچنان به چشم می خورد.
زبان Ruby در آمریکا همچنان پر طرفدار است و از نظر دستمزد بسیار نزدیک به پایتون پیش میرود.
Forwarded from کدهک
اضافه حقوق بر مبنای مهارت
داشتن مهارت در برنامه نویسی Scala می تواند برای شما تا 15 هزار دلار در سال حقوق بیشتر داشته باشد.
محبوبت زبان Go و استفاده ی زیاد آن در معماری میکروسرویس هم باعث شده است دانستن آن شامل 11 هزار دلار اضافه حقوق باشد.
آشنایی با ابزاری مثل D3.js که در Data Visualization و تحلیل داده کاربرد دارد هم در بین شرکتهای آمریکایی یک مزیت مهم به شمار میرود.
داشتن مهارت در برنامه نویسی Scala می تواند برای شما تا 15 هزار دلار در سال حقوق بیشتر داشته باشد.
محبوبت زبان Go و استفاده ی زیاد آن در معماری میکروسرویس هم باعث شده است دانستن آن شامل 11 هزار دلار اضافه حقوق باشد.
آشنایی با ابزاری مثل D3.js که در Data Visualization و تحلیل داده کاربرد دارد هم در بین شرکتهای آمریکایی یک مزیت مهم به شمار میرود.
Forwarded from DotNetZoom (ALI_1992)
💡#آیا_میدانستید
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
در پی جنبش "Black Lives Matter" که این روزها در ایالات متحده شدت گرفته نیل فریدمن مدیر عامل گیتهاب اعلام کرد این شرکت در حال تغییر عنوان پیشفرض "master" به "main" است.
شرکتهای دیگر فن آوری هم در حال حذف اصطلاح Master و Slave از کتابخانه ها و نرم افزارهایشان هستند.
گوگل اعلام کرده است عباراتی مثل Black List و White List را حذف می کند و کلماتی چون "Block List" و "Allow List" جایگزین می کند. اتفاقات مشابهی در PHP و Curl و Linkedin و سایر شرکتهای آی تی در جریان است.
تغییر دادن نام متغیرها، متدها یا کتابخانه ها دردسرهای پیش بینی نشده زیادی به همراه دارد و انتظار میرود کار پر هزینه ای باشد. اما به نظر میرسد این تصمیم گرفته شده و حذف عبارت هایی که ریشه در دوران برده داری دارند یا نژاد پرستانه هستند از همین حالا شروع شده است.
شرکتهای دیگر فن آوری هم در حال حذف اصطلاح Master و Slave از کتابخانه ها و نرم افزارهایشان هستند.
گوگل اعلام کرده است عباراتی مثل Black List و White List را حذف می کند و کلماتی چون "Block List" و "Allow List" جایگزین می کند. اتفاقات مشابهی در PHP و Curl و Linkedin و سایر شرکتهای آی تی در جریان است.
تغییر دادن نام متغیرها، متدها یا کتابخانه ها دردسرهای پیش بینی نشده زیادی به همراه دارد و انتظار میرود کار پر هزینه ای باشد. اما به نظر میرسد این تصمیم گرفته شده و حذف عبارت هایی که ریشه در دوران برده داری دارند یا نژاد پرستانه هستند از همین حالا شروع شده است.
قبلا در چند ویدیو استفاده از روش Async در ASP NET Core بررسی شد. این بار از دید سرور به شمارش تعداد Thread ها و مدت زمان تولید Response می پردازیم و رفتار Thread Pool در بکارگیری الگوریتم های Hill Climbing و Starvation Avoidance مشاهده می کنیم.
https://codehaks.com/go/dwt
https://codehaks.com/go/dwt
Forwarded from کدهک
Forwarded from DotNetZoom (ALI_1992)
❇️ نکاتی در مورد تست نویسی روی EF6 / EFCore توسط دیتابیس InMemory
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
Docs
Testing with a mocking framework - EF6
Testing with a mocking framework in Entity Framework 6
Forwarded from کدهک
غلغلک دادن یک دایناسور تک شاخ :
بررسی Single-thread بودن Node.js و مقایسه ی آن با ASP NET Core
https://goo.gl/Y5RpRz
بررسی Single-thread بودن Node.js و مقایسه ی آن با ASP NET Core
https://goo.gl/Y5RpRz
آیا قراردادن کلاسها در کتابخانه های جدا به معنی چند لایه کردن پروژه است؟ تصمیم گیری درباره محل قرار گرفتن اجزای پروژه یکی از ساده ترین در عین حال سخت ترین مراحل پیاده سازی هر پروژه ای است. در این ویدیو می بینیم که چطور فایلها را دسته بندی کنیم و یک مدل انعطاف پذیر برای ساختار پروژه در نظر بگیریم.
https://codehaks.com/go/agt
https://codehaks.com/go/agt
آموزش آپلود کردن فایل در ASP NET Core
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz