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
👍1
Forwarded from Web Devs
#javascript
#Immediately_Invoked_Function_Expression
#IIFE
❇️ Immediately-Invoked Function Expression (IIFE)
▫️در ابتدا باید بدانید که تفاوت بین expression و statement چیست⁉️
🔹اصلی ترین تفاوت میان statement و expression این است که یک expression را میتوانید به یک متغیر assign کنید.
✳️ در این پست به معرفی و تعریف نوعی از فانکشن های جاوا اسکریپ میپردازیم که به آنها "فانکشن های فوری صدا شونده" می گویند .به اختصار IIFE.
🔸 دو دلیل عمده برای استفاده از این نوع توابع وجود دارد.
🔻 محدود کردن scope متغیر ها
🔻 اجرای فوری و بلافاصله فانکشن بعد تعریف شدن آن.
▫️در ادامه به شرح هریک از دو علت خواهیم پرداخت.
🔹معمول ترین syntax تعریف این نوع فانکشن ها بدین صورت است :
(
//output "Hello!"
🔸 در مثال بالا پرانتز های بیرونی () که (function IIFE(){ .. }) را احاطه کرده است باعث میشوند که فانکشن داخلی آنها برای جاوا اسکریپت به عنوان یک expression در نظر گرفته شود و به مانند یک statement و یک تابع معمولی رفتار نکند.
🔸 پرانتز نهایی () در انتهای expression بالا برای آن است که فانکشن تعریف شده را بلافاصه بعد تعریف شدن صدا زده و اجرا کند.
❇️ تعریف کردن فانکشن ها باعث به وجود آمدن scope های جدید میشود و از آنجایی که IIFE یک فانکشن است تعریف کردن یک IIFE جدید باعث به وجود امدن یک scope جدید میشود اما scope به وجود امده قوانین محصور کننده ای دارد یعنی متغیر های تعریف شده در این scope بروی سایر کد های خارج از آن تاثیری ندارد و خارج از آن قابل دسترس نیستند.
▫️ حال که از ماهیت یک IIFE اگاه شدیم بیایید به syntax های مختلف تعریف یک IIFE بپردازیم.
🔸 پیشتر با معمول ترین روش تعریف آن آشنا شدیم . روش دیگری که برای تعریف یک IIFE وجود دارد به صورت زیر است
!
🔻نکته قابل توجه در مثال بالا پیشوند '!' در ابتدای تعریف فانکشن است .به طور کلی '!' در ابتدای فانکشن مثال قبل جاوا اسکریپت را مجبور میکند که هر چیزی که بعد آن بیاید را به عنوان یک expression در نظر بگیرد.
🔹 در نتیجه در مثال بالا یک IIFE جدید تعریف کردیم که بلافاصله بعد تعریف شدن صدا زده شده و اجرا میشود.
🔻 همچنین میتوانید به جای '!' از '+' , '-' , '~' و یا هر unary operator دیگری استفاده کنید.
🔻یک unary operator عملگری است که تنها یک عملوند دریافت میکند و روی آن عملیاتی انجام میدهد.
▫️ همچنین روشی دیگر برای تعریف IIFE وجود دارد.
void
🔸 در این مثال ' void ' برای مجبور کردن جاوا اسکریت برای در نظر گرفتن فانکشن بعد از آن به عنوان یک expression است.
🔻 نکته خیلی مهم در مورد این نوع syntax های تعریف IIFE این است که فانکشن نمیتواند مقدار خروجی داشته باشد❕❕
❇️ برای اینکه یک IIFE بتواند یک مقدار خروجی را بازگرداند باید به صورت اولین مثال که پیشتر تعریف شد یا به صورت زیر تعریف شود.
(
(
🔹 همچنین میتوانید به یک IIFE پارامتر پاس دهید
(
console.log(msg);
}
✳️ در این پست به معرفی IIFE پرداختیم که کاربر های فروانی دارد.
✳️ لطفا این پست را با دوستان خود به اشتراک بگذارید
▫️Happy Js Coding😉
@FullStackDevs
#Immediately_Invoked_Function_Expression
#IIFE
❇️ Immediately-Invoked Function Expression (IIFE)
▫️در ابتدا باید بدانید که تفاوت بین expression و statement چیست⁉️
🔹اصلی ترین تفاوت میان statement و expression این است که یک expression را میتوانید به یک متغیر assign کنید.
✳️ در این پست به معرفی و تعریف نوعی از فانکشن های جاوا اسکریپ میپردازیم که به آنها "فانکشن های فوری صدا شونده" می گویند .به اختصار IIFE.
🔸 دو دلیل عمده برای استفاده از این نوع توابع وجود دارد.
🔻 محدود کردن scope متغیر ها
🔻 اجرای فوری و بلافاصله فانکشن بعد تعریف شدن آن.
▫️در ادامه به شرح هریک از دو علت خواهیم پرداخت.
🔹معمول ترین syntax تعریف این نوع فانکشن ها بدین صورت است :
(
function
IIFE(){
console.log( "Hello!" );}
)();//output "Hello!"
🔸 در مثال بالا پرانتز های بیرونی () که (function IIFE(){ .. }) را احاطه کرده است باعث میشوند که فانکشن داخلی آنها برای جاوا اسکریپت به عنوان یک expression در نظر گرفته شود و به مانند یک statement و یک تابع معمولی رفتار نکند.
🔸 پرانتز نهایی () در انتهای expression بالا برای آن است که فانکشن تعریف شده را بلافاصه بعد تعریف شدن صدا زده و اجرا کند.
❇️ تعریف کردن فانکشن ها باعث به وجود آمدن scope های جدید میشود و از آنجایی که IIFE یک فانکشن است تعریف کردن یک IIFE جدید باعث به وجود امدن یک scope جدید میشود اما scope به وجود امده قوانین محصور کننده ای دارد یعنی متغیر های تعریف شده در این scope بروی سایر کد های خارج از آن تاثیری ندارد و خارج از آن قابل دسترس نیستند.
▫️ حال که از ماهیت یک IIFE اگاه شدیم بیایید به syntax های مختلف تعریف یک IIFE بپردازیم.
🔸 پیشتر با معمول ترین روش تعریف آن آشنا شدیم . روش دیگری که برای تعریف یک IIFE وجود دارد به صورت زیر است
!
function
() {
alert("Hello from IIFE!");}
();🔻نکته قابل توجه در مثال بالا پیشوند '!' در ابتدای تعریف فانکشن است .به طور کلی '!' در ابتدای فانکشن مثال قبل جاوا اسکریپت را مجبور میکند که هر چیزی که بعد آن بیاید را به عنوان یک expression در نظر بگیرد.
🔹 در نتیجه در مثال بالا یک IIFE جدید تعریف کردیم که بلافاصله بعد تعریف شدن صدا زده شده و اجرا میشود.
🔻 همچنین میتوانید به جای '!' از '+' , '-' , '~' و یا هر unary operator دیگری استفاده کنید.
🔻یک unary operator عملگری است که تنها یک عملوند دریافت میکند و روی آن عملیاتی انجام میدهد.
▫️ همچنین روشی دیگر برای تعریف IIFE وجود دارد.
void
function
() {
alert("Hello from IIFE!");}
();🔸 در این مثال ' void ' برای مجبور کردن جاوا اسکریت برای در نظر گرفتن فانکشن بعد از آن به عنوان یک expression است.
🔻 نکته خیلی مهم در مورد این نوع syntax های تعریف IIFE این است که فانکشن نمیتواند مقدار خروجی داشته باشد❕❕
❇️ برای اینکه یک IIFE بتواند یک مقدار خروجی را بازگرداند باید به صورت اولین مثال که پیشتر تعریف شد یا به صورت زیر تعریف شود.
(
function
() {
return "From IIFE";}
() ); (
function
() {
return "From IIFE";}
) () ;🔹 همچنین میتوانید به یک IIFE پارامتر پاس دهید
(
function
IIFE(msg, times) {
for (var i = 1; i <= times; i++) {console.log(msg);
}
}
("Hello!", 5));✳️ در این پست به معرفی IIFE پرداختیم که کاربر های فروانی دارد.
✳️ لطفا این پست را با دوستان خود به اشتراک بگذارید
▫️Happy Js Coding😉
@FullStackDevs
#Bootstrap
#Version_5_alpha1
#CSS
🌀 بوت استرپ اکنون در نسخه 5 الفا موجود است.
بوت استرپ محبوب ترین و پرکاربردترین فریم ورک متن باز در جهان برای توسعه با HTML ، CSS و JS است. با راه اندازی ورژن 5 ، بسیاری از تغییرات اساسی در جدیدترین نسخه معرفی می شوند.
✅ تغییرات عمده در بوت استرپ 5
✔️ جی کوئری حذف شد
تیم بوت استرپ بزرگترین وابستگی های جانبی به سمت کلاینت را حذف کرده است.تیم بوت استرپ جی کوئری را به دلیل وابستگی به جاوا اسکریپت که در وب سایت رسمی خود اعلام کرده است ، منقضی کرده است. جی کوئری با vanilla Javascript جایگزین شده است.
✔️ پشتیبانی IE10 برداشته شد
بوت استرپ 5 دیگر با Internet Explorer 10 همراه نخواهد شد و پشتیبانی از مرورگر IE10 را در این نسخه حذف شده است.
✔️ واحد اندازه گیری عرض ها (width) تغییر کرده
از px به rem تبدیل شده.
سی اس اس روشهایی برای مشخص کردن اندازه یا طول عناصر با استفاده از واحدهای مختلف اندازه گیری مانند px ، em ، rem ،٪ vw و vh ارائه می دهد.
در حالی که px به طور گسترده ای شناخته شده اند و برای absolute units استفاده می شود و نسبت به DPI و وضوح viewing device تغییر نمی کند.
بوت استرپ مدت زمان طولانی از px برای عرض (width) خود استفاده می کرد که دیگر این مورد در Bootstrap 5 وجود ندارد و از rem استفاده می کند.
واحد Rem مخفف "root em" است که به معنای برابر با مقدار محاسبه شده اندازه فونت در عنصر ریشه (html) است. به عنوان مثال ، 1 rem برابر با اندازه قلم عنصر HTML است (بیشتر مرورگرها مقدار پیش فرض 16 پیکسل دارند).
✔️ بهبود bootstrap branch برای توسعه
طبق اعلام رسمی وب سایت،master به شاخه جدید v3 dev بوت استرپ v5 تبدیل می شود و برای توسعه v5 شاخه جدید master را از v4-dev برش می دهد
✔️ مهاجرت از jekyll به Hugo
معرفی Hugo : هوگو سریعترین تولید کننده سایت استاتیک در جهان است که بدون شک سایت های استاتیک را در میلی ثانیه تولید می کند و از زبان Golang استفاده می کند.
معرفی jekyll : جکیل قدیمی ترین تولید کننده سایت استاتیک است و در بوت استرپ 5 کنار گذاشته شده.
✔️ کتابخانه آیکو نهای SVG :
برای اولین بار ، Bootstrap کتابخانه آیکون منبع باز SVG خاص خود را دارد به گونه ای طراحی میکند که بتواند به بهترین شکل با components ها و اسناد ما کار کند.
✔️ ستون و ردیف در بوت استرپ 5
مفاهیم بوت استرپ که سیستم 12 ستونی ارائه می دهد در بوت استرپ 5 نیز موجود خواهد بود. طراح وبسایت می تواند از ستونهای Grid و layout در بوت استرپ 5 استفاده کند.
سطرها و ستون های بوت استرپ ، کارآمدترین راه حل برای موضوعات در اندازه های مختلف صفحه نمایش را ارائه می دهند. تمرکز اصلی تغییر در v5 هنوز واکنش گرا یا responsive است ، اگرچه در نسخه های اخیر بوت استرپ ، توسعه بیشتر روی بهبود عملکرد و کاهش زمان بارگذاری متمرکز شده است.
🔗 Download Bootstrap 5.0.0-alpha1
@FullStackDevs
#Version_5_alpha1
#CSS
🌀 بوت استرپ اکنون در نسخه 5 الفا موجود است.
بوت استرپ محبوب ترین و پرکاربردترین فریم ورک متن باز در جهان برای توسعه با HTML ، CSS و JS است. با راه اندازی ورژن 5 ، بسیاری از تغییرات اساسی در جدیدترین نسخه معرفی می شوند.
✅ تغییرات عمده در بوت استرپ 5
✔️ جی کوئری حذف شد
تیم بوت استرپ بزرگترین وابستگی های جانبی به سمت کلاینت را حذف کرده است.تیم بوت استرپ جی کوئری را به دلیل وابستگی به جاوا اسکریپت که در وب سایت رسمی خود اعلام کرده است ، منقضی کرده است. جی کوئری با vanilla Javascript جایگزین شده است.
✔️ پشتیبانی IE10 برداشته شد
بوت استرپ 5 دیگر با Internet Explorer 10 همراه نخواهد شد و پشتیبانی از مرورگر IE10 را در این نسخه حذف شده است.
✔️ واحد اندازه گیری عرض ها (width) تغییر کرده
از px به rem تبدیل شده.
سی اس اس روشهایی برای مشخص کردن اندازه یا طول عناصر با استفاده از واحدهای مختلف اندازه گیری مانند px ، em ، rem ،٪ vw و vh ارائه می دهد.
در حالی که px به طور گسترده ای شناخته شده اند و برای absolute units استفاده می شود و نسبت به DPI و وضوح viewing device تغییر نمی کند.
بوت استرپ مدت زمان طولانی از px برای عرض (width) خود استفاده می کرد که دیگر این مورد در Bootstrap 5 وجود ندارد و از rem استفاده می کند.
واحد Rem مخفف "root em" است که به معنای برابر با مقدار محاسبه شده اندازه فونت در عنصر ریشه (html) است. به عنوان مثال ، 1 rem برابر با اندازه قلم عنصر HTML است (بیشتر مرورگرها مقدار پیش فرض 16 پیکسل دارند).
✔️ بهبود bootstrap branch برای توسعه
طبق اعلام رسمی وب سایت،master به شاخه جدید v3 dev بوت استرپ v5 تبدیل می شود و برای توسعه v5 شاخه جدید master را از v4-dev برش می دهد
✔️ مهاجرت از jekyll به Hugo
معرفی Hugo : هوگو سریعترین تولید کننده سایت استاتیک در جهان است که بدون شک سایت های استاتیک را در میلی ثانیه تولید می کند و از زبان Golang استفاده می کند.
معرفی jekyll : جکیل قدیمی ترین تولید کننده سایت استاتیک است و در بوت استرپ 5 کنار گذاشته شده.
✔️ کتابخانه آیکو نهای SVG :
برای اولین بار ، Bootstrap کتابخانه آیکون منبع باز SVG خاص خود را دارد به گونه ای طراحی میکند که بتواند به بهترین شکل با components ها و اسناد ما کار کند.
✔️ ستون و ردیف در بوت استرپ 5
مفاهیم بوت استرپ که سیستم 12 ستونی ارائه می دهد در بوت استرپ 5 نیز موجود خواهد بود. طراح وبسایت می تواند از ستونهای Grid و layout در بوت استرپ 5 استفاده کند.
سطرها و ستون های بوت استرپ ، کارآمدترین راه حل برای موضوعات در اندازه های مختلف صفحه نمایش را ارائه می دهند. تمرکز اصلی تغییر در v5 هنوز واکنش گرا یا responsive است ، اگرچه در نسخه های اخیر بوت استرپ ، توسعه بیشتر روی بهبود عملکرد و کاهش زمان بارگذاری متمرکز شده است.
🔗 Download Bootstrap 5.0.0-alpha1
@FullStackDevs
Getbootstrap
Powerful, extensible, and feature-packed frontend toolkit. Build and customize with Sass, utilize prebuilt grid system and components, and bring projects to life with powerful JavaScript plugins.
❇️ چرا سی شارپ و جاوا multiple inheritance را پشتیبانی نمیکنند❕
🔰 سی شارپ و جاوا multiple inheritance را پشتیبانی نمیکنند و استدلال سازندگان آنها برای این موضوع این بوده است که اضافه کردن ویژگی multiple inheritance به این زبانها باعث پیچیدگی بیش از حد میشود در حالی که که مزایای آن به نسبت کمتر میباشد.
در سی شارپ یک کلاس تنها این اجازه را دارد که فقط از یک کلاس ارث بری کند (اصطلاحا single inheritance گفته میشود).
🔹در multiple inheritance، یک کلاس میتواند اجزای خود را از یک یا چند کلاس ارث بری کند.
✳️ چرا multiple inheritance باعث پیچیدگی میشود⁉️
🔹فرض کنید که کلاس A کلاس پایه است. و کلاس های B و C از این کلاس(کلاس A) ارث بری میکنند. و کلاس D از کلاس های BوC ارث بری میکند.
شرایطی را در نظر بگیرید که هریک از کلاس های B و C به صورت جداگانه متدی را که در کلاس پدرشان (کلاس A) وجود دارد override کنند در نتیجه این عمل برای کلاس D که از این دو کلاس (B و C) ارث بری میکند ابهامی را به وجود می آورد ' که باید از کدام پیاده سازی استفاده کنم؟ '
▫️اگرچه برای این مشکل راه هایی در c++ معرفی شده است (سی پلاس پلاس multiple inheritance را پشتیبانی میکند) اما این روش ها برای برنامه نویسان، باعث ایجاد ابهام میشود.
✅ در زبان های سی شارپ و جاوا تنها راه استفاده از multiple inheritance، استفاده و پیاده سازی چندین interface میباشد
@FullStackDevs
🔰 سی شارپ و جاوا multiple inheritance را پشتیبانی نمیکنند و استدلال سازندگان آنها برای این موضوع این بوده است که اضافه کردن ویژگی multiple inheritance به این زبانها باعث پیچیدگی بیش از حد میشود در حالی که که مزایای آن به نسبت کمتر میباشد.
در سی شارپ یک کلاس تنها این اجازه را دارد که فقط از یک کلاس ارث بری کند (اصطلاحا single inheritance گفته میشود).
🔹در multiple inheritance، یک کلاس میتواند اجزای خود را از یک یا چند کلاس ارث بری کند.
✳️ چرا multiple inheritance باعث پیچیدگی میشود⁉️
🔹فرض کنید که کلاس A کلاس پایه است. و کلاس های B و C از این کلاس(کلاس A) ارث بری میکنند. و کلاس D از کلاس های BوC ارث بری میکند.
شرایطی را در نظر بگیرید که هریک از کلاس های B و C به صورت جداگانه متدی را که در کلاس پدرشان (کلاس A) وجود دارد override کنند در نتیجه این عمل برای کلاس D که از این دو کلاس (B و C) ارث بری میکند ابهامی را به وجود می آورد ' که باید از کدام پیاده سازی استفاده کنم؟ '
▫️اگرچه برای این مشکل راه هایی در c++ معرفی شده است (سی پلاس پلاس multiple inheritance را پشتیبانی میکند) اما این روش ها برای برنامه نویسان، باعث ایجاد ابهام میشود.
✅ در زبان های سی شارپ و جاوا تنها راه استفاده از multiple inheritance، استفاده و پیاده سازی چندین interface میباشد
@FullStackDevs
#JavaScript
❇️ Given a number of elements that need to stay in order, would you use an Object or an Array⁉️
❇️ Given a number of elements that need to stay in order, would you use an Object or an Array⁉️
Anonymous Quiz
37%
Object
63%
Array
📌خروجی کد بالا چیست؟
Anonymous Quiz
45%
Border Collie, Wooh
19%
Border Collie, undefined
19%
undefined, Wooh
17%
undefined, undefined
#js_trick
#js
توی جاوا اسکریپت اگر قسمت صحیح یه عدد رو خواستین میتونین قبلش دوتا کاراکتر تیلدا (~) بذارید
@FullStackDevs
#js
توی جاوا اسکریپت اگر قسمت صحیح یه عدد رو خواستین میتونین قبلش دوتا کاراکتر تیلدا (~) بذارید
console.log(~~4.131839) // 4شاید بگین خب متد Math.floor هم عدد صحیح بر میگردونه ولی رند میکنه :
console.log(~~-3.825682) // -3
Math.floor(-3.825682)▫️Happy Js Coding😉
Output: -4
@FullStackDevs
👍1
#js
#arrowFunction
#this
✅ در جاوا اسکریپت کلمه کلیدی this به به یک آبجکت اشاره میکند.این ابجت، ابجکتی هست که باعث اجرا شدن کدهای جاوااسکریپت میباشد.
به عبارتی دیگر هر function در جاوااسکریپت دارای رفرنسی به یک execution context میباشد که آنرا this می گوییم.
در نتیجه اگر یک فانکشن معمولی را به وسیله ابجکت های متفاوت صدا بزنید this به ابجکت های متفاوتی اشاره خواهد کرد.
در جاوا اسکریپت arrow function ها
باعث bind شدن ابجکت جدیدی به this نمیشوند و به جای آن this در arrorw function ها به اسکوپ parent اشاره میکند. یعنی رفرنس this در درون یک arrow function با رفرنس this در خارج از همان arrow function یکسان خواهد بود.
@FullStackDevs
#arrowFunction
#this
✅ در جاوا اسکریپت کلمه کلیدی this به به یک آبجکت اشاره میکند.این ابجت، ابجکتی هست که باعث اجرا شدن کدهای جاوااسکریپت میباشد.
به عبارتی دیگر هر function در جاوااسکریپت دارای رفرنسی به یک execution context میباشد که آنرا this می گوییم.
در نتیجه اگر یک فانکشن معمولی را به وسیله ابجکت های متفاوت صدا بزنید this به ابجکت های متفاوتی اشاره خواهد کرد.
در جاوا اسکریپت arrow function ها
باعث bind شدن ابجکت جدیدی به this نمیشوند و به جای آن this در arrorw function ها به اسکوپ parent اشاره میکند. یعنی رفرنس this در درون یک arrow function با رفرنس this در خارج از همان arrow function یکسان خواهد بود.
@FullStackDevs
Forwarded from Web Devs
#Keyless_Entity
🔴این پست شامل دو پیام میباشد
✳️Keyless Entity Types
🔸این ویژگی از EF Core 2.1 با نام query type به Ef Core اضافه شد که در Ef Core 3.0 به keyless entity type تغییر نام پیدا کرد است.
از این رو EF Core علاوه بر Entity های معمولی، Model میتواند شامل Entity هایی باشد که
▪️یک keyless Entity میتواند قالب یا مدل خروجی یک کوئری،procedure که از نتیجه Join چند Table در دیتابیس به وجود می اید باشد.
علاوه بر این یک Keyless Entity اکثر ویژگی های یک Entity که شامل inheritance mapping و navigation property و ... است، پشتیبانی میکند.
همچنین میتواند یک Keyless Entity Type را به یک آبجکت نظیر Table یا View در دیتابیس Map کرد.این کار را با کمک fluent API یا data annotations میتوانید انجام دهید.
🔸با همه این ویژگی های مشترک اما یک Keyless Entity تفاوتهایی نسبت به یک Entity دارد که میتوان به موارد ذیل اشاره کرد :
▫️نمیواند کلید اصلی داشته باشند
▫️تغییرات آنها اصلا توسط Change Tracker ردیابی نمیشود پس درنتیجه هرگز امکان درج و حذف و آبدیت انها در DbContext را ندارید.
▫️برای آنها قرار دادی (Convention) وجود ندارد یعنی کلیه Convention هایی که به صورت پیشفرض برای Entity ها در Ef Core وجود دارد برای یک keyless Entity وجود ندارد.
▫️تنها از زیر مجموعه ای از navigation mapping پشتیبانی میکند که به طور خاص دارای شرایط زیر باشد :
🔹خروجی یک navigation mapping در انتهای رابطه به مانند یک principal Entity نباشد..
🔹اگر یکی از پراپرتی ها یک keyless Entity یک Complex type باشد، باید به ازای تک تک پراپرتی های آن Cpmplex type خروجی همنام متناظر داشته باشید.
🔹در هنگام navigation mapping یک keyless Entity فقط میتواند شامل reference navigation property باشد.
🔹انیتی ها نمیتوانند یک keyless Entity را به عنوان navigation property در برداشته باشند.
▫️در هنگام Configuration باید به صورت .HasNoKey() تنظیم شوند.
▫️همچنین ممکن است به یک defining query مپ شود.
🔻یک defining query کوئری است که درون Model تعریف شده و به عنوان Data Source برای keyless Entity عمل میکند.
✳️ موارد استفاده از یک keyless Entity
▪️به عنوان یک نوع بازگشتی برای raw SQL query بکار برده شود.
▪️به یک View در دیتابیس Map شود که هیچ کلید اصلی نیز ندارد.
▪️به یک جدول در دیتابیس Map شود که هیچ کلید اصلی ندارد.
▪️به کوئری های تعریف شده در مدل (defining query) مپ شود.
✳️ نحوه مپ کردن یک Keyless Entity به آبجکنی در دیتابیس
🔸با استفاده از متد های ToTable و ToView در fluent API میتوانید اینکار را انجام دهید.
▪️از دیدگاه Ef Core دیتابیس Object مشخص شده در متد ToView یک view در دیتابیس است و به یک view نمیتوان چیزی را ADD ، DELETE،UPDATE کرد. البته این به این معنی نیست که لزوما آبجکت سمت دیتابیس باید یک View باشد . میتوانید از یک Table استفاده کنید اما این Table به صورت ReadOnly رفتار میکند.
🔻نکته : زمانی که از متد ToView استفاده میکنید ویو مشخص شده باید در دیتابیس وجود داشته باشد و همچنین به صورت خودکار در هنگام مایگریشن و update Database ساخته نخواهد شد.
@FullStackDevs
🔴این پست شامل دو پیام میباشد
✳️Keyless Entity Types
🔸این ویژگی از EF Core 2.1 با نام query type به Ef Core اضافه شد که در Ef Core 3.0 به keyless entity type تغییر نام پیدا کرد است.
از این رو EF Core علاوه بر Entity های معمولی، Model میتواند شامل Entity هایی باشد که
کلید اصلی
ندارند.▪️یک keyless Entity میتواند قالب یا مدل خروجی یک کوئری،procedure که از نتیجه Join چند Table در دیتابیس به وجود می اید باشد.
علاوه بر این یک Keyless Entity اکثر ویژگی های یک Entity که شامل inheritance mapping و navigation property و ... است، پشتیبانی میکند.
همچنین میتواند یک Keyless Entity Type را به یک آبجکت نظیر Table یا View در دیتابیس Map کرد.این کار را با کمک fluent API یا data annotations میتوانید انجام دهید.
🔸با همه این ویژگی های مشترک اما یک Keyless Entity تفاوتهایی نسبت به یک Entity دارد که میتوان به موارد ذیل اشاره کرد :
▫️نمیواند کلید اصلی داشته باشند
▫️تغییرات آنها اصلا توسط Change Tracker ردیابی نمیشود پس درنتیجه هرگز امکان درج و حذف و آبدیت انها در DbContext را ندارید.
▫️برای آنها قرار دادی (Convention) وجود ندارد یعنی کلیه Convention هایی که به صورت پیشفرض برای Entity ها در Ef Core وجود دارد برای یک keyless Entity وجود ندارد.
▫️تنها از زیر مجموعه ای از navigation mapping پشتیبانی میکند که به طور خاص دارای شرایط زیر باشد :
🔹خروجی یک navigation mapping در انتهای رابطه به مانند یک principal Entity نباشد..
🔹اگر یکی از پراپرتی ها یک keyless Entity یک Complex type باشد، باید به ازای تک تک پراپرتی های آن Cpmplex type خروجی همنام متناظر داشته باشید.
🔹در هنگام navigation mapping یک keyless Entity فقط میتواند شامل reference navigation property باشد.
🔹انیتی ها نمیتوانند یک keyless Entity را به عنوان navigation property در برداشته باشند.
▫️در هنگام Configuration باید به صورت .HasNoKey() تنظیم شوند.
▫️همچنین ممکن است به یک defining query مپ شود.
🔻یک defining query کوئری است که درون Model تعریف شده و به عنوان Data Source برای keyless Entity عمل میکند.
✳️ موارد استفاده از یک keyless Entity
▪️به عنوان یک نوع بازگشتی برای raw SQL query بکار برده شود.
▪️به یک View در دیتابیس Map شود که هیچ کلید اصلی نیز ندارد.
▪️به یک جدول در دیتابیس Map شود که هیچ کلید اصلی ندارد.
▪️به کوئری های تعریف شده در مدل (defining query) مپ شود.
✳️ نحوه مپ کردن یک Keyless Entity به آبجکنی در دیتابیس
🔸با استفاده از متد های ToTable و ToView در fluent API میتوانید اینکار را انجام دهید.
▪️از دیدگاه Ef Core دیتابیس Object مشخص شده در متد ToView یک view در دیتابیس است و به یک view نمیتوان چیزی را ADD ، DELETE،UPDATE کرد. البته این به این معنی نیست که لزوما آبجکت سمت دیتابیس باید یک View باشد . میتوانید از یک Table استفاده کنید اما این Table به صورت ReadOnly رفتار میکند.
🔻نکته : زمانی که از متد ToView استفاده میکنید ویو مشخص شده باید در دیتابیس وجود داشته باشد و همچنین به صورت خودکار در هنگام مایگریشن و update Database ساخته نخواهد شد.
@FullStackDevs
Forwarded from Web Devs
#ادامه
#Keyless_Entity
🔹مثال
ابتدا مدل های زیر را تعریف میکنیم
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
}
▪️در خط زیر نیست یک view ساده در دیتابیس تعریف میکتیم که هر Post به همراه Blog مرتبطش برمیگرداند.
db.Database.ExecuteSqlRaw(
@
▪️در نهایت Keyless Entity خود را متناظر با نوع خروچی View ای که ساختیم به اینصورت تعریف میکنیم.
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
▪️و آنرا بدین شکل در متد OnModelCreating کانفیگ میکنیم.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
eb.ToView("View_BlogPostCounts");
eb.Property(v => v.BlogName).HasColumnName("Name");
▪️ حال نوبت به معرفی کرد keyless Entity به DbContext میباشد.که بدین شکل در Db Context تعریف میشود
var postCounts = db.BlogPostCounts.ToList();
foreach (var postCount in postCounts)
{
Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
Console.WriteLine();
}
لینک منبع
🔹سورس این پست رو در اینجا بررسی کنید.
@FullStackDevs
#Keyless_Entity
🔹مثال
ابتدا مدل های زیر را تعریف میکنیم
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
}
▪️در خط زیر نیست یک view ساده در دیتابیس تعریف میکتیم که هر Post به همراه Blog مرتبطش برمیگرداند.
db.Database.ExecuteSqlRaw(
@
"CREATE VIEW View_BlogPostCounts AS
SELECT b.Name, Count(p.PostId) as PostCount
FROM Blogs b
JOIN Posts p on p.BlogId = b.BlogId
GROUP BY b.Name"
);▪️در نهایت Keyless Entity خود را متناظر با نوع خروچی View ای که ساختیم به اینصورت تعریف میکنیم.
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
▪️و آنرا بدین شکل در متد OnModelCreating کانفیگ میکنیم.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<BlogPostsCount>(eb =>
{
eb.HasNoKey();eb.ToView("View_BlogPostCounts");
eb.Property(v => v.BlogName).HasColumnName("Name");
});
}▪️ حال نوبت به معرفی کرد keyless Entity به DbContext میباشد.که بدین شکل در Db Context تعریف میشود
public DbQuery<BlogPostsCount> BlogPostCounts { get; set; }
در آخر نیز بدین شکل میتوانید از آن استفاده کنید.var postCounts = db.BlogPostCounts.ToList();
foreach (var postCount in postCounts)
{
Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
Console.WriteLine();
}
لینک منبع
🔹سورس این پست رو در اینجا بررسی کنید.
@FullStackDevs
#Heap
#Stack
#GoldenRules
سوال ساده ای که همیشه اکثرا فکر میکنند میدونن و در اشتباه هستند ولی خب با به خاطر سپردن این 2 تا قانون بعید میدونم دیگه type ای باشه که ما ندونیم کجا قراره ذخیره بشه !
🔹رفرنس تایپ همیشه میره تو heap
🔸ولیو تایپ و پوینتر همیشه جایی میروند که declare شدند .
pointer : References to virtual memory managed by the
CLR
یعنی وقتی تو یه کلاس شما یه member field از نوع int دارین ! کلاس که آبجکت هستش و همیشه میره تو heap! و ممبر فیلد int شما هم میره تو heap (جایی که declare شده )
@FullStackDevs
#Stack
#GoldenRules
سوال ساده ای که همیشه اکثرا فکر میکنند میدونن و در اشتباه هستند ولی خب با به خاطر سپردن این 2 تا قانون بعید میدونم دیگه type ای باشه که ما ندونیم کجا قراره ذخیره بشه !
🔹رفرنس تایپ همیشه میره تو heap
🔸ولیو تایپ و پوینتر همیشه جایی میروند که declare شدند .
pointer : References to virtual memory managed by the
CLR
یعنی وقتی تو یه کلاس شما یه member field از نوع int دارین ! کلاس که آبجکت هستش و همیشه میره تو heap! و ممبر فیلد int شما هم میره تو heap (جایی که declare شده )
@FullStackDevs
#RubberDuckDebugging
اگر برنامهنویس باشید احتمالا به این حالت برخوردید که درگیر یک باگی میشید، مدتی روش فکر و کار میکنید و به نتیجه نمیرسید، بعد که حسابی خسته شدید به همکارتون میگید فلانی من به مشکل خوردم و شروع میکنید برای شخص دوم مشکل رو توضیح دادن و در حین توضیح، ناخودآگاه متوجه میشید کجای کارتون اشتباه بوده و باگ رو پیدا میکنید. من خودم خیلی این اتفاق برام پیش اومده !
✅ جالبه بدونید این فرآیند یک روش معتبر برای دیباگ نرم افزار هست که بهش rubber duck debugging گفته میشه.
توی این روش برنامه نویس اردک پلاستیکی ای رو در دست میگیره و شروع به توضیح مشکل به اردک میکنه تا فرآیندی که در بالا گفتم اتفاق بیفته و باگ کار پیدا بشه.
📌 منبع
@FullStackDevs
اگر برنامهنویس باشید احتمالا به این حالت برخوردید که درگیر یک باگی میشید، مدتی روش فکر و کار میکنید و به نتیجه نمیرسید، بعد که حسابی خسته شدید به همکارتون میگید فلانی من به مشکل خوردم و شروع میکنید برای شخص دوم مشکل رو توضیح دادن و در حین توضیح، ناخودآگاه متوجه میشید کجای کارتون اشتباه بوده و باگ رو پیدا میکنید. من خودم خیلی این اتفاق برام پیش اومده !
✅ جالبه بدونید این فرآیند یک روش معتبر برای دیباگ نرم افزار هست که بهش rubber duck debugging گفته میشه.
توی این روش برنامه نویس اردک پلاستیکی ای رو در دست میگیره و شروع به توضیح مشکل به اردک میکنه تا فرآیندی که در بالا گفتم اتفاق بیفته و باگ کار پیدا بشه.
📌 منبع
@FullStackDevs
#DenoJs
#NodeJs
#JsRuntime
❇️ DENO.JS 💎
🔸 در سال 2018 طی کنفرانسی آقای Ryan DahI درباره 10 چیز درمورد Node.js که از آنها پیشمان و متاثر است سخنرانی کرد.
در انتهای این کنفرانس از پروژه جدیدی پرده برداری کرد که به تازگی نسخه 1.0 آن release شده است.
🔹 این پروژه DENO.JS است. Deno از ریشه کلمه Node میباشد و بعضی از دولوپران آنرا نسخه ی 2 پروژه Node.js می دادنند.
اما این تفکر کاملا ناعادلانه و غیر منصفانه است.
🔸آقای Ryan DahI خالق Deno میباشد و همچنین Node.js را نیز ایشان کدنویسی کرده است.
▫️اما چرا اقای Ryan DahI به جای بهبود Node.js، به Deno و دوباره نویسی یک Runtime جدید برای جاوا اسکریپت روی آورد⁉️
❇️ اقای Ryan Dahi از تمامی نواقص و تکنولوژی های قدیمی که در Node.js استفاده شده است آگاهی دارد و در نتیجه تصمیم به ساختن نسخه ی جدیدی از نود جی اس کرده است. زمانی که متوجه این موضوع شدند که Node.js نیازمند upgrade هایی است ، انجام اینکار کار برای وی غیر ممکن بود، چرا که Node.js در زمان کوتاهی محبوبیت بسیاری کسب کرد و اپلیکیشن ها و Package های زیادی در هر جا یافت میشدند که از Node.js استفاده میکردند و میکنند.
پس در نتیجه Ryan Dahl زمان و هزینه کافی برای پذیرفتن این ریسک نداشت که Node.js را دچار تغییرایی کند و تمام اپلیکیشن ها و پکیج هایی کنونی را با مشکل سازگاری با تغییرات جدید مواجه کند.
پس تصمیم گرفت که به طور کلی Node.js را به روشی بهتر دوباره نویسی کرده و به همین دلیل Deno.js را به وجود آورد.
❇️ ران تایم Deno بسیار شبیه به Node بوده و تمامیه کاربردهایی که Node دارد را نیز دارا است و با مزیت های خاص خودش که به معرفی آنها میپردازیم.
🔹 پروژه Deno.js ران تایمی جدید برای جاوااسکریپت در خارج از مرورگر است که از V8 استفاده میکند.
▪️ این پروژه با موارد زیر ساخته شده است :
▫️هسته Deno به وسیله Rust نوشته شده است در حالی که هسته Node با C++ نوشت شده است.
▫️ مورد دوم Tokio میباشد. از آنجایی که هسته Deno با Rust نوشته شده است برای event loop در Deno از Tokio که یک ماژول Rust است برای کار کردن با futures به منظور asynchronous programming به جای Libuv استفاده شده است.
▫️مورد سوم TypeScript میباشد. حتما شگفت زده خواهید شد که بدانید بدون نیاز به انجام configuration خاصی به صورت دستی، قادر خواهید بود تا با تایپ اسکریپت در Deno کار کنید. Deno کامپایلر و همه چیز های دیگر را به صورت توکار در اختیار شما قرار میدهد تا از تایپ اسکریپ استفاده کنید.
▪️تمام انچه تا کنون گفته شده تنها بخش کوچکی از مزایای Deno میباشد و هنوز از ویژگی های اصلی Deno سخنی گفته نشده است.
🔰 Security
🔸 یکی از مهمترین ویژگی های Deno امنیت میباشد. به صورت پیشفرض node اجازه دسترسی به همه چیز را میدهد. یعنی اینکه میتوان read و write درون file system انجام داد. دسترسی به شبکه و environment variables نیز از دیگر موارد میباشد.
ممکن است به عنوان یک توسعه دهنده به این فکر کنید که "امکان دسترسی داشتن به همه چیز که خیلی خوب است". ام اگر از لحاظ امنیتی در هنگام کد نویسی مراقب کدهایی که مینویسید، نباشید. باعث به وجود آمدن خطرات امنیتی ای میشوید.
🔹 در مقابل در Deno برای چنین دسترسی های امنیتی ای باید به صورت صریح به اسکریپت مربوطه از طریق command line اجازه دسترسی دهید.
🔰 نه به NPM و node_modules 😨
🔸برای مدیریت dependency ها در Deno دیگر به سیاه چاله ای به نام node_module و NPM وابستگی ندارید.
اما چطور ممکن است⁉️
🔹دنو نیز همانند مرورگر، ماژول های مورد نیاز را از طریق URL لود و کش میکند.
در دنو با import کردن پکیج ها با URL شان میتوانید از آنها استفاده کنید.و بدین ترتیب پکیج های Deno نیازی به متمرکز شدن در جای به نام npm ندارند.
زمانی که اپلیکیشن اجرا میشود Deno تمامیه ماژول های import شده را دانلود میکند و آنها را کش میکند.
💎 ویژگی های خارق العاده Deno خیلی بیشتر از آن است که به طور کامل آنها را در یک یا چند پیام شرح داد . در این پست تلاش کردیم تا تنها بخش کوچک و مهمی از ویژگی های Deno را توضیح دهیم.✌🏻
▫️Happy Deno.js Coding 😉
@FullStackDevs
#NodeJs
#JsRuntime
❇️ DENO.JS 💎
🔸 در سال 2018 طی کنفرانسی آقای Ryan DahI درباره 10 چیز درمورد Node.js که از آنها پیشمان و متاثر است سخنرانی کرد.
در انتهای این کنفرانس از پروژه جدیدی پرده برداری کرد که به تازگی نسخه 1.0 آن release شده است.
🔹 این پروژه DENO.JS است. Deno از ریشه کلمه Node میباشد و بعضی از دولوپران آنرا نسخه ی 2 پروژه Node.js می دادنند.
اما این تفکر کاملا ناعادلانه و غیر منصفانه است.
🔸آقای Ryan DahI خالق Deno میباشد و همچنین Node.js را نیز ایشان کدنویسی کرده است.
▫️اما چرا اقای Ryan DahI به جای بهبود Node.js، به Deno و دوباره نویسی یک Runtime جدید برای جاوا اسکریپت روی آورد⁉️
❇️ اقای Ryan Dahi از تمامی نواقص و تکنولوژی های قدیمی که در Node.js استفاده شده است آگاهی دارد و در نتیجه تصمیم به ساختن نسخه ی جدیدی از نود جی اس کرده است. زمانی که متوجه این موضوع شدند که Node.js نیازمند upgrade هایی است ، انجام اینکار کار برای وی غیر ممکن بود، چرا که Node.js در زمان کوتاهی محبوبیت بسیاری کسب کرد و اپلیکیشن ها و Package های زیادی در هر جا یافت میشدند که از Node.js استفاده میکردند و میکنند.
پس در نتیجه Ryan Dahl زمان و هزینه کافی برای پذیرفتن این ریسک نداشت که Node.js را دچار تغییرایی کند و تمام اپلیکیشن ها و پکیج هایی کنونی را با مشکل سازگاری با تغییرات جدید مواجه کند.
پس تصمیم گرفت که به طور کلی Node.js را به روشی بهتر دوباره نویسی کرده و به همین دلیل Deno.js را به وجود آورد.
❇️ ران تایم Deno بسیار شبیه به Node بوده و تمامیه کاربردهایی که Node دارد را نیز دارا است و با مزیت های خاص خودش که به معرفی آنها میپردازیم.
🔹 پروژه Deno.js ران تایمی جدید برای جاوااسکریپت در خارج از مرورگر است که از V8 استفاده میکند.
▪️ این پروژه با موارد زیر ساخته شده است :
▫️هسته Deno به وسیله Rust نوشته شده است در حالی که هسته Node با C++ نوشت شده است.
▫️ مورد دوم Tokio میباشد. از آنجایی که هسته Deno با Rust نوشته شده است برای event loop در Deno از Tokio که یک ماژول Rust است برای کار کردن با futures به منظور asynchronous programming به جای Libuv استفاده شده است.
▫️مورد سوم TypeScript میباشد. حتما شگفت زده خواهید شد که بدانید بدون نیاز به انجام configuration خاصی به صورت دستی، قادر خواهید بود تا با تایپ اسکریپت در Deno کار کنید. Deno کامپایلر و همه چیز های دیگر را به صورت توکار در اختیار شما قرار میدهد تا از تایپ اسکریپ استفاده کنید.
▪️تمام انچه تا کنون گفته شده تنها بخش کوچکی از مزایای Deno میباشد و هنوز از ویژگی های اصلی Deno سخنی گفته نشده است.
🔰 Security
🔸 یکی از مهمترین ویژگی های Deno امنیت میباشد. به صورت پیشفرض node اجازه دسترسی به همه چیز را میدهد. یعنی اینکه میتوان read و write درون file system انجام داد. دسترسی به شبکه و environment variables نیز از دیگر موارد میباشد.
ممکن است به عنوان یک توسعه دهنده به این فکر کنید که "امکان دسترسی داشتن به همه چیز که خیلی خوب است". ام اگر از لحاظ امنیتی در هنگام کد نویسی مراقب کدهایی که مینویسید، نباشید. باعث به وجود آمدن خطرات امنیتی ای میشوید.
🔹 در مقابل در Deno برای چنین دسترسی های امنیتی ای باید به صورت صریح به اسکریپت مربوطه از طریق command line اجازه دسترسی دهید.
🔰 نه به NPM و node_modules 😨
🔸برای مدیریت dependency ها در Deno دیگر به سیاه چاله ای به نام node_module و NPM وابستگی ندارید.
اما چطور ممکن است⁉️
🔹دنو نیز همانند مرورگر، ماژول های مورد نیاز را از طریق URL لود و کش میکند.
در دنو با import کردن پکیج ها با URL شان میتوانید از آنها استفاده کنید.و بدین ترتیب پکیج های Deno نیازی به متمرکز شدن در جای به نام npm ندارند.
زمانی که اپلیکیشن اجرا میشود Deno تمامیه ماژول های import شده را دانلود میکند و آنها را کش میکند.
💎 ویژگی های خارق العاده Deno خیلی بیشتر از آن است که به طور کامل آنها را در یک یا چند پیام شرح داد . در این پست تلاش کردیم تا تنها بخش کوچک و مهمی از ویژگی های Deno را توضیح دهیم.✌🏻
▫️Happy Deno.js Coding 😉
@FullStackDevs
با توجه کد تصویر کدام یک از گزینه ها زیر به عنوان implicit coercion ( تبدیل اجباری ) در نظر گرفته میشود ؟
Anonymous Quiz
39%
greeting + year.toString()
21%
greeting + String(year)
39%
greeting + year
Anonymous Quiz
62%
true
38%
false
🔹نظر سنجی بدون پاسخ صحیح❕
به نظر شما برنامه نویس هنرمند است و برنامه نویسی هنر⁉️
به نظر شما برنامه نویس هنرمند است و برنامه نویسی هنر⁉️
Anonymous Quiz
27%
اره یک کار هنریه و من یک هنرمندم
67%
نه، یک کار منطقی و خلاقانست
6%
..
Forwarded from Web Devs
#LinqToSql
در این پست می خواهیم به این سوال ها پاسخ دهیم که :
🔹 انواع join در LINQ چیست و چگونه انواع مختلف join را در LinqToSql انجام دهیم ❓
▪️Cross Join
🔸نام دیگر آن Cartesian Product یا ضرب دکارتی میباشد.
در Cross Join هر یک از آیتم ها در DataSource یا Collection اول با تک تک آیتم های DataSource یا Collection دوم با هم مپ میشوند.
مثال
a = {"C#","Java" }
b ={1,2}
=>
یک مثال با LinqToSql :
var result = context.Products.SelectMany(p => context.Categories, (p, c) => new { p.Name, c.Title }).ToList();
❗️ توجه داشته باشید که در Cross Join دو DataSource یا Collection لزوما نیاز به داشتن ارتباط با همدیگر برای فیلتر کردن Data ندارند.
▪️Group Join
🔸این متد برای تولید ساختار های سلسله مراتبی استفاده میشود. بدین صورت که براساس یک کلید هر یک از ایتم های Collection سمت چپ با مجموعه ای از ایتم های مرتبط در Collection سمت راست تشکیل یک زوج را میدهند.یعنی یک ایتم از Collection سمت چپ لیستی از آیتم های Collection سمت راست خواهد داشت.
❗️ اگر یک آیتم در Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراک نداشته باشند باز هم در نتیجه نهایی کوئری وجود خواهد داشت.
کاربرد اصلی آن برای رابطه های یک به چند میباشد .
var result = context.Orders.
GroupJoin(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();
▪️Inner Join
🔸رایج ترین نوع جوین inner join میباشد از این نوع Join برای ادغام دو جدول به یک جدول براساس یک یا چند مشخصه (کلید) مشترک استفاده میشود.
❗️در این نوع join اگر یک آیتم از Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراکی نداشته باشد ، آن آیتم در نتیجه تولید شده نهایی کوئری وجود نخواهد داشت
در واقع این نوع Join فقط و فقط وجه اشتراک دو Collection را بر اساس کلید تعیین شده در خروجی نمایش خواهد داد.
var result = context.Orders.Join(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();
✳️تفاوت Group Join و Inner Join چیست ⁉️
🔸همانطور که در توضیحات هرکدام گفتیم در Group Join اگر به ازای یک آیتم در Collection سمت چپ، آیتم متناظری در Collection سمت راست، براساس کلید مشترک تعیین شده وجود نداشته باشد آن آیتم باز هم در نتیجه تولید شده نهایی کوئری حضور خواهد داشت.
این در حالی است که در Inner Join چنین اتفاقی نمی افتد و فقط ایتم های مشترک انتخاب خواهند شد.
▪️Left Join
🔸 نام دیگر آن Left Outer Join میباشد. این نوع Join بروی دو Collection که بایستی کلید مشترکی با یکدیگر داشته باشند انجام میشود و در left Join تمام آیتم های موجود
در Collection سمت چپ بعلاوه آنهایی که وجه اشتراکی با Collection سمت راست دارند بر اساس کلید تعیین شده در نتیجه نهایی کوئری ظاهر میشوند.
var result = context.Orders.
.SelectMany(c => c.OrderDetail.
(x, y) => new
{
Order = x.Order,
OrderDetail = y
}).ToList();
🔹 متد
🔸اگر OrderDetail شامل مقداری نبود، در نتیجه تولید شده مقدار Default را برای آن تولید کن. این امر برای جلوگیری از صادر شدن استثنا Null صورت میگیرد و علت وقوع آن زمانی است که
به ازای یک آیتم در Collection سمت چپ دارای هیچ آیتمی بر اساس کلید تعیین شده
در Collection سمت راست، نباشد.
▪️Right Join
🔸این نوع جوین برعکس Left Join میباشد و نام دیگر آن Right Outer Join میباشد. برای نوشتن کوئری آن نیز فقط باید در کوئری بالا جای Collection های سمت چپ و راست را عوض کنید.
اما از نطر تعریف در Right Join تمام آیتم های موجود در Collection سمت راست بعلاوه آن ایتم هایی که براساس کلید تعیین شده داری وجه اشتراکی با آیتم های Collection سمت چپ دارند در نتیجه نهایی ظاهر خواهد شد.
@FullStackDevs
در این پست می خواهیم به این سوال ها پاسخ دهیم که :
🔹 انواع join در LINQ چیست و چگونه انواع مختلف join را در LinqToSql انجام دهیم ❓
▪️Cross Join
🔸نام دیگر آن Cartesian Product یا ضرب دکارتی میباشد.
در Cross Join هر یک از آیتم ها در DataSource یا Collection اول با تک تک آیتم های DataSource یا Collection دوم با هم مپ میشوند.
مثال
a = {"C#","Java" }
b ={1,2}
=>
result = { {"C#",1} ,
{"C#",2} , {"Java",1},
{"Java",2} }
❗️اندازه خروجی (result) برابر با ضرب دکارتی دو ارایه خواهد بود.یک مثال با LinqToSql :
var result = context.Products.SelectMany(p => context.Categories, (p, c) => new { p.Name, c.Title }).ToList();
❗️ توجه داشته باشید که در Cross Join دو DataSource یا Collection لزوما نیاز به داشتن ارتباط با همدیگر برای فیلتر کردن Data ندارند.
▪️Group Join
🔸این متد برای تولید ساختار های سلسله مراتبی استفاده میشود. بدین صورت که براساس یک کلید هر یک از ایتم های Collection سمت چپ با مجموعه ای از ایتم های مرتبط در Collection سمت راست تشکیل یک زوج را میدهند.یعنی یک ایتم از Collection سمت چپ لیستی از آیتم های Collection سمت راست خواهد داشت.
❗️ اگر یک آیتم در Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراک نداشته باشند باز هم در نتیجه نهایی کوئری وجود خواهد داشت.
کاربرد اصلی آن برای رابطه های یک به چند میباشد .
var result = context.Orders.
GroupJoin(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();
▪️Inner Join
🔸رایج ترین نوع جوین inner join میباشد از این نوع Join برای ادغام دو جدول به یک جدول براساس یک یا چند مشخصه (کلید) مشترک استفاده میشود.
❗️در این نوع join اگر یک آیتم از Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراکی نداشته باشد ، آن آیتم در نتیجه تولید شده نهایی کوئری وجود نخواهد داشت
در واقع این نوع Join فقط و فقط وجه اشتراک دو Collection را بر اساس کلید تعیین شده در خروجی نمایش خواهد داد.
var result = context.Orders.Join(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();
✳️تفاوت Group Join و Inner Join چیست ⁉️
🔸همانطور که در توضیحات هرکدام گفتیم در Group Join اگر به ازای یک آیتم در Collection سمت چپ، آیتم متناظری در Collection سمت راست، براساس کلید مشترک تعیین شده وجود نداشته باشد آن آیتم باز هم در نتیجه تولید شده نهایی کوئری حضور خواهد داشت.
این در حالی است که در Inner Join چنین اتفاقی نمی افتد و فقط ایتم های مشترک انتخاب خواهند شد.
▪️Left Join
🔸 نام دیگر آن Left Outer Join میباشد. این نوع Join بروی دو Collection که بایستی کلید مشترکی با یکدیگر داشته باشند انجام میشود و در left Join تمام آیتم های موجود
در Collection سمت چپ بعلاوه آنهایی که وجه اشتراکی با Collection سمت راست دارند بر اساس کلید تعیین شده در نتیجه نهایی کوئری ظاهر میشوند.
var result = context.Orders.
GroupJoin
(context.OrderDetails, order => order.ID, orderDetail => orderDetail.OrderId, (x, y) => new { Order = x, OrderDetail = y }).SelectMany(c => c.OrderDetail.
DefaultIfEmpty
(),(x, y) => new
{
Order = x.Order,
OrderDetail = y
}).ToList();
🔹 متد
DefaultIfEmpty
() در مثال بالا تعیین کننده این است که :🔸اگر OrderDetail شامل مقداری نبود، در نتیجه تولید شده مقدار Default را برای آن تولید کن. این امر برای جلوگیری از صادر شدن استثنا Null صورت میگیرد و علت وقوع آن زمانی است که
به ازای یک آیتم در Collection سمت چپ دارای هیچ آیتمی بر اساس کلید تعیین شده
در Collection سمت راست، نباشد.
▪️Right Join
🔸این نوع جوین برعکس Left Join میباشد و نام دیگر آن Right Outer Join میباشد. برای نوشتن کوئری آن نیز فقط باید در کوئری بالا جای Collection های سمت چپ و راست را عوض کنید.
اما از نطر تعریف در Right Join تمام آیتم های موجود در Collection سمت راست بعلاوه آن ایتم هایی که براساس کلید تعیین شده داری وجه اشتراکی با آیتم های Collection سمت چپ دارند در نتیجه نهایی ظاهر خواهد شد.
@FullStackDevs