#AsynchronousProgramming
#Async #Await
#Tasks
✳️ Async/Await on a Separate Thread
🔸 اجرای عملیات های long-running به صورت غیر همزمان (asynchronous) در سی شارپ با mark کردن آنها با استفاده از کلمه کلیدی های async/await انجام میشود.
🔹 متد هایی که یک Task را به عنوان خروجی باز میگردانند با استفاده از این کلمه کلیدی ها به صورت غیر همزمان اجرا میشوند.
درواقع از await میتوان به همراه یک awaitable argument استفاده کرد که یک عملیات asynchronous است.
دو نوع رایج awaitable argument ها در دات نت ،
Task , Task<T>
میباشد.
🔹 اجرای متدهای long-running به صورت همزمان (synchronous)، باعث بلاک شدن thread جاری تا زمان اتمام آن متد میشود.
🔹همچنین در اپلیکیشن هایی که رابط گرافیکی کاربری دارید اجرای متد های long-running به صورت همزمان، سبب بلاک شدن thread اجرا کننده رابط گرافیکی (UI) میشود و تا زمان اتمام اجرای آن متد رابط کاربری به صورت فریز شده باقی میماند.
اما چنین متدی که خروجی آن یک Task نیست و نمیتوان آنرا با استفاده از async و await به صورت asynchronous اجرا کرد، را چگونه به یک متد asynchronous تبدیل کنیم تا در یک thread جدا اجرا شود.
اینجاست که Task.Run به کمک ما می آید.
🔸 متد Run از کلاس Task باعث اجرا شدن کد های صف شده در یک thread جدا میشود.
معمولا این thread جدید ازthread pool می آید .
▫️ در واقع thread pool مجموعه ای از worker thread هایی است که توسط .net برای اجرای اپلیکیشن، مدیریت میشوند.
▫️ هم چنین یک worker thread یک thread ای است که به درخواست یک client برای انجام کاری فعال میشود.
🔹 مهمترین نکته این که Task.Run به عنوان خروجی یک Task باز میگرداند که این بدین معنی است که می توانید آنرا await کنید.
متد Task.Run دارای overload های متفاوتی است که به عنوان پارامتر یک Action delegate یا یک Func delegate دریافت میکند.
🔸 تاکنون دانستیم که صدا زدن متد Task.Run برای اجرای یک متد long-running باعث اجرا شدن این متد بروی یک thread جدید در thread pool میشود اما پس از اتمام اجرای این متد long-running بقیه و ادامه کد ها بروی کدامین thread اجرا خواهد شد⁉️
🔸 در اکثر مواقع می خواهیم تا ادامه کار بروی thread اصلی ادامه پیدا کند مخصوصا زمانی که اپلیکیشن دارای یک رابط کاربری گرافیکی میباشد و میخواهیم بعد از انجام شدن آن متد long-running عناصری را بروی رابط گرافیکی در thread اصلی آپدیت نماییم. برای آنجام این کار کافیست Task.Run را await نمایید زیرا زمانی که که یک Task را await می کنید اطلاعات context جاری از SynchronizationContext گرفته میشود تا دوباره به thread اصلی اپلیکیشن باز گردد.
🔻زمانی که روی یک متد ای که به صورت Async اجرا میشود ConfigureAwait(
🔹 اما SynchronizationContext چیست و کار آن چه میباشد؟
🔸 هنگامی که با یک اپلیکیشن UI based کار میکنید وابستگی و ارتباط بین thread ها مسئله بسیار مهمی است
زمانی که با چنین اپلیکیشن هایی کار میکنید محدودیتی که وجود دارد این است که عناصر و کنترلر های صفحه توسط UI thread ساخته شده یا تغییر و آپدیت شوند و اگر نیاز باشد که به عنوان مثال 10 تغییر بروی عناصر صفحه صورت گیرد، این عملیات ها در صف قرار میگیرند تا به صورت متوالی توسط UI thread انجام شوند.
این محدودیت برای کمک به UI framework جهت جلوگیری از پیچیدگی های هماهنگی و مدیریت بین thread های مختلف برای آپدیت عناصر و کنترلر های صفحه صورت گرفته است.
و SynchronizationContext ارتباط با UI thread را به صورت منظم مرتب میکند.
در Asp.net Core اما SynchronizationContext برایر null میباشد.
✳️ درا این قسمت یک overview در مورد Task.Run پرداختیم تا در قسمت بعدی به عملیات های I/O و CPU bound پرداخته و با مفاهیم Asynchronous بیشتر آشنا میشویم.
@FullStackDevs
#Async #Await
#Tasks
✳️ Async/Await on a Separate Thread
🔸 اجرای عملیات های long-running به صورت غیر همزمان (asynchronous) در سی شارپ با mark کردن آنها با استفاده از کلمه کلیدی های async/await انجام میشود.
🔹 متد هایی که یک Task را به عنوان خروجی باز میگردانند با استفاده از این کلمه کلیدی ها به صورت غیر همزمان اجرا میشوند.
درواقع از await میتوان به همراه یک awaitable argument استفاده کرد که یک عملیات asynchronous است.
دو نوع رایج awaitable argument ها در دات نت ،
Task , Task<T>
میباشد.
🔹 اجرای متدهای long-running به صورت همزمان (synchronous)، باعث بلاک شدن thread جاری تا زمان اتمام آن متد میشود.
🔹همچنین در اپلیکیشن هایی که رابط گرافیکی کاربری دارید اجرای متد های long-running به صورت همزمان، سبب بلاک شدن thread اجرا کننده رابط گرافیکی (UI) میشود و تا زمان اتمام اجرای آن متد رابط کاربری به صورت فریز شده باقی میماند.
اما چنین متدی که خروجی آن یک Task نیست و نمیتوان آنرا با استفاده از async و await به صورت asynchronous اجرا کرد، را چگونه به یک متد asynchronous تبدیل کنیم تا در یک thread جدا اجرا شود.
اینجاست که Task.Run به کمک ما می آید.
🔸 متد Run از کلاس Task باعث اجرا شدن کد های صف شده در یک thread جدا میشود.
معمولا این thread جدید ازthread pool می آید .
▫️ در واقع thread pool مجموعه ای از worker thread هایی است که توسط .net برای اجرای اپلیکیشن، مدیریت میشوند.
▫️ هم چنین یک worker thread یک thread ای است که به درخواست یک client برای انجام کاری فعال میشود.
🔹 مهمترین نکته این که Task.Run به عنوان خروجی یک Task باز میگرداند که این بدین معنی است که می توانید آنرا await کنید.
متد Task.Run دارای overload های متفاوتی است که به عنوان پارامتر یک Action delegate یا یک Func delegate دریافت میکند.
🔸 تاکنون دانستیم که صدا زدن متد Task.Run برای اجرای یک متد long-running باعث اجرا شدن این متد بروی یک thread جدید در thread pool میشود اما پس از اتمام اجرای این متد long-running بقیه و ادامه کد ها بروی کدامین thread اجرا خواهد شد⁉️
🔸 در اکثر مواقع می خواهیم تا ادامه کار بروی thread اصلی ادامه پیدا کند مخصوصا زمانی که اپلیکیشن دارای یک رابط کاربری گرافیکی میباشد و میخواهیم بعد از انجام شدن آن متد long-running عناصری را بروی رابط گرافیکی در thread اصلی آپدیت نماییم. برای آنجام این کار کافیست Task.Run را await نمایید زیرا زمانی که که یک Task را await می کنید اطلاعات context جاری از SynchronizationContext گرفته میشود تا دوباره به thread اصلی اپلیکیشن باز گردد.
🔻زمانی که روی یک متد ای که به صورت Async اجرا میشود ConfigureAwait(
false
) قرار میدهید. بازگشت به context اصلی صورت نمیگیرد.🔹 اما SynchronizationContext چیست و کار آن چه میباشد؟
🔸 هنگامی که با یک اپلیکیشن UI based کار میکنید وابستگی و ارتباط بین thread ها مسئله بسیار مهمی است
زمانی که با چنین اپلیکیشن هایی کار میکنید محدودیتی که وجود دارد این است که عناصر و کنترلر های صفحه توسط UI thread ساخته شده یا تغییر و آپدیت شوند و اگر نیاز باشد که به عنوان مثال 10 تغییر بروی عناصر صفحه صورت گیرد، این عملیات ها در صف قرار میگیرند تا به صورت متوالی توسط UI thread انجام شوند.
این محدودیت برای کمک به UI framework جهت جلوگیری از پیچیدگی های هماهنگی و مدیریت بین thread های مختلف برای آپدیت عناصر و کنترلر های صفحه صورت گرفته است.
و SynchronizationContext ارتباط با UI thread را به صورت منظم مرتب میکند.
در Asp.net Core اما SynchronizationContext برایر null میباشد.
✳️ درا این قسمت یک overview در مورد Task.Run پرداختیم تا در قسمت بعدی به عملیات های I/O و CPU bound پرداخته و با مفاهیم Asynchronous بیشتر آشنا میشویم.
@FullStackDevs
#linkedin
#RemoveAllMessage
زمانی که می خواهید پیام هایتان در لینکدین را حذف کنید. شما باید هر پیام را یکی یکی انتخاب کنید. برای حذف موفقیت آمیز یک پیام حدود 4 "کلیک" طول می کشد. حالا فکر کنید پیامهایتان خیلی زیاد باشد ، بنابراین زمان زیادی طول میکشد تا همه آنها را پاک کنید . اما با اسکریپت زیر کمتر از یک دقیقه اینکار را میتوانید انجام بدید . لطفا این پست را به اشتراک بزارید که همکاران و دوستان بتوانند استفاده کنند.
1- به صفحه پیامهایتان بروید.
2-کروم console را باز کنید.
3-قطعه کد زیر را در کنسول paste کنید .
#RemoveAllMessage
زمانی که می خواهید پیام هایتان در لینکدین را حذف کنید. شما باید هر پیام را یکی یکی انتخاب کنید. برای حذف موفقیت آمیز یک پیام حدود 4 "کلیک" طول می کشد. حالا فکر کنید پیامهایتان خیلی زیاد باشد ، بنابراین زمان زیادی طول میکشد تا همه آنها را پاک کنید . اما با اسکریپت زیر کمتر از یک دقیقه اینکار را میتوانید انجام بدید . لطفا این پست را به اشتراک بزارید که همکاران و دوستان بتوانند استفاده کنند.
1- به صفحه پیامهایتان بروید.
2-کروم console را باز کنید.
3-قطعه کد زیر را در کنسول paste کنید .
;(function () {@fullStackDevs
setInterval(() => {
let deleted = false;
let dropdowns = document.querySelectorAll('artdeco-dropdown-item');
for (let i = 0; i < dropdowns.length; i++){
let txt = dropdowns[i].textContent.trim();
if (txt === 'Delete') {
deleted = true;
dropdowns[i].click();
}
}
if (deleted){
setTimeout(() => {
let messageModal = document.querySelector('.msg-modal-delete-convo');
let deleteBtn = messageModal.querySelector('.artdeco-button--primary');
deleteBtn.click();
}, 500)
} else {
let messageConverstionCard = document.querySelector('.msg-conversation-card__list-action-icon');
messageConverstionCard.click();
}
}, 1000);
}());
LinkedIn
LinkedIn Login, Sign in | LinkedIn
Login to LinkedIn to keep in touch with people you know, share ideas, and build your career.
#IOBound
#CPU_Bound
#AsynchronousProgramming
#Async #Await
✳️ CPU vs. I/O-Bound Code
🔸 برای تشخیص اینکه چه زمانی از Task.Run استفاده کنیم. ابتدا نیاز به دانستن تفاوت بین کد های CPU-bound و I/O-bound داریم.
🔹 CPU-Bound
🔸 وقتی کدی CPU-Bound باشد اساسا این منظور را میرساند که پردازنده کامپیوتر یا به طور خاص thread ای در پردازنده، جایی است که به واسطه اجرای آن کد دچار ترافیک و صرف زمان زیاد خواهد شد.
▫️ در زمان اجرای کد های CPU-Bound پردازنده تا جای ممکن با سرعت به اجرای چنین کدهایی میپردازد اما با این وجود باز هم مدت زمانی که صرف اجرای چنین کدهایی خواهد شد قابل توجه خواهد بود. به عبارت دیگر در اجرای چنین کدهایی پردازنده محلی است که شما را از اجرای سریعتر باز میدارد و میتوانیم بگوییم که اجرای این کد ها باعث delay در پردازنده خواهد شد.
🔹 I/O-Bound Code
🔸 در مقابل در کد های I/O-Bound نرخ انتقال داده در دستگاه های ورودی و یا خروجی و یا عملیات های ورودی و خروجی عاملی است که باعث ایجاد delay خواهد شد.
مانند خواندن یا ذخیره کردن داده ها از یک فایل یا برقراری ارتباط با سرور جهت دانلود یا آپلود و ...
▫️ در همه این عملیات ها پردازنده تا حدودی بیکار است به این خاطر که منتظر اتمام ارسال و دریافت داده ها میباشد. در صورتی که عملیات I/O-Bound یک ارتباط با یک سرور خارجی باشد و به هر دلیلی اتصال به درستی برقرار نشود احتمالا پردازنده کاملا بیکار خواهد بود تا زمانی که ارتباط برقرار شود.
🔸 همانطور که متوجه شدید گرچه در هر دو عملیات های CPU vs. I/O-Bound تاخیر (delay) وجود دارد اما این عملیات ها در ذات کاملا متفاوت هستند.
✳️ Nature of Asynchronous operation
اصولا استفاده از Task,Run برای اجرای یک عملیات در thread ای جدا، برای عملیات های CPU Bound مسمر ثمر است، ام نه برای عملیات های I/O Bound. ولی چرا ⁉️
🔸 اکثر کامپیوترهای امروزی چندین هسته دارند که کمی شبیه این است که انگار چندین پردازنده دارند. زمانی که اپلیکیشن شروع به اجرا شدن میکند دسته ای از thread ها توسط .Net runtime ساحته میشود تا اپلیکیشن از آنها استفاده کند.
تعداد این thread ها به تعداد هسته های پردازنده کامپیوتر مرتبط است
در نتیجه اگر thread اصلی اپلیکیشن مشغول باشد می توانیم با استفاده از Task.Run عملیات سنگین خود را به لطف پردازنده چند هسته ای مان در thread ای جدا اجرا کنیم .
🔻توجه داشته باشید که thread و core گرچه مرتبط هستند اما با هم تفاوت دارند .
یک thread یک مفهوم نرم افزاری است و یک core یک ابزار سخت افزاری .
▫️ این امکان وجود دارد تا هر چند thread ای که میخواهید بسازید اما تعداد core ها ثابت است .
🔸 وقتی Task.Run را صدا میزنید یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد و این امر بهبود عملکردی را برای اپلیکیشن به ارمغان می آورد.
🔸 وقتی که یک عملیات I/O Bound را با استفاده از Task.Run اجرا میکنید بر روی یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد ولی در اون thread هم باز باید برای دریافت داده ها، منتظر اتمام عملیات I/O باشد.
اینکار ممکن است روشی سریع و آسان برای پاسخگو نگه داشتن اپلیکیشن برای انجام فرامین کاربران باشد اما راه کارآمدی برای استفاده هر چه بهتر منابع سیستم نیست.
🔸 در چنین عملیات هایی راه جل خیلی بهتر استفاده از async و await است. در این روش باز هم اپلیکیشن پاسخو خواهد بود .
🔸 به منظور استفاده از await برای عملیات های I/O Bound بدون استفاده کردن از Task.Run لازم است که از یک متد asynchronous استفاده کنید که یک Task را return کند. خود این متد نباید از Task.Run استفاده کرده باشد .
انجام این کار زمانی که دارید با کلاس های از پیش ساخته شده .Net نظیر FileStream
و HttpClient کار میکنید، ساده است زیرا این کلاس ها برای اعمال خود متد های asynchronous را در اختیار مان قرار میدهند.
گاهی ممکن است کلاسی در درون .net یا یک لایبری فقط متد های synchronous در اختیار مان قرار دهد که در این موارد ممکن مجبور شوید تا از Task.Run استفاده کنید.
اما همیشه و تا جای ممکن از async و await به جای Task.Run برای عملیات های I/O Bound استفاده کنید.
@FullStackDevs
#CPU_Bound
#AsynchronousProgramming
#Async #Await
✳️ CPU vs. I/O-Bound Code
🔸 برای تشخیص اینکه چه زمانی از Task.Run استفاده کنیم. ابتدا نیاز به دانستن تفاوت بین کد های CPU-bound و I/O-bound داریم.
🔹 CPU-Bound
🔸 وقتی کدی CPU-Bound باشد اساسا این منظور را میرساند که پردازنده کامپیوتر یا به طور خاص thread ای در پردازنده، جایی است که به واسطه اجرای آن کد دچار ترافیک و صرف زمان زیاد خواهد شد.
▫️ در زمان اجرای کد های CPU-Bound پردازنده تا جای ممکن با سرعت به اجرای چنین کدهایی میپردازد اما با این وجود باز هم مدت زمانی که صرف اجرای چنین کدهایی خواهد شد قابل توجه خواهد بود. به عبارت دیگر در اجرای چنین کدهایی پردازنده محلی است که شما را از اجرای سریعتر باز میدارد و میتوانیم بگوییم که اجرای این کد ها باعث delay در پردازنده خواهد شد.
🔹 I/O-Bound Code
🔸 در مقابل در کد های I/O-Bound نرخ انتقال داده در دستگاه های ورودی و یا خروجی و یا عملیات های ورودی و خروجی عاملی است که باعث ایجاد delay خواهد شد.
مانند خواندن یا ذخیره کردن داده ها از یک فایل یا برقراری ارتباط با سرور جهت دانلود یا آپلود و ...
▫️ در همه این عملیات ها پردازنده تا حدودی بیکار است به این خاطر که منتظر اتمام ارسال و دریافت داده ها میباشد. در صورتی که عملیات I/O-Bound یک ارتباط با یک سرور خارجی باشد و به هر دلیلی اتصال به درستی برقرار نشود احتمالا پردازنده کاملا بیکار خواهد بود تا زمانی که ارتباط برقرار شود.
🔸 همانطور که متوجه شدید گرچه در هر دو عملیات های CPU vs. I/O-Bound تاخیر (delay) وجود دارد اما این عملیات ها در ذات کاملا متفاوت هستند.
✳️ Nature of Asynchronous operation
اصولا استفاده از Task,Run برای اجرای یک عملیات در thread ای جدا، برای عملیات های CPU Bound مسمر ثمر است، ام نه برای عملیات های I/O Bound. ولی چرا ⁉️
🔸 اکثر کامپیوترهای امروزی چندین هسته دارند که کمی شبیه این است که انگار چندین پردازنده دارند. زمانی که اپلیکیشن شروع به اجرا شدن میکند دسته ای از thread ها توسط .Net runtime ساحته میشود تا اپلیکیشن از آنها استفاده کند.
تعداد این thread ها به تعداد هسته های پردازنده کامپیوتر مرتبط است
در نتیجه اگر thread اصلی اپلیکیشن مشغول باشد می توانیم با استفاده از Task.Run عملیات سنگین خود را به لطف پردازنده چند هسته ای مان در thread ای جدا اجرا کنیم .
🔻توجه داشته باشید که thread و core گرچه مرتبط هستند اما با هم تفاوت دارند .
یک thread یک مفهوم نرم افزاری است و یک core یک ابزار سخت افزاری .
▫️ این امکان وجود دارد تا هر چند thread ای که میخواهید بسازید اما تعداد core ها ثابت است .
🔸 وقتی Task.Run را صدا میزنید یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد و این امر بهبود عملکردی را برای اپلیکیشن به ارمغان می آورد.
🔸 وقتی که یک عملیات I/O Bound را با استفاده از Task.Run اجرا میکنید بر روی یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد ولی در اون thread هم باز باید برای دریافت داده ها، منتظر اتمام عملیات I/O باشد.
اینکار ممکن است روشی سریع و آسان برای پاسخگو نگه داشتن اپلیکیشن برای انجام فرامین کاربران باشد اما راه کارآمدی برای استفاده هر چه بهتر منابع سیستم نیست.
🔸 در چنین عملیات هایی راه جل خیلی بهتر استفاده از async و await است. در این روش باز هم اپلیکیشن پاسخو خواهد بود .
🔸 به منظور استفاده از await برای عملیات های I/O Bound بدون استفاده کردن از Task.Run لازم است که از یک متد asynchronous استفاده کنید که یک Task را return کند. خود این متد نباید از Task.Run استفاده کرده باشد .
انجام این کار زمانی که دارید با کلاس های از پیش ساخته شده .Net نظیر FileStream
و HttpClient کار میکنید، ساده است زیرا این کلاس ها برای اعمال خود متد های asynchronous را در اختیار مان قرار میدهند.
گاهی ممکن است کلاسی در درون .net یا یک لایبری فقط متد های synchronous در اختیار مان قرار دهد که در این موارد ممکن مجبور شوید تا از Task.Run استفاده کنید.
اما همیشه و تا جای ممکن از async و await به جای Task.Run برای عملیات های I/O Bound استفاده کنید.
@FullStackDevs
#NET5Preview3
معرفی net 5 preview 3
🔸نسخه NET 5.0 شامل مجموعه ای از ویژگی های جدید و بهبود عملکرد است. و در حال کار بر روی ویژگی های بزرگتری میباشند که نسخه 5.0 release را تعریف می کند.
🔹در اینجا میتونید به پست و مخزن dotnet / design نگاهی بیندازید و هر بازخوردی را که دارید با تیم دات نت در میان بگذارید.
🔹شما میتونید نسخه دات نت 5 را برای Windows, macOS, و Linux دانلود کنید .
▪️بهبود کیفیت کد در RyuJIT:
هر نسخه شامل مجموعه ای از تغییرات است که باعث بهبود machine code ای می شود که JIT تولید می کند (ما این را "code quality" می نامیم). کیفیت بهتر کد به معنای عملکرد بهتر برنامه است.
▫️بهبود System.Text.Json
✅برطرف کردن مشکل ReferenceLoopHandling در System.Text.Json که یکی ازویژگی های مهم سریال سازی در JSON.NET است.
✅اضافه شدن چند Extension method برای HttpClient که امکان سریال سازی از / به JSON را دارند مثلا:
GetJsonAsync<T>(HttpClient, String)
✅در این نسخه پشتیبانی از structs و کلاس ها immutable را به JsonSerializer اضافه می کند.(توی Newtonsoft.Json یه اتریبوتی دارد بنام [JsonConstructor] که این امکان رو میده وقتی چند constructor داریم ،کدوم آنها در زمان deserialize صدا زده بشه ولی تو System.Text.Json فقط از constructor بدون پارامتر پشتیبانی میشود)
▪️پشتیبانی NET SDK برای اسمبلی Net framework
این تغییر ساخت پروژه های Net Framework را بر روی یک دستگاه بدون نصب package مورد نیاز NET Framework مورد نیاز امکان پذیر می کند. این پیشرفت مختص هدف قرار دادن package ها است و وابستگی های دیگری که ممکن است یک پروژه داشته باشد را در نظر نمی گیرد.
@fullStackDevs
معرفی net 5 preview 3
🔸نسخه NET 5.0 شامل مجموعه ای از ویژگی های جدید و بهبود عملکرد است. و در حال کار بر روی ویژگی های بزرگتری میباشند که نسخه 5.0 release را تعریف می کند.
🔹در اینجا میتونید به پست و مخزن dotnet / design نگاهی بیندازید و هر بازخوردی را که دارید با تیم دات نت در میان بگذارید.
🔹شما میتونید نسخه دات نت 5 را برای Windows, macOS, و Linux دانلود کنید .
▪️بهبود کیفیت کد در RyuJIT:
هر نسخه شامل مجموعه ای از تغییرات است که باعث بهبود machine code ای می شود که JIT تولید می کند (ما این را "code quality" می نامیم). کیفیت بهتر کد به معنای عملکرد بهتر برنامه است.
▫️بهبود System.Text.Json
✅برطرف کردن مشکل ReferenceLoopHandling در System.Text.Json که یکی ازویژگی های مهم سریال سازی در JSON.NET است.
✅اضافه شدن چند Extension method برای HttpClient که امکان سریال سازی از / به JSON را دارند مثلا:
GetJsonAsync<T>(HttpClient, String)
return await client.GetJsonAsync<List<Country>>(new Uri(url));در مثال بالا فرض کنید api داریم که لیست کشور ها رو بصورت json برمیگرداند و با <GetJsonAsync<T که T نوع آبجکت خروجی deserialize شده لیستی از country خروجی داریم .(لیست HttpClientJsonExtensions )
✅در این نسخه پشتیبانی از structs و کلاس ها immutable را به JsonSerializer اضافه می کند.(توی Newtonsoft.Json یه اتریبوتی دارد بنام [JsonConstructor] که این امکان رو میده وقتی چند constructor داریم ،کدوم آنها در زمان deserialize صدا زده بشه ولی تو System.Text.Json فقط از constructor بدون پارامتر پشتیبانی میشود)
▪️پشتیبانی NET SDK برای اسمبلی Net framework
این تغییر ساخت پروژه های Net Framework را بر روی یک دستگاه بدون نصب package مورد نیاز NET Framework مورد نیاز امکان پذیر می کند. این پیشرفت مختص هدف قرار دادن package ها است و وابستگی های دیگری که ممکن است یک پروژه داشته باشد را در نظر نمی گیرد.
@fullStackDevs
.NET Blog
Announcing .NET 5.0 Preview 3
Today, we’re releasing .NET 5.0 Preview 3. It contains a set of new features and performance improvements. We’re continuing to work on the bigger features that will define the 5.0 release. The .NET 5.0 Preview 1 post covers what we are planning on building…
#EFCore5Preview3
#EFCore5
معرفی Entity Framework Core 5.0 Preview 3
🔸پیش نمایش های EF Core 5.0 نیاز به NET Standard 2.1 دارد. این یعنی:
▫️انتیتی فریمورک Core 5.0 در NET Core 3.1 اجرا می شود. نیازی به NET 5 ندارد.( این ممکن است در پیش نمایش های آینده بسته به نحوه تکامل برنامه برای NET 5 تغییر کند.)
▪️انتیتی فریمورک Core 5.0 بر روی سیستم عامل های دیگری که از NET Standard 2.1 پشتیبانی می کنند اجرا می شود.
▫️انتیتی فریمورک Core 5.0 بر روی سیستم عاملهای استاندارد NET Standard 2.0، از جمله Net Framework اجرا نمی شود.
🔹چگونه می توان پیش نمایش های EF Core 5.0 را دریافت کرد:
انتیتی فریمورک منحصراً به صورت مجموعه ای از NuGet packages توزیع می شود.
به عنوان مثال ، برای افزودن SQL Server provider به پروژه خود ، می توانید از دستور زیر با استفاده از ابزار dotnet استفاده کنید:
🔸نصب dotnet ef
مانند EF Core 3.0 و 3.1 ، ابزار خط فرمان dotnet ef دیگر در .NET Core SDK گنجانده نشده است. قبل از اجرای دستورات EF Core migration or scaffolding commands ، باید این بسته را به عنوان یک ابزار global یا محلی نصب کنید.
برای نصب ابزار ، ابتدا نسخه های موجود را با استفاده از زیر حذف کنید:
🔻امکانات جدیدی که به این نسخه اضافه شده:
✅Filtered Include
پشتیبانی قابلیت Filter کردن Include ها
✅New ModelBuilder API for navigation properties
متد جدید Navigation که وقتی navigation properties نیاز به تنظیمات اضافی داشته باشد میتونید استفاده کنید.
⛔️توجه داشته باشید که API navigation جایگزین پیکربندی relationship نمی شود.
درعوض امکان تنظیمات اضافی از خصوصیات navigation را در روابط قبلاً تعریف شده فراهم می کند.
✅New command-line parameters for namespaces and connection strings
اکنون Migrations و scaffolding اجازه می دهد تا namespaces در خط فرمان مشخص شود.
به عنوان مثال ، برای مهندسی معکوس یک database که context و کلاس های مدل را در namespace های مختلف نامگذاری می کند
به دلایل عملکرد ، EF در هنگام خواندن مقادیر از پایگاه داده ، بررسیهای null-checks را انجام نمی دهد.
و در صورت مواجهه با null ، این امر می تواند به exception منجر شود.
با استفاده از EnableDetailedErrors ، بررسیهای null checking اضافه می شود.
#EFCore5
معرفی Entity Framework Core 5.0 Preview 3
🔸پیش نمایش های EF Core 5.0 نیاز به NET Standard 2.1 دارد. این یعنی:
▫️انتیتی فریمورک Core 5.0 در NET Core 3.1 اجرا می شود. نیازی به NET 5 ندارد.( این ممکن است در پیش نمایش های آینده بسته به نحوه تکامل برنامه برای NET 5 تغییر کند.)
▪️انتیتی فریمورک Core 5.0 بر روی سیستم عامل های دیگری که از NET Standard 2.1 پشتیبانی می کنند اجرا می شود.
▫️انتیتی فریمورک Core 5.0 بر روی سیستم عاملهای استاندارد NET Standard 2.0، از جمله Net Framework اجرا نمی شود.
🔹چگونه می توان پیش نمایش های EF Core 5.0 را دریافت کرد:
انتیتی فریمورک منحصراً به صورت مجموعه ای از NuGet packages توزیع می شود.
به عنوان مثال ، برای افزودن SQL Server provider به پروژه خود ، می توانید از دستور زیر با استفاده از ابزار dotnet استفاده کنید:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.3.20181.2همچنین نسخه 5.0 پیش نمایش 3 از ارائه دهنده Microsoft.Data.Sqlite.Core ADO.NET را منتشر کرده ایم.
🔸نصب dotnet ef
مانند EF Core 3.0 و 3.1 ، ابزار خط فرمان dotnet ef دیگر در .NET Core SDK گنجانده نشده است. قبل از اجرای دستورات EF Core migration or scaffolding commands ، باید این بسته را به عنوان یک ابزار global یا محلی نصب کنید.
برای نصب ابزار ، ابتدا نسخه های موجود را با استفاده از زیر حذف کنید:
dotnet tool uninstall --global dotnet-efسپس دستور زیر برای نصب نسخه پیش نمایش:
dotnet tool install --global dotnet-ef --version 5.0.0-preview.3.20181.2🔹می توان از این نسخه جدید dotnet ef با پروژه هایی استفاده کرد که از نسخه های قدیمی تر EF Core runtime استفاده می کنند.
🔻امکانات جدیدی که به این نسخه اضافه شده:
✅Filtered Include
پشتیبانی قابلیت Filter کردن Include ها
var blogs = context.Blogsاین Query بلاگ ها را به همراه هر post مرتبط باز می گرداند ، اما فقط هنگامی که عنوان post حاوی "cheese" باشد.( برای جزئیات کامل به مستندات شامل مراجعه کنید.)
.Include(e => e.Posts.Where(p => p.Title.Contains("Cheese")))
.ToList();
✅New ModelBuilder API for navigation properties
متد جدید Navigation که وقتی navigation properties نیاز به تنظیمات اضافی داشته باشد میتونید استفاده کنید.
modelBuilder.Entity<Blog>().Navigation(e => e.Posts).HasField("_myposts");
⛔️توجه داشته باشید که API navigation جایگزین پیکربندی relationship نمی شود.
درعوض امکان تنظیمات اضافی از خصوصیات navigation را در روابط قبلاً تعریف شده فراهم می کند.
✅New command-line parameters for namespaces and connection strings
اکنون Migrations و scaffolding اجازه می دهد تا namespaces در خط فرمان مشخص شود.
به عنوان مثال ، برای مهندسی معکوس یک database که context و کلاس های مدل را در namespace های مختلف نامگذاری می کند
dotnet ef dbcontext scaffold "connection string" Microsoft.EntityFrameworkCore.SqlServer --context-namespace "My.Context" --namespace "My.Model"همچنین ، connection string اکنون می تواند به دستور database-update منتقل شود:
dotnet ef database update --connection "connection string"✅EnableDetailedErrors has returned
به دلایل عملکرد ، EF در هنگام خواندن مقادیر از پایگاه داده ، بررسیهای null-checks را انجام نمی دهد.
و در صورت مواجهه با null ، این امر می تواند به exception منجر شود.
با استفاده از EnableDetailedErrors ، بررسیهای null checking اضافه می شود.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)@fullStackDevs
=> optionsBuilder
.EnableDetailedErrors()
.EnableSensitiveDataLogging() // Often also useful with EnableDetailedErrors
.UseSqlServer(Your.SqlServerConnectionString);
.NET Blog
Announcing Entity Framework Core 5.0 Preview 3 | .NET Blog
The latest version of Entity Framework Core features filtered includes, new model builder API for navigation, Cosmos DB partition keys, and more.
Forwarded from Web Devs
#StaticType
#DynamicType
✳️ What are Exactly Static and Dynamic Types⁉️
🔹لزوما برای فهمیدن پایه ایه این مفهوم نیاز به دانستن زبان برنامه نویسی خاصی ندارید زیرا اینها مفاهیم طراحی زبان های برنامه نویسی هستند.پس بنابراین عدم آشنابودن با یک زبان برنامه نویسی خاص به درک این مفهوم لطمه ای وارد نمیکند.
🔻در ابتدای امر باید بدانید منظور از کلمه type در static type و dynamic type نوع داده ای متغیر ها میباشد.
▪️برای تشریح static type یا dynamic type بودن تعاریف مختلفی وجود دارد که در این پست به معقول ترین آنها میپردازیم.
▪️ type checking
🔸 فرایند تایید و اعمال محدودیت ها بروی انواع داده ها را type checking می گویند. در برخی زبانها type checking در زمان compile time و در برخی در زمان runtime انجام میشود. در واقع انجام عملیات type checking در مورد type safe بودن برنامه است تا type error های احتمالی را کاهش دهد.
▫️ type error
🔸یک type error میتواند وضعیتی باشد که در هنگام انجام یک عملیات بروی نوع های داده ای اتفاق بیافتد. برای مثال جمع کردن یک رشته با یک عدد صحیح باهم.
خطاهای type error در زبان های برنامه نویسی زیادی اتفاق می افتد بسته به نوع زبان برنامه نویسی این ارور ها در زمان compile time یا در زمان runtime صادر میشود.
▪️type safe
🔸به عملیاتی الحاق میشود که در آن برنامه از درست بودن نوع داده هایی که عملیات بروی آنها انجام میشود اطمینان حاصل میکند.
✳️ static type language
🔸 یک زبان برنامه نویسی static type زبانی است که نوع داده ای متغیر ها در زمان compile time مشخص میشود.در زبان های برنامه نویسی static type زمانی که یک متغیر با یک نوع داده ای مشخص تعریف شده است دیگر قادر به پذیرفتن داده هایی با نوع دیگر نخواهد بود . در صورت اختصاص دادن داده ای با نوع داده ای مختلف با یک type error در زمان compile time مواجه میشوید.
✳️ Dynamic type language
🔸یک زبان برنامه نویسی dynamic type زبانی است که نوع متغیر ها در زمان runtime چک و همچنین مشخص میشود. در زبان های dynamic type اگر به یک متغیر مقدار integer اختصاص دهید نوع آن متغیر از نوع integer تعیین میشود. اما اگر به همان متغیر در چند خط پایین تر در کد یک مقدار رشته ای تخصیص دهید نوع داده ای تعیین شده برای متغیر به string تغییر پیدا خواهد کرد.
✳️ معایب و مزایا
▪️static type
🔹حجم کثیری از خطاها و ارورها در فرایند توسعه مشخص و برطرف میشود.
🔹پرفورمنس بهتر(به دلیل اعمال محدودیت بر انواع داده ای و مشخص شدن نوع داده ها در زمان کامپایل)، کد ماشین بهینه تری تولید میشود.
🔹مستند سازی بهتر زیرا با مشخص بودن نوع داده ها و برطرف کردن خطاهای احتمالی رفتار تابع ها قابل پیش بینی تر خواهد بود.
🔹پیدا کردن راحت تر اشیا و متغیر ها در کد.
🔹کار کردن راحت تر با دیتابیس های رابطه ای و دیگر سیستم هایی که متکی به static type بودن هستند.
▪️Dynamic type language
🔹کد فشرده تر و کمتر
🔹عدم وجود مرحله کامپایل به این معنی که برای تست کردن تغییرات در کد دیگر منتظر کامپایلر برای کامپایل کردن کدها نیستید.این نوع زبان ها غالبا مفسری هستند و اگر در زمان runtime اروری اتفاق بیافتد، باعث کاهش پرفورمنس برنامه میشود.همچنین انجام type checking ها در زمان runtime در این نوع زبان ها بر پرفورمنس برنامه تاثیر منفی دارد.
🔹صرف زمان کمتر برای برطرف کردن syntax و همچنین semantic ارورها و به جای آن کل زمان خود را میتوانید به برطرف کردن logic ارورها بپردازید.
🔹ریفکتور کردن کدها فقط باعث تغییرات محلی میشود. برای مثال در زبان های static type با تغییر نام یک کلاس باید در سراسر کد خود این تغییر را اعمال کنید.(البته این کار در IDE های امروزی به راحتی قابل انجام است).
🔻منابع
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
@FullStackDevs
#DynamicType
✳️ What are Exactly Static and Dynamic Types⁉️
🔹لزوما برای فهمیدن پایه ایه این مفهوم نیاز به دانستن زبان برنامه نویسی خاصی ندارید زیرا اینها مفاهیم طراحی زبان های برنامه نویسی هستند.پس بنابراین عدم آشنابودن با یک زبان برنامه نویسی خاص به درک این مفهوم لطمه ای وارد نمیکند.
🔻در ابتدای امر باید بدانید منظور از کلمه type در static type و dynamic type نوع داده ای متغیر ها میباشد.
▪️برای تشریح static type یا dynamic type بودن تعاریف مختلفی وجود دارد که در این پست به معقول ترین آنها میپردازیم.
▪️ type checking
🔸 فرایند تایید و اعمال محدودیت ها بروی انواع داده ها را type checking می گویند. در برخی زبانها type checking در زمان compile time و در برخی در زمان runtime انجام میشود. در واقع انجام عملیات type checking در مورد type safe بودن برنامه است تا type error های احتمالی را کاهش دهد.
▫️ type error
🔸یک type error میتواند وضعیتی باشد که در هنگام انجام یک عملیات بروی نوع های داده ای اتفاق بیافتد. برای مثال جمع کردن یک رشته با یک عدد صحیح باهم.
خطاهای type error در زبان های برنامه نویسی زیادی اتفاق می افتد بسته به نوع زبان برنامه نویسی این ارور ها در زمان compile time یا در زمان runtime صادر میشود.
▪️type safe
🔸به عملیاتی الحاق میشود که در آن برنامه از درست بودن نوع داده هایی که عملیات بروی آنها انجام میشود اطمینان حاصل میکند.
✳️ static type language
🔸 یک زبان برنامه نویسی static type زبانی است که نوع داده ای متغیر ها در زمان compile time مشخص میشود.در زبان های برنامه نویسی static type زمانی که یک متغیر با یک نوع داده ای مشخص تعریف شده است دیگر قادر به پذیرفتن داده هایی با نوع دیگر نخواهد بود . در صورت اختصاص دادن داده ای با نوع داده ای مختلف با یک type error در زمان compile time مواجه میشوید.
✳️ Dynamic type language
🔸یک زبان برنامه نویسی dynamic type زبانی است که نوع متغیر ها در زمان runtime چک و همچنین مشخص میشود. در زبان های dynamic type اگر به یک متغیر مقدار integer اختصاص دهید نوع آن متغیر از نوع integer تعیین میشود. اما اگر به همان متغیر در چند خط پایین تر در کد یک مقدار رشته ای تخصیص دهید نوع داده ای تعیین شده برای متغیر به string تغییر پیدا خواهد کرد.
✳️ معایب و مزایا
▪️static type
🔹حجم کثیری از خطاها و ارورها در فرایند توسعه مشخص و برطرف میشود.
🔹پرفورمنس بهتر(به دلیل اعمال محدودیت بر انواع داده ای و مشخص شدن نوع داده ها در زمان کامپایل)، کد ماشین بهینه تری تولید میشود.
🔹مستند سازی بهتر زیرا با مشخص بودن نوع داده ها و برطرف کردن خطاهای احتمالی رفتار تابع ها قابل پیش بینی تر خواهد بود.
🔹پیدا کردن راحت تر اشیا و متغیر ها در کد.
🔹کار کردن راحت تر با دیتابیس های رابطه ای و دیگر سیستم هایی که متکی به static type بودن هستند.
▪️Dynamic type language
🔹کد فشرده تر و کمتر
🔹عدم وجود مرحله کامپایل به این معنی که برای تست کردن تغییرات در کد دیگر منتظر کامپایلر برای کامپایل کردن کدها نیستید.این نوع زبان ها غالبا مفسری هستند و اگر در زمان runtime اروری اتفاق بیافتد، باعث کاهش پرفورمنس برنامه میشود.همچنین انجام type checking ها در زمان runtime در این نوع زبان ها بر پرفورمنس برنامه تاثیر منفی دارد.
🔹صرف زمان کمتر برای برطرف کردن syntax و همچنین semantic ارورها و به جای آن کل زمان خود را میتوانید به برطرف کردن logic ارورها بپردازید.
🔹ریفکتور کردن کدها فقط باعث تغییرات محلی میشود. برای مثال در زبان های static type با تغییر نام یک کلاس باید در سراسر کد خود این تغییر را اعمال کنید.(البته این کار در IDE های امروزی به راحتی قابل انجام است).
🔻منابع
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
@FullStackDevs
Forwarded from Web Devs
#Caching
کشینگ (Caching) چیست؟
از جمله مواردی که استفاده درست و بجا از آن به طور قابل ملاحظه ای باعث افزایش کارایی برنامه میشود Caching میباشد.درواقع Caching مکانیزمی است که داده ها را ذخیره میکند تا درخواست های آینده برای آن داده ها سریعتر انجام شود و نتیجه به کلاینت زودتر بازگشت داده شود.داده های ذخیره شده می تواند نتیجه محاسبات قبلی یا کپی ای از داده های دیگر در جای دیگری باشد.این کار برای جلوگیری از محاسبات تکراری و یا کاهش درخواست ها به دیتابیس،برای داده هایی که امکان تغییر مداوم آنها کم است و همچنین هزینه محاسبه و یا ساخت دوباره آن زیاد است، صورت میگیرد.
خوشبخانه AspNetCore از روش های مختلف Caching پشتیبانی میکند.
از جمله این روش ها به Cache In Memory و Distributed Cache می توان اشاره کرد.
روش Cache In Memory از حافظه رم سرور برای ذخیره داده های کش شده استفاده میکند. این نوع Cache متناسب برای یک سرور است و برای استفاده از این روش زمانی که چند سرور دارید از ویژگی یا تکنینک Sticky session ( که به معنی درخواست های کلاینت به همان سروری که داده ها را Cache کرده برای پردازش Route میشوند) استفاده کرد.
از روش Distributed Cache برای share کردن داده های کش شده بین چندین سرور استفاده میشود. معمولا داده ها در یک سرور خارجی نگه داشته میشوند و دیگر سرور ها به آن دسترسی دارند.
محل قرا گیری عملیات Caching در معماری پروژه هایمان کجاست؟
معماری رایج در بین وب اپلیکیشن ها غالبا یک معماری تمیز (Clean Architecture) میباشد . و ما در این پست به قرار دادن عملیات مربوط به caching در چنین معماری هایی میپردازیم.
در این قبیل معماری ها براساس اصول طراحی و قوائد تعیین شده در DDD اپلیکیشن به لایه هایی تقسیم میشود و به ترتیب داخلی ترین لایه که Domain layer میباشد و کمترین وابستگی را به یک Dll خارجی دارد و هرچه به لایه های بالاتر میرویم وابستگی لایه ها به یکدیگر بیشتر میشود. از ویژگی های یک معماری خوب Loose Coupling در بین لایه ها میباشد یعنی وابستگی لایه ها به یکدیگر را بقدری کاهش داد که با تغییر یک لایه خللی در کار دیگر لایه ها صورت نگیرد. البته در این تعریف منظور از کاهش وابستگی یعنی کاهش وابستگی در زمان Compile time.
در یک Clean Architecture یا به عبارتی در یک Clean DDD Architecture معمولا لایه های بدین شکل خواهند بود :
1 - Domain|Core layer
2 - Services | Application Layer
3 - Infrastructure Layer
4 - UI Layer
در لایه Domain اپلیکیشن Entitiy ها و Contract ها(interface) های قرار میگیرد و در لایه Infrastructure معمولا پیاده سازی دسترسی به داده ها و دیگر سرویس ها خارجی مانند FileLogger و SmtpNotifier میباشد.این لایه امکان دسترسی و ذخیره سازی دائمی داده ها را ممکن میسازد،همچنین اطلاعات موجود Domain Entity ها در دیتابیس یا هر store دیگری به صورت دائمی در این لایه برای ذخیره، پیاده سازی میشود.از سوی دیگر ریپازیتوری های ما در این لایه پیاده سازی میشوند.(ریپازیتوری محلی است که امکان دسترسی یه اینتیتی ها و valueObject ها را فراهم میکند).
برای پیدا کردن محل درست caching باید با وظیفه یک عامل دیگر اشنا باشیم.
Repository pattern
الگوی طراحی ریپازیتوری یک روش برای انتزاعی کردن دسترسی به داده ها به جای استفاده Concrete شده از آنها میباشد.
از جمله دلیل استفاده از این الگو جلوگیری از دوباره نویسی Query ها و همچنین امکان تغییر دیتابیس یا ORM اپلیکیشن را میتوان بر شمرد.
همانطور که گفتیم ریپازیتوری راه دسترسی ما به داده هاست ، این داده ها ممکن از از دیتابیس واکشی شوند یا اینکه از Cache خوانده شوند و از آنجایی که پیاده سازی الگوی Repository در لایه Infrastructure صورت میگیرد پس در نتیجه لایه قرارگیری caching نیز در همین لایه و در ریپازیتوری میباشد .
اما پیاده سازی caching در داخل خود ریپازیتوری چند مشکل اساسی دارد، مشکل، عدم تست پذیری و نقض اصل اول Solid یعنی Single responsibility میباشد.
برای حل این مشکل یک الگوی طراحی Structural به کمک ما می آید و با پیاده سازی آن این مشکل را حل میکنیم.
در این قسمت به بررسی یک سری از مسائل پایه پرداختیم و در قسمت بعدی این پست به طریقه پیاده سازی آن خواهیم پرداخت.
@fullStackDevs
کشینگ (Caching) چیست؟
از جمله مواردی که استفاده درست و بجا از آن به طور قابل ملاحظه ای باعث افزایش کارایی برنامه میشود Caching میباشد.درواقع Caching مکانیزمی است که داده ها را ذخیره میکند تا درخواست های آینده برای آن داده ها سریعتر انجام شود و نتیجه به کلاینت زودتر بازگشت داده شود.داده های ذخیره شده می تواند نتیجه محاسبات قبلی یا کپی ای از داده های دیگر در جای دیگری باشد.این کار برای جلوگیری از محاسبات تکراری و یا کاهش درخواست ها به دیتابیس،برای داده هایی که امکان تغییر مداوم آنها کم است و همچنین هزینه محاسبه و یا ساخت دوباره آن زیاد است، صورت میگیرد.
خوشبخانه AspNetCore از روش های مختلف Caching پشتیبانی میکند.
از جمله این روش ها به Cache In Memory و Distributed Cache می توان اشاره کرد.
روش Cache In Memory از حافظه رم سرور برای ذخیره داده های کش شده استفاده میکند. این نوع Cache متناسب برای یک سرور است و برای استفاده از این روش زمانی که چند سرور دارید از ویژگی یا تکنینک Sticky session ( که به معنی درخواست های کلاینت به همان سروری که داده ها را Cache کرده برای پردازش Route میشوند) استفاده کرد.
از روش Distributed Cache برای share کردن داده های کش شده بین چندین سرور استفاده میشود. معمولا داده ها در یک سرور خارجی نگه داشته میشوند و دیگر سرور ها به آن دسترسی دارند.
محل قرا گیری عملیات Caching در معماری پروژه هایمان کجاست؟
معماری رایج در بین وب اپلیکیشن ها غالبا یک معماری تمیز (Clean Architecture) میباشد . و ما در این پست به قرار دادن عملیات مربوط به caching در چنین معماری هایی میپردازیم.
در این قبیل معماری ها براساس اصول طراحی و قوائد تعیین شده در DDD اپلیکیشن به لایه هایی تقسیم میشود و به ترتیب داخلی ترین لایه که Domain layer میباشد و کمترین وابستگی را به یک Dll خارجی دارد و هرچه به لایه های بالاتر میرویم وابستگی لایه ها به یکدیگر بیشتر میشود. از ویژگی های یک معماری خوب Loose Coupling در بین لایه ها میباشد یعنی وابستگی لایه ها به یکدیگر را بقدری کاهش داد که با تغییر یک لایه خللی در کار دیگر لایه ها صورت نگیرد. البته در این تعریف منظور از کاهش وابستگی یعنی کاهش وابستگی در زمان Compile time.
در یک Clean Architecture یا به عبارتی در یک Clean DDD Architecture معمولا لایه های بدین شکل خواهند بود :
1 - Domain|Core layer
2 - Services | Application Layer
3 - Infrastructure Layer
4 - UI Layer
در لایه Domain اپلیکیشن Entitiy ها و Contract ها(interface) های قرار میگیرد و در لایه Infrastructure معمولا پیاده سازی دسترسی به داده ها و دیگر سرویس ها خارجی مانند FileLogger و SmtpNotifier میباشد.این لایه امکان دسترسی و ذخیره سازی دائمی داده ها را ممکن میسازد،همچنین اطلاعات موجود Domain Entity ها در دیتابیس یا هر store دیگری به صورت دائمی در این لایه برای ذخیره، پیاده سازی میشود.از سوی دیگر ریپازیتوری های ما در این لایه پیاده سازی میشوند.(ریپازیتوری محلی است که امکان دسترسی یه اینتیتی ها و valueObject ها را فراهم میکند).
برای پیدا کردن محل درست caching باید با وظیفه یک عامل دیگر اشنا باشیم.
Repository pattern
الگوی طراحی ریپازیتوری یک روش برای انتزاعی کردن دسترسی به داده ها به جای استفاده Concrete شده از آنها میباشد.
از جمله دلیل استفاده از این الگو جلوگیری از دوباره نویسی Query ها و همچنین امکان تغییر دیتابیس یا ORM اپلیکیشن را میتوان بر شمرد.
همانطور که گفتیم ریپازیتوری راه دسترسی ما به داده هاست ، این داده ها ممکن از از دیتابیس واکشی شوند یا اینکه از Cache خوانده شوند و از آنجایی که پیاده سازی الگوی Repository در لایه Infrastructure صورت میگیرد پس در نتیجه لایه قرارگیری caching نیز در همین لایه و در ریپازیتوری میباشد .
اما پیاده سازی caching در داخل خود ریپازیتوری چند مشکل اساسی دارد، مشکل، عدم تست پذیری و نقض اصل اول Solid یعنی Single responsibility میباشد.
برای حل این مشکل یک الگوی طراحی Structural به کمک ما می آید و با پیاده سازی آن این مشکل را حل میکنیم.
در این قسمت به بررسی یک سری از مسائل پایه پرداختیم و در قسمت بعدی این پست به طریقه پیاده سازی آن خواهیم پرداخت.
@fullStackDevs
blog.airbrake.io
Domain-Driven Design: What is it and how do you use it?
A detailed look at domain-driven design in software development, including basic implementation and a handful of advantages and disadvantages of its use.
Forwarded from Web Devs
#Chain_posts
#JavaScript_code_snippets
"نرم افزار ها در حال بلعیدن جهان هستند و جاوا اسکریپت در حال بلعیدن نرم افزارها. هر ساله جاوا اسکریپت در حال چیره شدن برنرم افزار ها میباشد و هیچ کسی نمیداند که در نهایت چه چیزی می تواند جایگزین آن شود."
🔸در این پست به معرفی چند code snippet در زبان جاوا اسکریپت می پردازیم که به صورت زنجیروار ادامه خواهد داشت.
🔹.all
▫️خروجی این قطعه کد true خواهد بود اگر شرط مورد نظر برای تمام عناصر آرایه true باشد و بلعکس.
const all = (arr, fn = Boolean) => arr.every(fn);
all([4, 2, 3], x => x > 1); // true
all([1, 2, 3]); // true
🔻متد every() یک تابع را بروی تمام عناصر ارایه برای مطمئن شدن از برقرار بودن شرط مورد نظر چک میکند. اگر عنصری در این آرایه نتواند شرط مورد نظر را پاس کند ، دیگر عناصر ارایه (باقیمانده) چک نخواهند شد.
🔹.allEqual
▫️خروجی قطعه کد زیر در صورت برابر بودن تمام عناصر آرایه با یکدیگر true خواهد بود
const allEqual = arr => arr.every(val => val === arr[0]);
allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true
🔻عملگر === در جاوا اسکریپت دو متغیر را براساس نوع و مقدار با هم مقایسه میکند.
11 === 11
▫️این قطعه کد چک خواهد کرد که دو عدد به طور تقریبی با هم برابر هستند یا خیر.
🔻در این کد کلمه کلیدی const به این معنی میباشد که متغیر تعریف شده ثابت بوده و غیر قابل تغییر در سراسر کد میباشد.
const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
approximatelyEqual(Math.PI / 2.0, 1.5708); // true
🔻متد math.abs معادل قدر مطلق در ریاضی میباشد. خروجی یک قدر مطلق همواره عددی مثبت است.
🔹.arrayToHtmlList
▫️این قطعه کد هر عنصر از آرایه را به یک تگ <li> تبدیل کرده و انها را به یک لیست با یک ID میچسباند.
const arrayToHtmlList = (arr, listID) =>
(el => (
(el = document.querySelector('#' + listID)),
(el.innerHTML += arr.map(item => `<li>${item}</li>`).join(''))
))();
arrayToHtmlList(['item 1', 'item 2'], 'myListID');
🔻متد arr.map() یک non-mutating متد بوده (یعنی باعث تغییر آرایه پدر نمیشود) و کار آن ساخت ارایه جدید به وسیله صدا زدن یک تابع بروی هریک از عناصر آرایه پدرمیباشد.
@FullStackDevs
#JavaScript_code_snippets
"نرم افزار ها در حال بلعیدن جهان هستند و جاوا اسکریپت در حال بلعیدن نرم افزارها. هر ساله جاوا اسکریپت در حال چیره شدن برنرم افزار ها میباشد و هیچ کسی نمیداند که در نهایت چه چیزی می تواند جایگزین آن شود."
🔸در این پست به معرفی چند code snippet در زبان جاوا اسکریپت می پردازیم که به صورت زنجیروار ادامه خواهد داشت.
🔹.all
▫️خروجی این قطعه کد true خواهد بود اگر شرط مورد نظر برای تمام عناصر آرایه true باشد و بلعکس.
const all = (arr, fn = Boolean) => arr.every(fn);
all([4, 2, 3], x => x > 1); // true
all([1, 2, 3]); // true
🔻متد every() یک تابع را بروی تمام عناصر ارایه برای مطمئن شدن از برقرار بودن شرط مورد نظر چک میکند. اگر عنصری در این آرایه نتواند شرط مورد نظر را پاس کند ، دیگر عناصر ارایه (باقیمانده) چک نخواهند شد.
🔹.allEqual
▫️خروجی قطعه کد زیر در صورت برابر بودن تمام عناصر آرایه با یکدیگر true خواهد بود
const allEqual = arr => arr.every(val => val === arr[0]);
allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true
🔻عملگر === در جاوا اسکریپت دو متغیر را براساس نوع و مقدار با هم مقایسه میکند.
11 === 11
// => true
11=== '11' // => false
🔹. approximatelyEqual▫️این قطعه کد چک خواهد کرد که دو عدد به طور تقریبی با هم برابر هستند یا خیر.
🔻در این کد کلمه کلیدی const به این معنی میباشد که متغیر تعریف شده ثابت بوده و غیر قابل تغییر در سراسر کد میباشد.
const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
approximatelyEqual(Math.PI / 2.0, 1.5708); // true
🔻متد math.abs معادل قدر مطلق در ریاضی میباشد. خروجی یک قدر مطلق همواره عددی مثبت است.
🔹.arrayToHtmlList
▫️این قطعه کد هر عنصر از آرایه را به یک تگ <li> تبدیل کرده و انها را به یک لیست با یک ID میچسباند.
const arrayToHtmlList = (arr, listID) =>
(el => (
(el = document.querySelector('#' + listID)),
(el.innerHTML += arr.map(item => `<li>${item}</li>`).join(''))
))();
arrayToHtmlList(['item 1', 'item 2'], 'myListID');
🔻متد arr.map() یک non-mutating متد بوده (یعنی باعث تغییر آرایه پدر نمیشود) و کار آن ساخت ارایه جدید به وسیله صدا زدن یک تابع بروی هریک از عناصر آرایه پدرمیباشد.
@FullStackDevs
This media is not supported in your browser
VIEW IN TELEGRAM
🔰Microsoft Build (For developers by developers )
❇️ Free digital event
Starts: May 19, 2020 at 8 AM Pacific Time
Ends: May 21, 2020 at 8 AM Pacific Time
📢 @FullStackDevs
❇️ Free digital event
Starts: May 19, 2020 at 8 AM Pacific Time
Ends: May 21, 2020 at 8 AM Pacific Time
📢 @FullStackDevs
Forwarded from Web Devs
#SVG
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم اندازه فایل را کم نگه داریم. برای رسیدن به این هدف در مورد آیکون ها، لوگوها و ترسیمات ساده در سایت فقط یک راه وجود دارد.
➖ ما به عنوان طراح سایت میخواهیم که تصاویری داشته باشیم که به هر اندازه که بخواهیم بزرگشان کنیم و کیفیتشان از بین نرود که با SVG امکان پذیراست اما قبل تر با وجود مرورگرهای قدیمی ما را از استفاده از چنین قابلیتی دور نگه می داشت. اما خوشبختانه امروزه می توان از این قابلیت بهره برد.
➖ این بدین معنی نیست که در آینده نزدیک از تصاویری با فرمت های PNG، JPG و غیره دیگر استفاده نمی شود، نه، بلکه آنها همچنان کاربرد خود را در وب خواهند داشت و در کنار SVG به حیات خود در دنیای وب ادامه خواهند داد.
🔻 حالا SVG چیست؟
SVG (Scalable Vector Graphics)
در دنیای کامپیوتر ترسیمات می توانند از دو نوع Raster یا Vector باشند.
➖ در Raster Graphics یا گرافیک شطرنجی تصویر به صورت مجموعه ای از پیکسلها ذخیره میشود و رنگ هر پیکسل به طور جداگانه ذخیره میشود. تغییر اندازه این تصاویر کیفیت آنها را تحث تاثیر قرار می دهد. اکثر فرمتهای رایج فایلهای تصویری مانند jpg، gif، و bmp بر مبنای گرافیک شطرنجی هستند.
➖ در Vector Graphics یا گرافیک برداری روشی در تولید و ذخیرهٔ فایلهای تصویری کامپیوتری است که در آن تصویر در قالب مجموعهای از مشخصات هندسی نقاط، خطها، منحنیها و چندضلعیها ذخیره میشود. واژهٔ «بردار» در این کاربرد معنایی وسیعتر از یک خط راست دارد.
➖ تصاویر تعریف شده به کمک گرافیک برداری، از خطوط و منحنیهایی به نام بردار تشکیل شدهاند که به صورت ریاضی تعریف میشوند. اجزای این تصاویر را میتوان بدون از دست دادن کیفیت به راحتی جا به جا کرد و تغییر اندازه داد.
➖ این تصاویر مستقل از رزولوشن هستند و میتوان آنها را بزرگ و کوچک کرد و در هر رزولوشن بدون از دست دادن جزئیات و وضوح چاپ کرد. یکی از شناخته شده ترین فرمتهای ذخیرهٔ فایلهای گرافیک برداری، فرمت SVG است.
➖ در SVG بر اساس XML است این یعنی سینتکس آن خیلی هم غریبه نخواهد بود و به HTML شباهت دارد. به این صورت که برای ترسیم شکل های مختلف تگ های مختلف وجود دارد مثلا برای ترسیم دایره از تگ
ادامه در پست بعدی ...
@fullStackDevs
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم اندازه فایل را کم نگه داریم. برای رسیدن به این هدف در مورد آیکون ها، لوگوها و ترسیمات ساده در سایت فقط یک راه وجود دارد.
➖ ما به عنوان طراح سایت میخواهیم که تصاویری داشته باشیم که به هر اندازه که بخواهیم بزرگشان کنیم و کیفیتشان از بین نرود که با SVG امکان پذیراست اما قبل تر با وجود مرورگرهای قدیمی ما را از استفاده از چنین قابلیتی دور نگه می داشت. اما خوشبختانه امروزه می توان از این قابلیت بهره برد.
➖ این بدین معنی نیست که در آینده نزدیک از تصاویری با فرمت های PNG، JPG و غیره دیگر استفاده نمی شود، نه، بلکه آنها همچنان کاربرد خود را در وب خواهند داشت و در کنار SVG به حیات خود در دنیای وب ادامه خواهند داد.
🔻 حالا SVG چیست؟
SVG (Scalable Vector Graphics)
در دنیای کامپیوتر ترسیمات می توانند از دو نوع Raster یا Vector باشند.
➖ در Raster Graphics یا گرافیک شطرنجی تصویر به صورت مجموعه ای از پیکسلها ذخیره میشود و رنگ هر پیکسل به طور جداگانه ذخیره میشود. تغییر اندازه این تصاویر کیفیت آنها را تحث تاثیر قرار می دهد. اکثر فرمتهای رایج فایلهای تصویری مانند jpg، gif، و bmp بر مبنای گرافیک شطرنجی هستند.
➖ در Vector Graphics یا گرافیک برداری روشی در تولید و ذخیرهٔ فایلهای تصویری کامپیوتری است که در آن تصویر در قالب مجموعهای از مشخصات هندسی نقاط، خطها، منحنیها و چندضلعیها ذخیره میشود. واژهٔ «بردار» در این کاربرد معنایی وسیعتر از یک خط راست دارد.
➖ تصاویر تعریف شده به کمک گرافیک برداری، از خطوط و منحنیهایی به نام بردار تشکیل شدهاند که به صورت ریاضی تعریف میشوند. اجزای این تصاویر را میتوان بدون از دست دادن کیفیت به راحتی جا به جا کرد و تغییر اندازه داد.
➖ این تصاویر مستقل از رزولوشن هستند و میتوان آنها را بزرگ و کوچک کرد و در هر رزولوشن بدون از دست دادن جزئیات و وضوح چاپ کرد. یکی از شناخته شده ترین فرمتهای ذخیرهٔ فایلهای گرافیک برداری، فرمت SVG است.
➖ در SVG بر اساس XML است این یعنی سینتکس آن خیلی هم غریبه نخواهد بود و به HTML شباهت دارد. به این صورت که برای ترسیم شکل های مختلف تگ های مختلف وجود دارد مثلا برای ترسیم دایره از تگ
<circle/>استفاده می شود و در نهایت همه اشکال، درون یک تگ
<svg />قرار می گیرند.
ادامه در پست بعدی ...
@fullStackDevs
Wikipedia
گرافیک شطرنجی
نگاشتار شطرنجی یا گرافیک شطرنجی (به انگلیسی: Raster Graphics) روشی از گرافیک است که به وسیله تقسیم کردن تصویر به چهارخانههای کوچک یا عناصر کوچک تصویر که پیکسل نام دارند ساخته میشود. پیکسلها، محتوای اطلاعاتی مثل حافظ، کنترل شفافیت و رنگ میباشند. این اطلاعات…
Forwarded from Web Devs
ادامه پست قبل
🔻 چرا SVG ؟
🔹 مستقل از رزولوشن
یکی از نقاط قوت SVG این است که در صفحه نمایش هایی با کیفیت بسیار بالا هم به بهترین شکل نمایش داده می شود و کیفیتش تغییر نمی کند. برخلاف تصاویر Raster که کیفیت خود را از دست می دهند و مجبوریم برای صفحه نمایش هایی با کیفیت بالاتر نسخه با کیفیت تری از تصویر را نمایش دهیم.
دیگر مهم نیست اندازه تصویر چه باشد، یا چقدر کاربر Zoom کند و یا اینکه کیفیت صفحه نمایش کاربر چه اندازه باشد. در همه این موارد SVG قصه ما همان حالت با کیفیت و تیزش را حفظ می کند.
🔸 سازگار با CSS
از اونجایی که SVG هم مثل HTML یک markup است می تواند Class یا css داشته باشد و از آن طریق در css می تواند در دسترس باشد.
پس می توانیم روی ترسیمات برداری از طریق css کارهای زیادی انجام دهیم که این کار برای ترسیمات Raster امکان پذیر نمی باشد.
فرض کنید مستطیلی را از طریق SVG ساخته ایم می توانیم رنگ آن را بصورت های مختلف تغییر دهیم ولی اگر همان مستطیل از نوع تصاویر معمولی مثلا با فرمت PNG بود می توان گفت دیگر این امکان برای ما وجود نداشت.
🔹 تعامل پذیری ساده از طریق Javascript
به همان دلیلی که SVG با CSS سازگار است می توان گفت که به راحتی می توان از طریق جاواسکریپت با آن تعامل داشت و مواردی مثل انیمیشن و غیره را به راحتی پیاده و در نتیجه تجربه کاربری و تعاملی خوبی را به سادگی برای کاربر مهیا کرد.
🔸 درخواست HTTP کمتر
هر زمان که بواسطه تگ <img> از تصویری به صورت عادی در یک صفحه وب استفاده کنید مرورگر برای ترسیم آن تصویر یک درخواست HTTP به سرور می فرستد تا تصویر را از سرور گرفته و نمایش دهد. اگر از روش خطی برای SVG استفاده کنیم SVG بصورت مستقیم در فایل HTML قرار دارد و دیگر نیازی به یک درخواست جداگانه برای تصویر ما نخواهد بود.
🔹 ویرایش ساده
برای تغییر یک فایل SVG فقط به یک ویرایشگر متن نیاز داریم این یعنی در همان محیط کدنویسی می توانیم ویراش مورد نظرمان را انجام دهیم. اما اگر یک تصویر Raster را بخواهیم ویرایش کنیم باید به فوتوشاب یا مشابه آن پناه ببریم.
🔸 حجم فایل کمتر
ترسیمات وکتور معمولا حجم کمتری را می گیرند مخصوصا اگر شکل و طرح ساده ای داشته باشند. پس فایل تصویر ما سایز کمتری خواهد داشت. همچنین فشرده سازی بصورت بهتری روی SVG اعمال می شود. پس می توان از نظر سایز صفحه وب هم با استفاده از SVG صرفه جویی داشته باشیم که از نظر کارایی کمک بسیار خوبی برای سایت ما خواهد بود.
🔹طراحی واکنشگرا
اگر تصویر شما می تواند بصورت SVG باشد دیگر نگرانی برای واکنشگرا بودن آن نخواهید داشت. ولی در صورت استفاده از تصاویری با فرمت PNG یا JPG شاید مجبور شوید تا در صفحه نمایش های مختلف نسخه های مختلفی از آن تصاویر را قرار دهید.
✔️ بهترین موارد استفاده SVG :
▪️ آیکون ها
▫️ ترسیمات ساده مثل شکل های مختلف
▪️ بنرهای تبلیغاتی
▫️ ترسیمات متحرک
▪️ اینفوگراف ها و مصورسازی داده ها
می باشند.
🌀 واضح است که اگر تصویری از یک منظره داشته باشیم که توسط یک عکاس گرفته شده است، نمایش آن بوسیله SVG منطقی نخواهد بود چرا که در این مورد حجم فایل به مراتب بیشتر از فرمت PNG یا JPG خواهد بود.
@fullStackDevs
🔻 چرا SVG ؟
🔹 مستقل از رزولوشن
یکی از نقاط قوت SVG این است که در صفحه نمایش هایی با کیفیت بسیار بالا هم به بهترین شکل نمایش داده می شود و کیفیتش تغییر نمی کند. برخلاف تصاویر Raster که کیفیت خود را از دست می دهند و مجبوریم برای صفحه نمایش هایی با کیفیت بالاتر نسخه با کیفیت تری از تصویر را نمایش دهیم.
دیگر مهم نیست اندازه تصویر چه باشد، یا چقدر کاربر Zoom کند و یا اینکه کیفیت صفحه نمایش کاربر چه اندازه باشد. در همه این موارد SVG قصه ما همان حالت با کیفیت و تیزش را حفظ می کند.
🔸 سازگار با CSS
از اونجایی که SVG هم مثل HTML یک markup است می تواند Class یا css داشته باشد و از آن طریق در css می تواند در دسترس باشد.
پس می توانیم روی ترسیمات برداری از طریق css کارهای زیادی انجام دهیم که این کار برای ترسیمات Raster امکان پذیر نمی باشد.
فرض کنید مستطیلی را از طریق SVG ساخته ایم می توانیم رنگ آن را بصورت های مختلف تغییر دهیم ولی اگر همان مستطیل از نوع تصاویر معمولی مثلا با فرمت PNG بود می توان گفت دیگر این امکان برای ما وجود نداشت.
🔹 تعامل پذیری ساده از طریق Javascript
به همان دلیلی که SVG با CSS سازگار است می توان گفت که به راحتی می توان از طریق جاواسکریپت با آن تعامل داشت و مواردی مثل انیمیشن و غیره را به راحتی پیاده و در نتیجه تجربه کاربری و تعاملی خوبی را به سادگی برای کاربر مهیا کرد.
🔸 درخواست HTTP کمتر
هر زمان که بواسطه تگ <img> از تصویری به صورت عادی در یک صفحه وب استفاده کنید مرورگر برای ترسیم آن تصویر یک درخواست HTTP به سرور می فرستد تا تصویر را از سرور گرفته و نمایش دهد. اگر از روش خطی برای SVG استفاده کنیم SVG بصورت مستقیم در فایل HTML قرار دارد و دیگر نیازی به یک درخواست جداگانه برای تصویر ما نخواهد بود.
🔹 ویرایش ساده
برای تغییر یک فایل SVG فقط به یک ویرایشگر متن نیاز داریم این یعنی در همان محیط کدنویسی می توانیم ویراش مورد نظرمان را انجام دهیم. اما اگر یک تصویر Raster را بخواهیم ویرایش کنیم باید به فوتوشاب یا مشابه آن پناه ببریم.
🔸 حجم فایل کمتر
ترسیمات وکتور معمولا حجم کمتری را می گیرند مخصوصا اگر شکل و طرح ساده ای داشته باشند. پس فایل تصویر ما سایز کمتری خواهد داشت. همچنین فشرده سازی بصورت بهتری روی SVG اعمال می شود. پس می توان از نظر سایز صفحه وب هم با استفاده از SVG صرفه جویی داشته باشیم که از نظر کارایی کمک بسیار خوبی برای سایت ما خواهد بود.
🔹طراحی واکنشگرا
اگر تصویر شما می تواند بصورت SVG باشد دیگر نگرانی برای واکنشگرا بودن آن نخواهید داشت. ولی در صورت استفاده از تصاویری با فرمت PNG یا JPG شاید مجبور شوید تا در صفحه نمایش های مختلف نسخه های مختلفی از آن تصاویر را قرار دهید.
✔️ بهترین موارد استفاده SVG :
▪️ آیکون ها
▫️ ترسیمات ساده مثل شکل های مختلف
▪️ بنرهای تبلیغاتی
▫️ ترسیمات متحرک
▪️ اینفوگراف ها و مصورسازی داده ها
می باشند.
🌀 واضح است که اگر تصویری از یک منظره داشته باشیم که توسط یک عکاس گرفته شده است، نمایش آن بوسیله SVG منطقی نخواهد بود چرا که در این مورد حجم فایل به مراتب بیشتر از فرمت PNG یا JPG خواهد بود.
@fullStackDevs
Telegram
Web Devs
#SVG
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم…
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم…
❇️ Object Destructuring in ES6
🔸 ویژگی Object Destructuring یکی از ویژگی های جدید ES6 میباشد و در این پست قصد داریم به معرفی آن بپردازیم هم چنین در این پست برای اختصار از OD بجای Object Destructuring استفاده میکنیم.
🔻توجه داشته باشید که این اختصار اصلا رایج نبوده و فقط برای نگارش آسان تر در این پست استفاده شده است
🔹 اضافه شدن ویژگی OD به ES6 باعث به وجود آمدن هزاران syntax جدید در ES6 شد.
ویژگی OD کاربرهای بسیاری دارد و هنگام کار کردن با object ها array ها function ها بسیار پر استفاده خواهد بود.
🔹می توانیم از OD به همراه object ها برای ترکیب کردن دو یا سه یا .. object با یکدیگر استفاده کنیم یا حتی انتخاب برخی از فیلد های یک object و تبدیل آن به یک object کوچکتر استفاده کنیم.
🔹هم چنین از OD به همراه array ها برای ترکیب کردن ارایه ها یا حتی شکستن یک ارایه به بخش کوچکتر استفاده کنیم .
🔹در function ها از OD برای فیلتر کردن ارایه ها و object هایی که به عنوان آرگومان تعریف کرده ایم استفاده میکنیم.
( توجه کنید که کاربرد OD ها محدود به این موارد نیست و کاربرد های بسیار فراوانی دارد، موارد فوق صرفا جهت معرفی بخش کوچکی از کاربرد های این ویژگی ذکر شده اند. )
✳️ در این پست از OD به همراه object ها استفاده میکنیم.
🔸ابتدا باید به کمک یک مثال مشکلی قدیمی را بررسی کنیم و به ببینیم که چگونه OD به کمک ما می آید.
فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
و برای دریافت مقادیر فیلد های این object بدین شکل عمل میکردیم :
const first = person.first;
const last = person.last;
🔹اگر object ما ده ها فیلد داشت برای دریافت مقدار هر یک از فیلد های ان باید متغیر تعریف کنیم و هر بار مقدار فیلد مورد نظر را به متغیر خود اختصاص دهیم. کاری تکراری و طاقت فرسا.
اینجاست که OD وارد میشود و به کمک ما می آید.
const { first, last } = person;
🔹در این کد فیلد های last و first از person خوانده میشود و در متغیر های همنام متناظر خود قرار میگیرد و از این به بعد میتوانیم مقادیر را از متغیر های last و first بخوانیم و در جای جای scope استفاده کنیم.
🔹سینتکس مثال قبل یکی از سینتکس ها و کاربرد های فراوان OD میباشد.
هم چنین اگر مقدار فیلد city را person نیاز داشته باشیم میتوانیم به این شکل عمل کنیم.
const { first, last,city } = person;
console.log(first); //Brendan
console.log(last); //Eich
console.log(city); //Pittsburgh
حال بیایید object خود را کمی پیچیده تر کنیم فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan',
last: 'Eich',
links: {
social: {
site: 'https://brendaneich.com',
twitter: 'https://twitter.com/BrendanEich',
}
}
};
از این object فقط مقادیر site و twitter را نیاز داریم .
در گذشته برا خواندن این مقادیر بدین شکل عمل میکردیم :
const twitter = person.links.social.twitter;
const site = person.links.social.site;
اما می توانیم با کمک OD بدین شکل عمل کنیم :
const { twitter, site } = person.links.social;
console.log(twitter, site);
🔻 نکته مهم این است که متغیر ها بایستی همنام با فیلد های object باشند تا مقادیر مورد نظر در آنها ریخته شود.
اما اگر لازم بود تا متغیری با نامی متفاوت از آنچه که فیلد object هست داشته باشیم بدین شکل عمل میکنیم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
const { first : personFirstName } = person;
بدین صورت میتوانید به متغیر های خود در OD نامی متفاوت دهید.
✳️ Set default value with OD
🔸چگونه در هنگام destruct کردن یک آبجکت مقادیر پیشفرض برای متغیر ها اختصاص دهیم.
فرض کنیم object زیرا داریم
const settings = {
speed: 150
}
const { speed, width } = settings;
🔹 همانطور که مشخص است ابجکت settings دارای فیلدی به نام width نیست با log کردن این فیلد مقدار undefined لاگ خواهد شد.
برای set کردن مقدار پیفرض برای متغیر width در هنگام destruct کردن آبجکت settings :
const { speed, width = 500 } = settings;
بدین شکل عمل میکنیم .
🔻 نکته بسیار مهم این است که فقط در صورتی که مقدار متغیر width براربر با undefined باشد این مقدار پیشفرض برای آن set خواهد شد.
در صورتی که آبجکت settings دارای فیلد متناظری باشد حتی اگر مقدار آن null false 0 هم باشد این مقادیر در متغیر width قرار میگیرد.
☑️قسمت های بعدی OD در صورت دریافت فیدبک های انرژی بخش ادامه خواهد داشت.
❇️ Happy JS Coding 😉
@FullStackDevs
🔸 ویژگی Object Destructuring یکی از ویژگی های جدید ES6 میباشد و در این پست قصد داریم به معرفی آن بپردازیم هم چنین در این پست برای اختصار از OD بجای Object Destructuring استفاده میکنیم.
🔻توجه داشته باشید که این اختصار اصلا رایج نبوده و فقط برای نگارش آسان تر در این پست استفاده شده است
🔹 اضافه شدن ویژگی OD به ES6 باعث به وجود آمدن هزاران syntax جدید در ES6 شد.
ویژگی OD کاربرهای بسیاری دارد و هنگام کار کردن با object ها array ها function ها بسیار پر استفاده خواهد بود.
🔹می توانیم از OD به همراه object ها برای ترکیب کردن دو یا سه یا .. object با یکدیگر استفاده کنیم یا حتی انتخاب برخی از فیلد های یک object و تبدیل آن به یک object کوچکتر استفاده کنیم.
🔹هم چنین از OD به همراه array ها برای ترکیب کردن ارایه ها یا حتی شکستن یک ارایه به بخش کوچکتر استفاده کنیم .
🔹در function ها از OD برای فیلتر کردن ارایه ها و object هایی که به عنوان آرگومان تعریف کرده ایم استفاده میکنیم.
( توجه کنید که کاربرد OD ها محدود به این موارد نیست و کاربرد های بسیار فراوانی دارد، موارد فوق صرفا جهت معرفی بخش کوچکی از کاربرد های این ویژگی ذکر شده اند. )
✳️ در این پست از OD به همراه object ها استفاده میکنیم.
🔸ابتدا باید به کمک یک مثال مشکلی قدیمی را بررسی کنیم و به ببینیم که چگونه OD به کمک ما می آید.
فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
و برای دریافت مقادیر فیلد های این object بدین شکل عمل میکردیم :
const first = person.first;
const last = person.last;
🔹اگر object ما ده ها فیلد داشت برای دریافت مقدار هر یک از فیلد های ان باید متغیر تعریف کنیم و هر بار مقدار فیلد مورد نظر را به متغیر خود اختصاص دهیم. کاری تکراری و طاقت فرسا.
اینجاست که OD وارد میشود و به کمک ما می آید.
const { first, last } = person;
🔹در این کد فیلد های last و first از person خوانده میشود و در متغیر های همنام متناظر خود قرار میگیرد و از این به بعد میتوانیم مقادیر را از متغیر های last و first بخوانیم و در جای جای scope استفاده کنیم.
🔹سینتکس مثال قبل یکی از سینتکس ها و کاربرد های فراوان OD میباشد.
هم چنین اگر مقدار فیلد city را person نیاز داشته باشیم میتوانیم به این شکل عمل کنیم.
const { first, last,city } = person;
console.log(first); //Brendan
console.log(last); //Eich
console.log(city); //Pittsburgh
حال بیایید object خود را کمی پیچیده تر کنیم فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan',
last: 'Eich',
links: {
social: {
site: 'https://brendaneich.com',
twitter: 'https://twitter.com/BrendanEich',
}
}
};
از این object فقط مقادیر site و twitter را نیاز داریم .
در گذشته برا خواندن این مقادیر بدین شکل عمل میکردیم :
const twitter = person.links.social.twitter;
const site = person.links.social.site;
اما می توانیم با کمک OD بدین شکل عمل کنیم :
const { twitter, site } = person.links.social;
console.log(twitter, site);
🔻 نکته مهم این است که متغیر ها بایستی همنام با فیلد های object باشند تا مقادیر مورد نظر در آنها ریخته شود.
اما اگر لازم بود تا متغیری با نامی متفاوت از آنچه که فیلد object هست داشته باشیم بدین شکل عمل میکنیم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
const { first : personFirstName } = person;
بدین صورت میتوانید به متغیر های خود در OD نامی متفاوت دهید.
✳️ Set default value with OD
🔸چگونه در هنگام destruct کردن یک آبجکت مقادیر پیشفرض برای متغیر ها اختصاص دهیم.
فرض کنیم object زیرا داریم
const settings = {
speed: 150
}
const { speed, width } = settings;
🔹 همانطور که مشخص است ابجکت settings دارای فیلدی به نام width نیست با log کردن این فیلد مقدار undefined لاگ خواهد شد.
برای set کردن مقدار پیفرض برای متغیر width در هنگام destruct کردن آبجکت settings :
const { speed, width = 500 } = settings;
بدین شکل عمل میکنیم .
🔻 نکته بسیار مهم این است که فقط در صورتی که مقدار متغیر width براربر با undefined باشد این مقدار پیشفرض برای آن set خواهد شد.
در صورتی که آبجکت settings دارای فیلد متناظری باشد حتی اگر مقدار آن null false 0 هم باشد این مقادیر در متغیر width قرار میگیرد.
☑️قسمت های بعدی OD در صورت دریافت فیدبک های انرژی بخش ادامه خواهد داشت.
❇️ Happy JS Coding 😉
@FullStackDevs
Forwarded from Web Devs
This media is not supported in your browser
VIEW IN TELEGRAM
🔰Microsoft Build (For developers by developers )
❇️ Free digital event
Starts: May 19, 2020 at 8 AM Pacific Time
Ends: May 21, 2020 at 8 AM Pacific Time
📢 @FullStackDevs
❇️ Free digital event
Starts: May 19, 2020 at 8 AM Pacific Time
Ends: May 21, 2020 at 8 AM Pacific Time
📢 @FullStackDevs
Forwarded from Web Devs
#OAuth
در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
🔳 OAuth
یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.
🔸 این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.
▪️ برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider,Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth را پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجازه دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner
شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .
@fullStackDevs
در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
🔳 OAuth
یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.
🔸 این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.
▪️ برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider,Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth را پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجازه دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner
شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .
@fullStackDevs
Forwarded from Web Devs
#OpenID
💡 What is Open ID?
در پست های قبل به OAuth پرداختیم و گفتیم که این پروتکل مختص به Authorization است و با ارائه یک توکن دسترسی اجازه استفاده از اطلاعات را میدهد و اپلیکیشن جانبی مان اطلاعاتی در مورد کاربر جاری که از این توکن استفاده میکند ،ندارد.
اما اپن آیدی پروتکلی برای authentication و تصدیق هویت میباشد این پروتکل لایه ای بر روی OAuth 2.0 میباشد .
با استفاده از این پروتکل، Token ID ای دریافت میکنید که JWT بوده و اپلیکیشن جانبی تان علاوه بر دسترسی از طریق این توکن اطلاعاتی هم درباره کاربر جاری دارد.
اپن آیدی اجازه استفاده از یک حساب(اکانت) برای چندین سایت بدون اینکه نیاز به تغییر رمز عبور داشته باشید میدهد.
💢 مراحل انجام کار
1. ارسال اطلاعات کلاینت به Identity Provider
2. دریافت این اطلاعات در سمت Identity Provider و شناسایی و لاگین کاربر
3. ارسال یک Access Token و یک ID Token (اگر کلاینت درخواست کند) از سمت identity Provider به کلاینت.
4. دریافت این توکن ها در سمت کلاینت و کلاینت میتواند با استفاده از Access Token درسمت Identity Provider برای دسترسی به اطلاعات api هایی رو صدا بزند و همچنین از ID Token برای بازیابی اطلاعات کاربر استفاده کند.
این پروتکل برای اولین بار در سال 2005 معرفی و پیاده سازی شد و نسخه بعدی آن که OpenID Connect نامیده میشود در فوریه 2014 ارئه گردید.
@fullStackDevs
💡 What is Open ID?
در پست های قبل به OAuth پرداختیم و گفتیم که این پروتکل مختص به Authorization است و با ارائه یک توکن دسترسی اجازه استفاده از اطلاعات را میدهد و اپلیکیشن جانبی مان اطلاعاتی در مورد کاربر جاری که از این توکن استفاده میکند ،ندارد.
اما اپن آیدی پروتکلی برای authentication و تصدیق هویت میباشد این پروتکل لایه ای بر روی OAuth 2.0 میباشد .
با استفاده از این پروتکل، Token ID ای دریافت میکنید که JWT بوده و اپلیکیشن جانبی تان علاوه بر دسترسی از طریق این توکن اطلاعاتی هم درباره کاربر جاری دارد.
اپن آیدی اجازه استفاده از یک حساب(اکانت) برای چندین سایت بدون اینکه نیاز به تغییر رمز عبور داشته باشید میدهد.
💢 مراحل انجام کار
1. ارسال اطلاعات کلاینت به Identity Provider
2. دریافت این اطلاعات در سمت Identity Provider و شناسایی و لاگین کاربر
3. ارسال یک Access Token و یک ID Token (اگر کلاینت درخواست کند) از سمت identity Provider به کلاینت.
4. دریافت این توکن ها در سمت کلاینت و کلاینت میتواند با استفاده از Access Token درسمت Identity Provider برای دسترسی به اطلاعات api هایی رو صدا بزند و همچنین از ID Token برای بازیابی اطلاعات کاربر استفاده کند.
این پروتکل برای اولین بار در سال 2005 معرفی و پیاده سازی شد و نسخه بعدی آن که OpenID Connect نامیده میشود در فوریه 2014 ارئه گردید.
@fullStackDevs
#CSharp9
#InitOnlyProperty
#NewFeature
🔰 اگر دنبال کننده خبرها باشید حتما میدانید که Microsift Build 2020 به تازگی به اتمام رسید است، که معرفی ویژگی های C# 9 از جمله چیزهای جدیدی بود که در این بیلد معرفی شد.
▫️ در اول لیست ویژگی های C# 9
❇️ Init-only properties
به چشم میخوره و اما بیایید به ببینیم این ویژگی چی هست و اصلا چرا به سی شارپ اضافه شد❕
🔸قبلا از شروع بایستی با تعریف های زیر آشنایی داشته باشید
▪️ Immutable type :
یک Immutable type نوعی هست که پراپرتی های آن نوع، فقط در زمان ساخته شدن آن میتوانند مقدار دهی شوند و بعد از آن قابل تغییر نیستند.
▪️immutable property :
به طور ساده یک immutable property یک read-only property میباشد.
✳️ سی شارپ این اجازه را میدهد تا به صورت positional و nominal کد بنویسید.
برای استفاده از سینتکس positional از متد سازنده میتوان استفاده کرد و Object initializer هم از سینتکس های nominal میباشد.
🔹تاقبل از سی شارپ 9 استفاده از سینتکس nominal برای Initialize کردن ابجکت ها دارای محدودیتی بود که پراپرتی ها الزاما بایستی writable میبودند تا بتوان آنها را در هنگام ساختن آبجکت با استفاده از سینتکس nominal مقدار دهی کرد.
❇️ Positional Creation
🔸این سبک کد نویسی یک سبک مرسوم و قدیمی میباشد که از ابتدای عمر C# مورد استفاده قرار میگرفته است که از متد سازنده برای initialize کردن پراپرتی های یک آبجکت استفاده میکنیم.
و در هنگام نمونه سازی از کلاس بایستی پارامتر های لازم را از طریق متد سازنده برای initialize کردن ابجکت پاس دهیم.
```
public class Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
public class Racer : Person
{
public string RacingTeam { get; }
public Racer(string firstName, string lastName, string racingTeam)
: base(firstName, lastName)
{
RacingTeam = racingTeam;
}
}
Person p = new Racer("Charles", "Leclerc", "Ferrari");
```
❇️ Nominal Creation
🔸با استفاده از این سبک کدنویسی، کد کمتری مینویسید و به جای تعریف کردن متد سازنده از ویژگیه object initializer استفاده میکنید.
🔰 تمام آنچه که تاکنون گفته شد مقدمه ای بود برای بررسی علت معرفی Init-only property در سی شارپ 9 و اینکه چرا این نیاز در سی شارپ حس شد.
بدین ترتیب Init-only property ها معرفی شدند تا امکان مقدار دهی و تعریف immutable proprty ها immutable type ها را هنگام استفاده از object initilizer داشته باشیم .
🔸بدین منظور accessor جدیدی تحت عنوان init اضافه گردیده است که شکلی دیگر از accessor پیشین set میباشد.
در هنگام initilize کردن یک ابجکت با استفاده از object initializer، پراپرتی هایی که با این accessor تعریف شوند، هنگام اجرا شدن متد سازنده کلاس مقدار دهی میشوند و بعد از ساخته شدن آبجکت به صورت readonly خواهند بود و نمیتوان به آنها مقداری اختصاص داد.
❇️ Validation assigned value to init-only properties
🔸گاهی اوقات نیز الزامی است تا مقداری که به init-only property اختاصاص داده میشود، اعتبار سنجی شود.
نکته ای که وجود دارد این است که به صورت تک فیلد برای هر init-only property نمیتوانید اعتبار سنجی انجام دهید و بایستی به صورت یک بلاگ کد برای init-only property های خود اعتبارسنجی انجام دهید.
🔎 منبع
@FullStackDevs
#InitOnlyProperty
#NewFeature
🔰 اگر دنبال کننده خبرها باشید حتما میدانید که Microsift Build 2020 به تازگی به اتمام رسید است، که معرفی ویژگی های C# 9 از جمله چیزهای جدیدی بود که در این بیلد معرفی شد.
▫️ در اول لیست ویژگی های C# 9
❇️ Init-only properties
به چشم میخوره و اما بیایید به ببینیم این ویژگی چی هست و اصلا چرا به سی شارپ اضافه شد❕
🔸قبلا از شروع بایستی با تعریف های زیر آشنایی داشته باشید
▪️ Immutable type :
یک Immutable type نوعی هست که پراپرتی های آن نوع، فقط در زمان ساخته شدن آن میتوانند مقدار دهی شوند و بعد از آن قابل تغییر نیستند.
▪️immutable property :
به طور ساده یک immutable property یک read-only property میباشد.
✳️ سی شارپ این اجازه را میدهد تا به صورت positional و nominal کد بنویسید.
برای استفاده از سینتکس positional از متد سازنده میتوان استفاده کرد و Object initializer هم از سینتکس های nominal میباشد.
🔹تاقبل از سی شارپ 9 استفاده از سینتکس nominal برای Initialize کردن ابجکت ها دارای محدودیتی بود که پراپرتی ها الزاما بایستی writable میبودند تا بتوان آنها را در هنگام ساختن آبجکت با استفاده از سینتکس nominal مقدار دهی کرد.
❇️ Positional Creation
🔸این سبک کد نویسی یک سبک مرسوم و قدیمی میباشد که از ابتدای عمر C# مورد استفاده قرار میگرفته است که از متد سازنده برای initialize کردن پراپرتی های یک آبجکت استفاده میکنیم.
و در هنگام نمونه سازی از کلاس بایستی پارامتر های لازم را از طریق متد سازنده برای initialize کردن ابجکت پاس دهیم.
```
public class Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
public class Racer : Person
{
public string RacingTeam { get; }
public Racer(string firstName, string lastName, string racingTeam)
: base(firstName, lastName)
{
RacingTeam = racingTeam;
}
}
Person p = new Racer("Charles", "Leclerc", "Ferrari");
```
❇️ Nominal Creation
🔸با استفاده از این سبک کدنویسی، کد کمتری مینویسید و به جای تعریف کردن متد سازنده از ویژگیه object initializer استفاده میکنید.
public class Person🔹اما استفاده از object initializer محدودتی هایی به همراه دارد، علی رغم دم دست بودن و راحتی که در مقایسه با Positional دارد اما در پشت صحنه مقادیر پراپرتی ها بعد از اتمام صدا زده شدن و اجرای متد سازنده کلاس، set میشوند و بدین ترتیب با استفاده از این سبک کد نویسی نمیتوانید یک immutable type تعریف کنید و بدین منظور باید از سبک قبلی (Positional Creation) استفاده کنید.
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Racer : Person
{
public string RacingTeam { get; set; }
}
Person p = new Racer { FirstName = "Charles", LastName = "Leclerc", RacingTeam = "Ferrari" };
🔰 تمام آنچه که تاکنون گفته شد مقدمه ای بود برای بررسی علت معرفی Init-only property در سی شارپ 9 و اینکه چرا این نیاز در سی شارپ حس شد.
بدین ترتیب Init-only property ها معرفی شدند تا امکان مقدار دهی و تعریف immutable proprty ها immutable type ها را هنگام استفاده از object initilizer داشته باشیم .
🔸بدین منظور accessor جدیدی تحت عنوان init اضافه گردیده است که شکلی دیگر از accessor پیشین set میباشد.
در هنگام initilize کردن یک ابجکت با استفاده از object initializer، پراپرتی هایی که با این accessor تعریف شوند، هنگام اجرا شدن متد سازنده کلاس مقدار دهی میشوند و بعد از ساخته شدن آبجکت به صورت readonly خواهند بود و نمیتوان به آنها مقداری اختصاص داد.
❇️ Validation assigned value to init-only properties
🔸گاهی اوقات نیز الزامی است تا مقداری که به init-only property اختاصاص داده میشود، اعتبار سنجی شود.
نکته ای که وجود دارد این است که به صورت تک فیلد برای هر init-only property نمیتوانید اعتبار سنجی انجام دهید و بایستی به صورت یک بلاگ کد برای init-only property های خود اعتبارسنجی انجام دهید.
public class Person}
{
public string FirstName { get; init; }
public string LastName { get; init; }
init
{
if (FirstName.Length + LastName.Length > 52)
{
throw new Exception("...");
}
}
🔎 منبع
@FullStackDevs
#ES11
#NewFeatures
#java_script
❇️ New features in ES2020(ES 11)
🔸 در این پست به معرفی ویژگی های جدیدی که تحت عنوان ES2020 به جاوا اسکریپت اضافه شده است، می پردازیم.
باید بدانید که ES مخفف ECMAScript میباشد و استانداردی است که جاوا اسکریپت بر اساس ان ساخته شده است و شروع آن از سال 2015 بوده و گروهی از توسعه دهندگان جاوا اسکریپت و سایر افراد دیگر که در توسعه و افزودن ویژگی های جدید به جاوا اسکریپت همکاری میکنند.
در ECMAScript برای انتشار یک ویژگی جدید چهار مرحله وجود دارد :
▪️Proposal
▪️Draft
▪️Candidate
▪️Finished
🔸 زمانی که ویژگی جدید به مرحله چهارم برسد به عنوان یک بخشی از ECMAScript release تلقی میشود و از این به بعد این وظیفه ی مرورگر است که آن ویژگی را پیاده سازی کند.
🔹 پس قبل از اینکه از ویژگی جدیدی استفاده کنید مطمئن شوید که مرورگرتان آنرا پیاده سازی کرده باشد. برای این منظور میتوانید از
وب سایت caniuse کمک بگیرید.
🔶در ادامه به مهمترین ویژگی های ES11 میپردازیم
✳️ Nullish Coalescing Operator (??)
🔸زمانی که می خواهیم به یک پراپرتی یک آبجکت دسترسی داشته باشیم گاهی اوقات لازم است تا فقط درصورت null یا undefined بودن مقدار یک متغییر یا پراپرتی، مقادیر پیشفرض جایگزین شوند.
در گذشته برای این منظور از عملگر || استفاده میکردیم، اتفاقی که در حقیقت در زمان استفاده از این عملگر می افتاد این بود که مقادیر متغیر یا پراپرتی مربوطه توسط جاوااسکریپت به اجبار به Boolean تبدیل میشدند و در صورت که مقدار متغیر یا پراپرتی تعیین شده falsy بود مقدار پیشرفرض مشخص شده در نظر گرفته میشد.
مقادیر falsyType در جاوااسکریپت عبارتند از :
(رشته خالی) '' , 0,undefined,null,false,NaN , ...
const falsyTypes = {
emptyString: '',
zeroNum: 0,
falseBoolean: false,
nullValue: null,
}
const undefinedValue = falsyTypes.undefinedValue || 'my default'
🔸حال بیاییم شرایطی را در نظر بگیریم که فقط در صورت null یا undefined بودن مقدار یک پراپرتی, مقدار پیشفرض مشخص شده, در نظر گرفته شود.چنین شرایطی زمانی که از نوع داده ای متغیر خود آگاه نباشیم, اگر از عملگر || استفاده کنیم باعث بروز رفتار های ناخوسته ای میشود, به عنوان مثال ممکن است مقدار پراپرتی false باشد و بدلیل اینکه hcعملگر || استفاده کردیم, جاوااسکریپت از falsy check برای این منظور استفاده میکند, و باز هم مقدار پیشفرض درنظر گرفته خواهد شد.
در حالی که فقط میخواستیم اگر مقدار پراپرتی null یا undefined باشد, مقدار پیشفرض در نظر گرفته شود.
🔹حل این مشکل در ES11 با عملگر (??) انجام میشود.
در صورتی که مقدار متغیر فقط null یا undefined باشد, مقادیر پیشفرض در نظر گرفته خواهد شد.
✳️ Optional Chaining Operator(Elvis operator)
🔸این عملگر این امکان را فراهم میسازد که زمانی که در حال خواندن پراپرتی های یک آبجکت تو در تو هستید نگرانی ای در مورد وجود داشتن یا نداشتن پراپرتی های آن آبجکت نداشته باشید, اگر آبجکت مربوطه دارای پراپرتی مشخص شده نباشد undefined بازگشت داده خواهد شد.
🔹از این عملگر هم برای مطمئن شدن از وجود داشتن پراپرتی ها و متد ها در آبجت میتوانید استفاده کنید.
در گذشته برای این منظور بدین شکل عمل میکردیم :
const nestedObject = {
firstProp: {
secondProp: {
thirdProp: {
nestedProp: 3
}
}
}
};
if (nestedObject &&
nestedObject.firstProp &&
nestedObject.firstProp.secondProp && nestedObject.firstProp.secondProp.thirdProp && nestedObject.firstProp.secondProp.thirdProp.nestedProp) {
const validPropriety = nestedObject.firstProp.secondProp.thirdProp.nestedProp
console.log(validPropriety) // 3
}
🔹و اما راه حل ES11 آن بدین شکل است :
const checkedProp = nestedObject?.firstProp?.secondProp?.thirdProp?.nestedProp
console.log(checkedProp)
✳️ Promise.allSettled
🔸 این متد که در ES11 اضافه شده، آرایه ای از promise ها دریافت میکند، زمانی که از این متد استفاده میکنید، این متد به عنوان خروجی یک promise باز میگرداند، که شامل ارایه ای از promise های داده شده به آن است و وضعیت reject یا resolve شدن هر یک از promise های داده شده در آن مشخص میباشد، در واقع زمانی که از این متد استفاده میکنید،حتما resolve شدن همه ی promise ها اهمیتی ندارد.
@FullStackDevs
#NewFeatures
#java_script
❇️ New features in ES2020(ES 11)
🔸 در این پست به معرفی ویژگی های جدیدی که تحت عنوان ES2020 به جاوا اسکریپت اضافه شده است، می پردازیم.
باید بدانید که ES مخفف ECMAScript میباشد و استانداردی است که جاوا اسکریپت بر اساس ان ساخته شده است و شروع آن از سال 2015 بوده و گروهی از توسعه دهندگان جاوا اسکریپت و سایر افراد دیگر که در توسعه و افزودن ویژگی های جدید به جاوا اسکریپت همکاری میکنند.
در ECMAScript برای انتشار یک ویژگی جدید چهار مرحله وجود دارد :
▪️Proposal
▪️Draft
▪️Candidate
▪️Finished
🔸 زمانی که ویژگی جدید به مرحله چهارم برسد به عنوان یک بخشی از ECMAScript release تلقی میشود و از این به بعد این وظیفه ی مرورگر است که آن ویژگی را پیاده سازی کند.
🔹 پس قبل از اینکه از ویژگی جدیدی استفاده کنید مطمئن شوید که مرورگرتان آنرا پیاده سازی کرده باشد. برای این منظور میتوانید از
وب سایت caniuse کمک بگیرید.
🔶در ادامه به مهمترین ویژگی های ES11 میپردازیم
✳️ Nullish Coalescing Operator (??)
🔸زمانی که می خواهیم به یک پراپرتی یک آبجکت دسترسی داشته باشیم گاهی اوقات لازم است تا فقط درصورت null یا undefined بودن مقدار یک متغییر یا پراپرتی، مقادیر پیشفرض جایگزین شوند.
در گذشته برای این منظور از عملگر || استفاده میکردیم، اتفاقی که در حقیقت در زمان استفاده از این عملگر می افتاد این بود که مقادیر متغیر یا پراپرتی مربوطه توسط جاوااسکریپت به اجبار به Boolean تبدیل میشدند و در صورت که مقدار متغیر یا پراپرتی تعیین شده falsy بود مقدار پیشرفرض مشخص شده در نظر گرفته میشد.
مقادیر falsyType در جاوااسکریپت عبارتند از :
(رشته خالی) '' , 0,undefined,null,false,NaN , ...
const falsyTypes = {
emptyString: '',
zeroNum: 0,
falseBoolean: false,
nullValue: null,
}
const undefinedValue = falsyTypes.undefinedValue || 'my default'
🔸حال بیاییم شرایطی را در نظر بگیریم که فقط در صورت null یا undefined بودن مقدار یک پراپرتی, مقدار پیشفرض مشخص شده, در نظر گرفته شود.چنین شرایطی زمانی که از نوع داده ای متغیر خود آگاه نباشیم, اگر از عملگر || استفاده کنیم باعث بروز رفتار های ناخوسته ای میشود, به عنوان مثال ممکن است مقدار پراپرتی false باشد و بدلیل اینکه hcعملگر || استفاده کردیم, جاوااسکریپت از falsy check برای این منظور استفاده میکند, و باز هم مقدار پیشفرض درنظر گرفته خواهد شد.
در حالی که فقط میخواستیم اگر مقدار پراپرتی null یا undefined باشد, مقدار پیشفرض در نظر گرفته شود.
🔹حل این مشکل در ES11 با عملگر (??) انجام میشود.
در صورتی که مقدار متغیر فقط null یا undefined باشد, مقادیر پیشفرض در نظر گرفته خواهد شد.
✳️ Optional Chaining Operator(Elvis operator)
🔸این عملگر این امکان را فراهم میسازد که زمانی که در حال خواندن پراپرتی های یک آبجکت تو در تو هستید نگرانی ای در مورد وجود داشتن یا نداشتن پراپرتی های آن آبجکت نداشته باشید, اگر آبجکت مربوطه دارای پراپرتی مشخص شده نباشد undefined بازگشت داده خواهد شد.
🔹از این عملگر هم برای مطمئن شدن از وجود داشتن پراپرتی ها و متد ها در آبجت میتوانید استفاده کنید.
در گذشته برای این منظور بدین شکل عمل میکردیم :
const nestedObject = {
firstProp: {
secondProp: {
thirdProp: {
nestedProp: 3
}
}
}
};
if (nestedObject &&
nestedObject.firstProp &&
nestedObject.firstProp.secondProp && nestedObject.firstProp.secondProp.thirdProp && nestedObject.firstProp.secondProp.thirdProp.nestedProp) {
const validPropriety = nestedObject.firstProp.secondProp.thirdProp.nestedProp
console.log(validPropriety) // 3
}
🔹و اما راه حل ES11 آن بدین شکل است :
const checkedProp = nestedObject?.firstProp?.secondProp?.thirdProp?.nestedProp
console.log(checkedProp)
✳️ Promise.allSettled
🔸 این متد که در ES11 اضافه شده، آرایه ای از promise ها دریافت میکند، زمانی که از این متد استفاده میکنید، این متد به عنوان خروجی یک promise باز میگرداند، که شامل ارایه ای از promise های داده شده به آن است و وضعیت reject یا resolve شدن هر یک از promise های داده شده در آن مشخص میباشد، در واقع زمانی که از این متد استفاده میکنید،حتما resolve شدن همه ی promise ها اهمیتی ندارد.
@FullStackDevs
#ES11
#NewFeatures
#java_script
#ادامه
✳️ globalThis
🔸با گذشت زمان جاوااسکریپت رفته رفته تکامل یافت و باعث ورود جاوااسکریپت به محیط های دیگر خارج از مرورگر شد.
بنابرین زمانی که یک کد cross-platform با جاوااسکریپت می نویسید که بروی node و مرورگر و web-workers اجرا شود، در تمام این محیط ها برای دسترسی به گلوبال آبجکت با شئ متفاوتی سروکار دارید.
در مرورگر گلوبال آبجکت به window و در node به global و در web workers گلوبال ابجکت به self اشاره میکند.
و راه حل استانداردی برای دسترسی به صورت یک پارچه در تمام این محیط ها به شی گلوبال آبجکت وجود نداشت.
🔹در ES11 اما با معرفی globalThis میتوانید بسته به محیطی که کد در آن اجرا میشود به گلوبال آبجکت آن محیط دسرسی داشته باشید.
✳️ Private class variables
از ES11 به بعد برای تعریف پراپرتی های private در کلاس ها از # در ابتدای نام پراپرتی ها استفاده میکنیم.
class Something {
#property;
constructor(){
this.#property = "test";
}
#privateMethod() {
return 'hello world';
}
getPrivateMessage() {
return this.#privateMethod();
}
}
✳️ Dynamic import
🔸داینامیک import() یک promise برای ماژول درخواست شده باز میگرداند که میتوانید با استفاده از async/await و await کردن داینامیک import(), ماژول خود را در یک متغیر نگه دارید.
به عنوان مثال میتوانید در زمان برقرار بودن یک شرط ماژول خود را import() کنید:
async function load() {
if(true){
let say = await import('./say.js');
say.hi(); // Hello!
say.bye(); // Bye!
say.default(); // Module loaded (export default)!
}
}
(ویژگی private property در برخی منابع به عنوان ویژگی جدید ES11 معرفی شده بود و در برخی منابع خیر. در این پست اما جهت معرفی وجود چنین ویژگی در جاوااسکریپت آورده شده است)
@FullStackDevs
#NewFeatures
#java_script
#ادامه
✳️ globalThis
🔸با گذشت زمان جاوااسکریپت رفته رفته تکامل یافت و باعث ورود جاوااسکریپت به محیط های دیگر خارج از مرورگر شد.
بنابرین زمانی که یک کد cross-platform با جاوااسکریپت می نویسید که بروی node و مرورگر و web-workers اجرا شود، در تمام این محیط ها برای دسترسی به گلوبال آبجکت با شئ متفاوتی سروکار دارید.
در مرورگر گلوبال آبجکت به window و در node به global و در web workers گلوبال ابجکت به self اشاره میکند.
و راه حل استانداردی برای دسترسی به صورت یک پارچه در تمام این محیط ها به شی گلوبال آبجکت وجود نداشت.
🔹در ES11 اما با معرفی globalThis میتوانید بسته به محیطی که کد در آن اجرا میشود به گلوبال آبجکت آن محیط دسرسی داشته باشید.
✳️ Private class variables
از ES11 به بعد برای تعریف پراپرتی های private در کلاس ها از # در ابتدای نام پراپرتی ها استفاده میکنیم.
class Something {
#property;
constructor(){
this.#property = "test";
}
#privateMethod() {
return 'hello world';
}
getPrivateMessage() {
return this.#privateMethod();
}
}
✳️ Dynamic import
🔸داینامیک import() یک promise برای ماژول درخواست شده باز میگرداند که میتوانید با استفاده از async/await و await کردن داینامیک import(), ماژول خود را در یک متغیر نگه دارید.
به عنوان مثال میتوانید در زمان برقرار بودن یک شرط ماژول خود را import() کنید:
async function load() {
if(true){
let say = await import('./say.js');
say.hi(); // Hello!
say.bye(); // Bye!
say.default(); // Module loaded (export default)!
}
}
(ویژگی private property در برخی منابع به عنوان ویژگی جدید ES11 معرفی شده بود و در برخی منابع خیر. در این پست اما جهت معرفی وجود چنین ویژگی در جاوااسکریپت آورده شده است)
@FullStackDevs
Forwarded from Web Devs
❇️ Object Destructuring in ES6
🔸 ویژگی Object Destructuring یکی از ویژگی های جدید ES6 میباشد و در این پست قصد داریم به معرفی آن بپردازیم هم چنین در این پست برای اختصار از OD بجای Object Destructuring استفاده میکنیم.
🔻توجه داشته باشید که این اختصار اصلا رایج نبوده و فقط برای نگارش آسان تر در این پست استفاده شده است
🔹 اضافه شدن ویژگی OD به ES6 باعث به وجود آمدن هزاران syntax جدید در ES6 شد.
ویژگی OD کاربرهای بسیاری دارد و هنگام کار کردن با object ها array ها function ها بسیار پر استفاده خواهد بود.
🔹می توانیم از OD به همراه object ها برای ترکیب کردن دو یا سه یا .. object با یکدیگر استفاده کنیم یا حتی انتخاب برخی از فیلد های یک object و تبدیل آن به یک object کوچکتر استفاده کنیم.
🔹هم چنین از OD به همراه array ها برای ترکیب کردن ارایه ها یا حتی شکستن یک ارایه به بخش کوچکتر استفاده کنیم .
🔹در function ها از OD برای فیلتر کردن ارایه ها و object هایی که به عنوان آرگومان تعریف کرده ایم استفاده میکنیم.
( توجه کنید که کاربرد OD ها محدود به این موارد نیست و کاربرد های بسیار فراوانی دارد، موارد فوق صرفا جهت معرفی بخش کوچکی از کاربرد های این ویژگی ذکر شده اند. )
✳️ در این پست از OD به همراه object ها استفاده میکنیم.
🔸ابتدا باید به کمک یک مثال مشکلی قدیمی را بررسی کنیم و به ببینیم که چگونه OD به کمک ما می آید.
فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
و برای دریافت مقادیر فیلد های این object بدین شکل عمل میکردیم :
const first = person.first;
const last = person.last;
🔹اگر object ما ده ها فیلد داشت برای دریافت مقدار هر یک از فیلد های ان باید متغیر تعریف کنیم و هر بار مقدار فیلد مورد نظر را به متغیر خود اختصاص دهیم. کاری تکراری و طاقت فرسا.
اینجاست که OD وارد میشود و به کمک ما می آید.
const { first, last } = person;
🔹در این کد فیلد های last و first از person خوانده میشود و در متغیر های همنام متناظر خود قرار میگیرد و از این به بعد میتوانیم مقادیر را از متغیر های last و first بخوانیم و در جای جای scope استفاده کنیم.
🔹سینتکس مثال قبل یکی از سینتکس ها و کاربرد های فراوان OD میباشد.
هم چنین اگر مقدار فیلد city را person نیاز داشته باشیم میتوانیم به این شکل عمل کنیم.
const { first, last,city } = person;
console.log(first); //Brendan
console.log(last); //Eich
console.log(city); //Pittsburgh
حال بیایید object خود را کمی پیچیده تر کنیم فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan',
last: 'Eich',
links: {
social: {
site: 'https://brendaneich.com',
twitter: 'https://twitter.com/BrendanEich',
}
}
};
از این object فقط مقادیر site و twitter را نیاز داریم .
در گذشته برا خواندن این مقادیر بدین شکل عمل میکردیم :
const twitter = person.links.social.twitter;
const site = person.links.social.site;
اما می توانیم با کمک OD بدین شکل عمل کنیم :
const { twitter, site } = person.links.social;
console.log(twitter, site);
🔻 نکته مهم این است که متغیر ها بایستی همنام با فیلد های object باشند تا مقادیر مورد نظر در آنها ریخته شود.
اما اگر لازم بود تا متغیری با نامی متفاوت از آنچه که فیلد object هست داشته باشیم بدین شکل عمل میکنیم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
const { first : personFirstName } = person;
بدین صورت میتوانید به متغیر های خود در OD نامی متفاوت دهید.
✳️ Set default value with OD
🔸چگونه در هنگام destruct کردن یک آبجکت مقادیر پیشفرض برای متغیر ها اختصاص دهیم.
فرض کنیم object زیرا داریم
const settings = {
speed: 150
}
const { speed, width } = settings;
🔹 همانطور که مشخص است ابجکت settings دارای فیلدی به نام width نیست با log کردن این فیلد مقدار undefined لاگ خواهد شد.
برای set کردن مقدار پیفرض برای متغیر width در هنگام destruct کردن آبجکت settings :
const { speed, width = 500 } = settings;
بدین شکل عمل میکنیم .
🔻 نکته بسیار مهم این است که فقط در صورتی که مقدار متغیر width براربر با undefined باشد این مقدار پیشفرض برای آن set خواهد شد.
در صورتی که آبجکت settings دارای فیلد متناظری باشد حتی اگر مقدار آن null false 0 هم باشد این مقادیر در متغیر width قرار میگیرد.
☑️قسمت های بعدی OD در صورت دریافت فیدبک های انرژی بخش ادامه خواهد داشت.
❇️ Happy JS Coding 😉
@FullStackDevs
🔸 ویژگی Object Destructuring یکی از ویژگی های جدید ES6 میباشد و در این پست قصد داریم به معرفی آن بپردازیم هم چنین در این پست برای اختصار از OD بجای Object Destructuring استفاده میکنیم.
🔻توجه داشته باشید که این اختصار اصلا رایج نبوده و فقط برای نگارش آسان تر در این پست استفاده شده است
🔹 اضافه شدن ویژگی OD به ES6 باعث به وجود آمدن هزاران syntax جدید در ES6 شد.
ویژگی OD کاربرهای بسیاری دارد و هنگام کار کردن با object ها array ها function ها بسیار پر استفاده خواهد بود.
🔹می توانیم از OD به همراه object ها برای ترکیب کردن دو یا سه یا .. object با یکدیگر استفاده کنیم یا حتی انتخاب برخی از فیلد های یک object و تبدیل آن به یک object کوچکتر استفاده کنیم.
🔹هم چنین از OD به همراه array ها برای ترکیب کردن ارایه ها یا حتی شکستن یک ارایه به بخش کوچکتر استفاده کنیم .
🔹در function ها از OD برای فیلتر کردن ارایه ها و object هایی که به عنوان آرگومان تعریف کرده ایم استفاده میکنیم.
( توجه کنید که کاربرد OD ها محدود به این موارد نیست و کاربرد های بسیار فراوانی دارد، موارد فوق صرفا جهت معرفی بخش کوچکی از کاربرد های این ویژگی ذکر شده اند. )
✳️ در این پست از OD به همراه object ها استفاده میکنیم.
🔸ابتدا باید به کمک یک مثال مشکلی قدیمی را بررسی کنیم و به ببینیم که چگونه OD به کمک ما می آید.
فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
و برای دریافت مقادیر فیلد های این object بدین شکل عمل میکردیم :
const first = person.first;
const last = person.last;
🔹اگر object ما ده ها فیلد داشت برای دریافت مقدار هر یک از فیلد های ان باید متغیر تعریف کنیم و هر بار مقدار فیلد مورد نظر را به متغیر خود اختصاص دهیم. کاری تکراری و طاقت فرسا.
اینجاست که OD وارد میشود و به کمک ما می آید.
const { first, last } = person;
🔹در این کد فیلد های last و first از person خوانده میشود و در متغیر های همنام متناظر خود قرار میگیرد و از این به بعد میتوانیم مقادیر را از متغیر های last و first بخوانیم و در جای جای scope استفاده کنیم.
🔹سینتکس مثال قبل یکی از سینتکس ها و کاربرد های فراوان OD میباشد.
هم چنین اگر مقدار فیلد city را person نیاز داشته باشیم میتوانیم به این شکل عمل کنیم.
const { first, last,city } = person;
console.log(first); //Brendan
console.log(last); //Eich
console.log(city); //Pittsburgh
حال بیایید object خود را کمی پیچیده تر کنیم فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan',
last: 'Eich',
links: {
social: {
site: 'https://brendaneich.com',
twitter: 'https://twitter.com/BrendanEich',
}
}
};
از این object فقط مقادیر site و twitter را نیاز داریم .
در گذشته برا خواندن این مقادیر بدین شکل عمل میکردیم :
const twitter = person.links.social.twitter;
const site = person.links.social.site;
اما می توانیم با کمک OD بدین شکل عمل کنیم :
const { twitter, site } = person.links.social;
console.log(twitter, site);
🔻 نکته مهم این است که متغیر ها بایستی همنام با فیلد های object باشند تا مقادیر مورد نظر در آنها ریخته شود.
اما اگر لازم بود تا متغیری با نامی متفاوت از آنچه که فیلد object هست داشته باشیم بدین شکل عمل میکنیم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
const { first : personFirstName } = person;
بدین صورت میتوانید به متغیر های خود در OD نامی متفاوت دهید.
✳️ Set default value with OD
🔸چگونه در هنگام destruct کردن یک آبجکت مقادیر پیشفرض برای متغیر ها اختصاص دهیم.
فرض کنیم object زیرا داریم
const settings = {
speed: 150
}
const { speed, width } = settings;
🔹 همانطور که مشخص است ابجکت settings دارای فیلدی به نام width نیست با log کردن این فیلد مقدار undefined لاگ خواهد شد.
برای set کردن مقدار پیفرض برای متغیر width در هنگام destruct کردن آبجکت settings :
const { speed, width = 500 } = settings;
بدین شکل عمل میکنیم .
🔻 نکته بسیار مهم این است که فقط در صورتی که مقدار متغیر width براربر با undefined باشد این مقدار پیشفرض برای آن set خواهد شد.
در صورتی که آبجکت settings دارای فیلد متناظری باشد حتی اگر مقدار آن null false 0 هم باشد این مقادیر در متغیر width قرار میگیرد.
☑️قسمت های بعدی OD در صورت دریافت فیدبک های انرژی بخش ادامه خواهد داشت.
❇️ Happy JS Coding 😉
@FullStackDevs
✳️Network Requests via Fetch() API
🔸 متد fetch در جاوااسکریپت رابطی است که می توانید از طریق آن بر بستر شبکه درخواست ارسال کنید.
🔸 برای ارسال درخواست به سرور و دریافت اطلاعات چند راه وجود دارد که متد fetch یک راه مدرن و جدید و جامع میباشد.
🔹 مرورگرهای قدیمی و بخصوص مرورگر محبوب دولوپران (IE) 😉 از این متد پشتیبانی نمیکنند.
🔹در نتیجه در زمان استفاده از این متد باید مطمئن باشید که client از یک مرورگر جدید استفاده میکند.
🔹این متد با استفاده از promise ها در جاوااسکریپت پیچدگی ارسال درخواست را کاهش میدهد و بدین ترتیب کدی خوانا تر خواهید نوشت.
❇️ نحوه درخواست با متد fetch بدین شکل است :
let promise = fetch(URL, [options])
🔹 تنها پارامتر اجباری برای ارسال درخواست url میباشد و [options] پارامتر هایی نظیر method,header و.. میباشد که میخواهید به همراه در خواست قرار دهید.
مرورگر بلافاصله با مواجه شده با این متد شروع به ارسال درخواست میکند و در نهایت یک promise باز میگرداند و response را بعد از resolve شدن promise بازگردانده شده در دسترس خواهد بود.
در صورتی که به دلایلی متد fetch نتواند به سرور در خواست ارسال کند promise بازگردانده شده reject خواهد شد.❗️
🔸با resolve شدن promise و دریافت response برای خواندن داده های دریافتی دو مرحله وجود دارد :
▫️ابتدا باید http Status code را چک کنید و مطمئن شوید که درخواست با موفقیت ارسال شده است یا خیر.
▫️مرحله بعدی خواندن body از response میباشد که بدین منظور response متدهای promise base ای را در اختیار شما قرار میدهد.
متد های به شرح زیر است :
🔻response.text()
برای خواندن response به صورت text
🔻response.json()
برای خواندن response به صورت json
🔻response.formData()
برای خواندی response به صورت formData
🔻response.blob()
برای خواندن response به صورت Blob
(داده های باینری به همراه تایپ)
🔻response.arrayBuffer()
خواندن response به صورت ArrayBuffer
(نمایش سطح پایینی از داده های باینری)
🔻 علاوه بر اینها response.body یک شی ای ReadableStream خواهد بود که به شما اجازه خواندن body را میدهد.
⚠️ برای خواندن بادی response فقط از یکی از این متد ها میتوانید استفاده کنید.
اگر بادی response را با استفاده از یکی از این متد ها خوانده باشید دیگر قادر نخواهید بود تا دوباره بادی response را بخوانید.
let text = await response.text(); // response body consumed
let parsed = await response.json(); // fails (already consumed)
✳️ Differences from jQuery Ajax
🔹 گفتیم که خروجی متد fetch یک promise میباشد، promise بازگشتی حتی در صورتی که Http status code عدد 404 یا 500 باشد reject نخواهد شد
و فقط Okstatus برای response بازگشتی false خواهد بود.
🔹 متد fetch در درخواست ها cookie را ارسال نمیکند مگر اینکه به همراه درخواست ارسالی credentials را برابر با 'same-origin' قرار دهید.
fetch(
'http://domain/service',
{
method: 'GET',
credentials: 'same-origin'
}
)
🔹 در هنگام استفاده از متد fetch کوکی های ارسالی از دامین های متفاوت (cross-site cookie) دریافت نخواهد شد.
❇️ Fetch vs Ajax
🔸 اگر کلاینتی دارید که ممکن است از IE استفاده کند fetch انتحاب خوبی نخواهد بود و همچین متد fetch تمامی امکانات Ajax را دارا نیست اما بدون شک آینده از آن Fetch خواهد بود پس فعلا در استفاده از آن احتیاط کنید.
@FullStackDevs
🔸 متد fetch در جاوااسکریپت رابطی است که می توانید از طریق آن بر بستر شبکه درخواست ارسال کنید.
🔸 برای ارسال درخواست به سرور و دریافت اطلاعات چند راه وجود دارد که متد fetch یک راه مدرن و جدید و جامع میباشد.
🔹 مرورگرهای قدیمی و بخصوص مرورگر محبوب دولوپران (IE) 😉 از این متد پشتیبانی نمیکنند.
🔹در نتیجه در زمان استفاده از این متد باید مطمئن باشید که client از یک مرورگر جدید استفاده میکند.
🔹این متد با استفاده از promise ها در جاوااسکریپت پیچدگی ارسال درخواست را کاهش میدهد و بدین ترتیب کدی خوانا تر خواهید نوشت.
❇️ نحوه درخواست با متد fetch بدین شکل است :
let promise = fetch(URL, [options])
🔹 تنها پارامتر اجباری برای ارسال درخواست url میباشد و [options] پارامتر هایی نظیر method,header و.. میباشد که میخواهید به همراه در خواست قرار دهید.
مرورگر بلافاصله با مواجه شده با این متد شروع به ارسال درخواست میکند و در نهایت یک promise باز میگرداند و response را بعد از resolve شدن promise بازگردانده شده در دسترس خواهد بود.
در صورتی که به دلایلی متد fetch نتواند به سرور در خواست ارسال کند promise بازگردانده شده reject خواهد شد.❗️
🔸با resolve شدن promise و دریافت response برای خواندن داده های دریافتی دو مرحله وجود دارد :
▫️ابتدا باید http Status code را چک کنید و مطمئن شوید که درخواست با موفقیت ارسال شده است یا خیر.
▫️مرحله بعدی خواندن body از response میباشد که بدین منظور response متدهای promise base ای را در اختیار شما قرار میدهد.
متد های به شرح زیر است :
🔻response.text()
برای خواندن response به صورت text
🔻response.json()
برای خواندن response به صورت json
🔻response.formData()
برای خواندی response به صورت formData
🔻response.blob()
برای خواندن response به صورت Blob
(داده های باینری به همراه تایپ)
🔻response.arrayBuffer()
خواندن response به صورت ArrayBuffer
(نمایش سطح پایینی از داده های باینری)
🔻 علاوه بر اینها response.body یک شی ای ReadableStream خواهد بود که به شما اجازه خواندن body را میدهد.
⚠️ برای خواندن بادی response فقط از یکی از این متد ها میتوانید استفاده کنید.
اگر بادی response را با استفاده از یکی از این متد ها خوانده باشید دیگر قادر نخواهید بود تا دوباره بادی response را بخوانید.
let text = await response.text(); // response body consumed
let parsed = await response.json(); // fails (already consumed)
✳️ Differences from jQuery Ajax
🔹 گفتیم که خروجی متد fetch یک promise میباشد، promise بازگشتی حتی در صورتی که Http status code عدد 404 یا 500 باشد reject نخواهد شد
و فقط Okstatus برای response بازگشتی false خواهد بود.
🔹 متد fetch در درخواست ها cookie را ارسال نمیکند مگر اینکه به همراه درخواست ارسالی credentials را برابر با 'same-origin' قرار دهید.
fetch(
'http://domain/service',
{
method: 'GET',
credentials: 'same-origin'
}
)
🔹 در هنگام استفاده از متد fetch کوکی های ارسالی از دامین های متفاوت (cross-site cookie) دریافت نخواهد شد.
❇️ Fetch vs Ajax
🔸 اگر کلاینتی دارید که ممکن است از IE استفاده کند fetch انتحاب خوبی نخواهد بود و همچین متد fetch تمامی امکانات Ajax را دارا نیست اما بدون شک آینده از آن Fetch خواهد بود پس فعلا در استفاده از آن احتیاط کنید.
@FullStackDevs