آموزش زبان برنامه‌نویسی Rust – قسمت ۱: شروع کار با متغیّرها و ثوابت

در قسمت قبل نحوه‌ی نصب Rust روی سیستم‌عامل‌های مختلف‌ را دیدیم و اوّلین برنامه خودمان‌را در این زبان نوشتیم.

اگر آن قسمت‌را نخوانده‌اید همین الان به سراغش بروید. چون بدون دانستن آن چیز زیادی از این قسمت دستگیرتان نخواهد شد.

ابتدای این جلسه, همانطوری که در انتهای جلسه‌ی قبل گفتم, با هم ساختار برنامه‌ی Hello World که ساختار کلّی برنامه‌های دیگر هم به این زبان هست را بررسی می‌کنیم.

https://virgool.io/Software/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3%DB%8C-rust-%D9%82%D8%B3%D9%85%D8%AA-0-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%88-%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D9%87-%DA%A9%D8%A7%D8%B1-nwqjyzch0lde

ساختار برنامه‌ی Hello World

برنامه‌ای که با هم در قسمت قبل نوشتیم این بود:

حالا زمان این است که بفهمیم هر خط این برنامه چه معنایی دارد.

برنامه با این خط شروع می‌شود:

همانطور که احتمالاً خودتان هم حدس می‌زنید, fn مخفف کلمه‌ی function است. وقتی که این کلمه‌ی کلیدی به کار برده می‌شود یعنی داریم یک تابع‌را اعلان می‌کنیم.

اگر قبل از این با زبان C یا cpp کار کرده باشید حتماً به خاطر دارید که وقتی برنامه اجرا می‌شد تنها کدهای درون تابع main بودند که اجرا می‌شدند. در زبان Rust هم همین‌طور است. یعنی کدهایی که داخل تابع main قرار دارند اجرا می‌شوند و اگر کدی درون این تابع فراخوانی نشده باشد, اجرایی نخواهد شد.

هر برنامه‌ای که به زبان Rust نوشته می‌شود باید تابعی به نام main داشته باشد, در غیر این صورت هنگام کامپایل با خطای زیر روبه‌رو می‌شوید:

وقتی به این خطا برخورد می‌کنید با یکی دیگر از جذّابیّت‌های زبان Rust روبه‌رو می‌شوید. زیر متن ارور راهنمای زیر نوشته شده است:

یکی از نقاط قوّت این زبان پیغام‌های خطای دقیق و واضح آن است که عموماً با راهنمایی‌هایی برای رفع آن خطا همراه اند. این ویژگی‌را با خطاهای C مقایسه کنید که گاهی اوقات آدم‌را چندین روز سرکار می‌گذارند و اکثر اوقات مشکل واقعی را نمی‌گویند.

پرانتزهای بعد از اسم تابع محل قرارگیری پارامترهای تابع هستند. از آنجایی که تابع main پارامتر ورودی ندارد, پس درون پرانتزها چیزی نمی‌نویسیم.

مانند خیلی از زبان‌های دیگر, کدهای تابع درون { و } قرار می‌گیرند. پس حالا که به آکولاد باز رسیدیم وقت آن است که سراغ خط بعدی برویم تا ببینیم درون تابع چه اتّفاقی می‌افتد.

برای اکثر برنامه‌نویس‌ها وجود علامت ! در آخر اسم تابع خیلی عجیب است. شما هم حق دارید که با دیدن این علامت تعجّب کنید, چون !println اصلاً تابع نیست, بلکه یک macro در زبان Rust است. در مورد macro ها بعداً به صورت کامل بحث می‌کنیم. برای الان فقط کافی است بدانید که وقتی پای ! درمیان است, داریم از یک macro استفاده می‌کنیم.

ماکرو !println محتوایش‌را داخل ترمینال یا cmd به کاربر نمایش می‌دهد. ورودی این ماکرو می‌تواند string یا عدد باشد.

در آخرین خط هم با گذاشتن { تابع‌را می‌بندیم و کمپایلر می‌فهمد که کدهایی که از اینجا به بعد نوشته شده‌اند به این تابع ربطی ندارند.

حالا که با ساختار کلّی یک برنامه در زبان Rust آشنا شدیم, وقت آن است که به سراغ متغیّرها و ثابت‌ها برویم. امّا قبل از آن باید یک مفهوم کلیدی را با همدیگر مرور کنیم.

تغییرپذیر و غیرقابل تغییر

تغییرپذیر(mutable) و غیرقابل تغییر(immutable) دو مفهوم ساده اند که موقع نوشتن برنامه موجب خطاهای زیادی می‌شوند.

یک داده‌ی تغییرپذیر, داده‌ای است که پس از اینکه برای اوّلین بار مقدار دهی شد, می‌توان همچنان مقدار آن‌را عوض کرد. امّا یک داده‌ی غیرقابل تغییر پس از مقداردهی اوّلیّه دیگر قابلیّت مقداردهی ندارد.

دیدید چقدر ساده بود؟ حالا قرار است با یکی از بزرگترین تفاوت‌های زبان Rust با زبان‌های دیگر روبه‌رو شوید. نفس‌هایتان‌را حبس کنید.

متغیّر در زبان Rust

متغیّر یک بخش موقّتی از حافظه است که با یک نام خاص مشخّص می‌شود. تا اینجا همه‌ی زبان‌ها با هم مشابه اند. تفاوت Rust در اینجاست که متغیّرها در این زبان به صورت پیش‌فرض غیرقابل تغییر(immutable) هستند. یعنی به صورت پیش‌فرض, پس از مقداردهی اوّلیّه نمی‌توان مقدار آن‌ها را تغییر داد.

نحوه‌ی تعریف یک متغیّر

احتمالاً خیلی تعجّب کرده اید. برای اینکه گیج نشوید قبل از ادامه دادن به سراغ syntax متغیّر در زبان Rust می‌رویم:

خودم هم می‌دانم که این جور نوشتن گیج‌کننده است, ولی اگر اضافه‌اش نمی‌کردم متن ناقص می‌ماند.

خب برویم سراغ توضیح دادن این syntax. برای تعریف یک متغیّر ابتدا باید کلمه‌ی کلیدی let نوشته شود. با نوشتن این کلمه همه می‌فهمند که قرار است به زودی متغیّری در این مکان زاده شود.

بعد از کلمه‌ی let باید اسم متغیّر نوشته شود. اسم متغیّر نمی‌تواند با عدد شروع شود و تنها می‌تواند شامل اعداد و حروف باشد. در زبان Rust هرجا که در مورد حروف حرف می‌زنیم, منظور تمامی کاراکترهایی است که توسّط UTF-8 پشتیبانی می‌شوند. امّا هنگام اسم‌گذاری متغیّرها و توابع باید دقّت‌کنید. هنوز پشتیبانی از کاراکترهای غیر ASCII خوب نیست و نوشتن اسامی متغیّرها با کاراکترهای غیر اسکی ممکن است دردسرساز شود.

در اکثر موارد خود کامپایلر type متغیّر را تشخیص می‌دهد و لازم نیست که ما هم نوع‌را بنویسیم. ولی برای مواردی که ممکن است تعریف type لازم باشد, باید بعد از اسم متغیّر علامت : گذاشت و type را نوشت. در مورد type های مختلف در جلسات بعدی صحبت می‌کنیم.

شما می‌توانید یک متغیّر را اعلان کنید ولی همانجا مقداردهیش نکنید. یا می‌توانید همانجا این کار را بکنید.

حالا در کد زیر ۳ متغیّر مختلف‌را می‌نویسم تا حالت‌های مختلف‌را با هم ببینیم و دیگر چیز گنگی باقی نماند:

گفتیم که متغیّرهای Rust غیرقابل تغییر هستند. پس ما نمی‌توانیم پس از اوّلین مقداردهی دیگر مقدار آن‌ها را تغییر دهیم.

مثلاً برنامه‌ی زیر را ببینید:

فکر می‌کنید با کامپایل این کد چه اتّفاقی می‌افتد؟ همانطور که احتمالاً خودتان هم حدس می‌زنید, ارور می‌گیریم:

همانطور که در متن خطا می‌بینید, ما اجازه‌ی اینکه دوباره به یک متغیّر immutable مقدار بدهیم را نداریم.

چگونه متغیّرهای تغییرپذیر داشته باشیم؟

ما خیلی وقت‌ها به این دلیل از متغیّرها استفاده می‌کنیم که می‌خواهیم در طی زمان تغییراتی روی مقدار آن‌ها اعمال کنیم. امّا وقتی که متغیّر immutable باشد دیگر نمی‌توانیم این کار را بکنیم. پس حالا برای داشتن یک حافظه‌ی تغییرپذیر باید چه کار کرد؟

راه حل ساده است. باید هنگام تعریف متغیّر بگوییم که می‌خواهیم این متغیّر mutable باشد. برای این کار کافی است که کلمه‌ی کلیدی mut را قبل از اسم متغیّر اضافه کنیم.

مثلاً همین برنامه‌ای که چند خط بالاتر نوشتیم را درنظر بگیرید. می‌خواهیم متغیّر x را قابل تغییر کنیم. برنامه این شکلی خواهد شد:

حالا اگر این برنامه‌را اجرا کنید دیگر هیچ اروری دریافت نخواهید کرد.

ثابت‌ها در زبان Rust

ثابت(constant)ها, همانطوری که از اسمشان پیداست قابل تغییر نیستند. در زبان Rust برای تعریف یک ثابت, باید از syntax زیر پیروی کنیم:

تعریف یک ثابت با کلمه‌ی کلیدی const آغاز می‌شود. بعد از این کلمه, اسم ثابت آورده می‌شود. بعد از اسم علامت : قرار می‌گیرد و بعد از آن نوع ثابت ذکر می‌شود. بعد از آن هم با گذاشتن علامت = مقدار آن ثابت را می‌نویسیم.

برخلاف متغیّرها شما باید type ثابت را همیشه ذکر کنید. برای مثال خط زیر یک ثابت عددی در زبان Rust است(در مورد i32 در جلسات بعد توضیح می‌دهم. همین که بدانید یک نوع داده ی عددی است کافی است):

تفاوت متغیّر با ثابت

دیدیم که متغیّرها به صورت پیش‌فرض غیرقابل تغییر هستند. پس شاید الان برایتان این سؤال پیش آمده باشد که اصلاً دیگر چه نیازی به ثوابت داریم؟

حالا با هم تفاوت‌های اصلی متغیّر و ثابت را می‌بینیم:

۱-شما نمی‌توانید یک ثابت را mutable کنید. همچنین باید همیشه نوع آن را ذکر کنید. وگرنه با ارور مواجه می‌شوید.

۲- برخلاف متغیّرها, ثوابت‌را می‌توان در تمام scope ها تعریف کرد. یعنی می‌توان یک ثابت‌را به صورت عمومی(global) تعریف کرد.

کد زیر را ببینید:

اگر برنامه‌ی بالا را کامپایل کنید با خطای زیر مواجه می‌شوید:

یعنی متغیّرها حتماً باید درون یک scope محلّی(مثل بدنه‌ی یک تابع) باشند.

۳- شما نمی‌توانید یک ثابت‌را با خروجی یک تابع مقدار دهی کنید. امّا حتّی یک متغیّر غیرقابل تغییر را هم می‌توان برای اوّلین بار با خروجی یک تابع مقدار دهی کرد.

مثلاً کد زیر را درنظر بگیرید(فعلاً به syntax تابع function توجّه نکنید. این مورد را هم قول می‌دهم که بعداً توضیح بدهم):

وقتی که این برنامه‌را کامپایل کنید با ارور زیر مواجه می‌شوید:

امّا شما به راحتی می‌توانید مقدار یک متغیّر mutable یا immutable را برابر با خروجی یک تابع بگذارید.

این بار به این کد توجّه کنید:

اگر این برنامه‌را کامپایل کنید هیچ اروری نخواهید گرفت.

۴- مورد استفاده‌ی متغیّر و ثابت با هم متفاوت است. ثابت‌ها عموماً برای کنترل بخش‌های مختلف برنامه استفاده می‌شوند و هدف استفاده از آن‌ها جلوگیری از hardcode کردن چنین بخش‌هایی است. امّا متغیّرها مستقیماً برای نگهداری داده‌های کاربردی و منطق برنامه استفاده می‌شوند.

هدف از immutable کردن متغیّرها در Rust چیست؟

حالا بیایید کمی به فلسفه‌ی پشت این تصمیم سازندگان این زبان بپردازیم. چرا باید متغیّرهارا غیرقابل تغییر کنیم؟

مسئله به یک مشکل قدیمی و همیشگی برمی‌گردد. وقتی داریم یک برنامه‌ی هم‌روند(concurrent) می‌نویسم, خیلی وقت‌ها حالتی به نام race condition پیش می‌آید.

در این حالت ۲ یا چند بخش از برنامه که دارند به صورت همزمان اجرا می‌شوند, به صورت همزمان به یک بخش از داده‌ها دسترسی پیدا می‌کنند و آن‌را تغییر می‌دهند. یعنی وسط کار یک thread, ناگهان thread بعدی به داده‌های مشترک دسترسی پیدا می‌کند و آن‌را تغییر می‌دهد. وقتی که thread اوّل می‌خواهد به کارش ادامه بدهد با داده‌ای که خراب شده است روبه‌رو می‌شود و در نتیجه حاصل کارش اشتباه خواهد شد.

حالا سازندگان Rust با غیرقابل تغییر کردن متغیّرها سعی داشتند که تا حد امکان ایمنی داده‌ها را در برنامه‌های هم‌روند تضمین کنند. اینطوری هیچ کدام از thread ها نمی‌توانند داده‌ی اصلی‌را عوض کنند, پس اشکالی در کار بقیه‌ی threadها پیش نمی‌آید.

امیدوارم که نوشته‌های این جلسه واضح باشند. اگر بخشی‌را متوجّه نشدید یا به نظرتان گنگ توضیح داده بودم در بخش نظرات بگویید تا نوشته‌را اصلاح کنم.

در جلسه‌ی بعد با cargo آشنا می‌شویم و بعد نحوه‌ی تعامل با کاربر را از طریق command line یاد خواهیم گرفت.

نوشته آموزش زبان برنامه‌نویسی Rust – قسمت ۱: شروع کار با متغیّرها و ثوابت اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش زبان برنامه‌نویسی Rust – قسمت ۰: معرفی و شروع به کار

وقتی صحبت از برنامه‌نویسی سیستم می‌شود همه یاد زبان C می‌افتند. ولی الان چند سالی هست که یک زبان بسیار قدرتمند به نام Rust ساخته شده. زبانی که بسیاری از مشکلات زبان C را ندارد. مشکلاتی که برای نوشتن برنامه‌های مورد نیاز صنعت امروز دردسر شده اند و هزینه‌هارا به شکل سرسام‌آوری افزایش داده اند.

از آنجایی که این زبان بسیار قوی و پرکاربر که برای دوسال در نظرسنجی سالیانه استک‌اورفلو به عنوان موردعلاقه‌ترین زبان برنامه‌نویسی مشخص شده در ایران مهجور مانده, تصمیم گرفتم که یک آموزش فارسی و جامع برای این زبان تهیه کنم. و چه جایی بهتر از ویرگول؟

از آنجایی که زبان Rust در خیلی از مفاهیم با زبان‌های دیگر تفاوت‌های کلّی یا جزئی دارد, یادگیری آن کار بسیار جالب و چالش‌برانگیزی است.

تنها نکته‌ای که باقی می‌ماند این است که من تمام تلاشم‌را برای توضیح مباحث می‌کنم, امّا به صورت پیش‌فرض مطلب‌را برای افرادی توضیح می‌دهم که آشنایی اوّلیّه با برنامه‌نویسی دارند. بنابراین اگر تا به حال برنامه‌نویسی نکرده‌اید ممکن است کمی گیج شوید.

تاریخچه

زبان برنامه‌نویسی Rust توسط یکی از مهندسان موزیلا به نام Graydon Hoare معرفی شد. در حقیقت این زبان بخشی از یکی از پروژه‌های شخصی ایشان بود. بنیاد موزیلا از سال ۲۰۰۹ حامی مالی این زبان شد.

اوّلین نسخه‌ی پایدار این زبان در سال ۲۰۱۵ منتشر شد.در tحال حاضر نسخه‌ی ۱٫۲۷٫۱ این زبان در دسترس عمومی قرار دارد.

این زبان متن‌باز است و تحت لایسنس MIT کد منبعش در اختیار همگان است.

ویژگی‌ها

برنامه‌های نوشته شده به زبان Rust باید ترجمه(compile) شوند. به همین دلیل سرعت اجرای آن‌ها از برنامه‌های مشابه مفسری(مثل پایتون) بیشتر است.

وبسایت رسمی این زبان ویژگی‌های زیر را به عنوان موارد شاخص برای این زبان ذکر کرده است(از آنجایی که خیلی از موارد معادل فارسی خوبی نداشتند همان توضیح انگلیسی‌را آوردم. اگر متوجّه نشدید در بخش نظرات بپرسید):

  • سرعت بسیار بالا
  • zero-cost abstractions
  • move semantics
  • guaranteed memory safety
  • threads without data races
  • trait-based generics
  • pattern matching
  • type inference‌
  • minimal runtime
  • efficient C bindings

بسیاری از تفاوت‌های زبان Rust با دیگر زبان‌ها به این خاطر است که سازندگان آن می‌خواستند تا جای ممکن ایمنی در هنگام کار با thread ها را تضمین کنند.

نصب Rust

برای شروع باید Rust را نصب کنیم. Rust به‌وسیله‌ی rustup نصب می‌شود. ابزار command lineی که نسخه‌های مختلف Rust و ابزارهای مورد نیاز آن‌را مدیریت می‌کند.

نصب Rust کار بسیار ساده‌ای است. الان با هم تمامی مراحل مورد نیاز برای نصب آن‌را می‌بینیم.

نصب Rust روی لینوکس یا macOs

برای نصب Rust اول از همه باید curl را داشته باشید. برای اینکه مطمئن شوید curl روی دستگاهتان نصب است, ترمینال‌را باز کنید. بعد دستور زیر را تایپ کنید:

اگر خروجی‌ای مشابه متن زیر مشاهده کردید یعنی curl روی سیستمتان نصب شده است(خروجی با توجّه به نسخه‌ی curl و سیستم عامل ممکن است متفاوت باشد):

در غیر این صورت با پیام خطای نصب نبودن نرم‌افزار روبه‌رو می‌شوید. اگر curl نصب نبود می‌توانید به سرعت آن‌را نصب کنید. برای مثال در سیستم‌عامل ابونتو می‌توانید دستور زیر را برای نصب سریع این برنامه در ترمینال اجرا کنید:

یا

حالا کافی است دستور زیر را اجرا کنید تا Rust به سادگی نصب شود:

این دستور اسکریپت rustup را نصب می‌کند. اگر تنظیمات پیش‌فرض‌را می‌خواهید, که پیشنهاد من هم این است, دیگر لازم نیست کار خاصی بکنید. بعد از دانلود اوّلیّه از شما نوع نصب پرسیده می‌شود(تصویر زیر).

با وارد کردن عدد ۱ و زدن دکمه‌ی Enter دیگر لازم نیست کاری بکنید. وقتی دانلود و نصب تمام شد, برای افزودن Rust به PATH دستور زیر را اجرا کنید:

اگر می‌خواهید در ترمینال موجود به Rust دسترسی داشته باشید دستور زیر را هم اجرا کنید:

البته همچنان امکان دارد که با بستن ترمینال کنونی دیگر به Rust دسترسی نداشته باشد که با یکبار ری‌استارت کردن همه‌چیز درست می‌شود.

به علاوه شما به یک لینکر هم نیاز دارید. اگر در حال حاضر توانایی کامپایل کردن برنامه‌های C را روی دستگاهتان دارید پس نیاز نیست کار دیگری بکنید. در غیر این صورت می‌توانید یک کامپایلر C نصب کنید.

نصب Rust روی ویندوز

شما برای استفاده از Rust نیازمند ابزار ساخت زبان C هستید. پس بهتر است ابتدا Visual Studio 2017 یا برنامه‌ای مشابه آن‌را نصب کنید و C++ support را فعّال کنید.

حالا از این آدرس بسته‌ی نصبی برنامه‌ی rustup را دانلود کنید و طبق پیام‌هایی که ظاهر می‌شوند آن‌را نصب کنید.

مراحل درست انجام شده اند؟

حالا که نصب انجام شده, زمان آن است که مطمئن شوید که همه‌چیز به درستی نصب شده اند. پس درون ترمینال یا cmd دستور زیر را اجرا کنید:

حالا اگر همه‌چیز روبه‌راه باشد, باید پیامی مشابه پیام زیر را ببینید:

با توجّه به زمانی که این مطلب‌را می‌خوانید ممکن است محتوای نمایش‌داده شده متفاوت باشد, امّا فرمت کلّی اینگونه خواهد بود.

و حالا سلام دنیا!

حالا می‌خواهیم با هم برنامه‌ی معروف hello world را در زبان Rust بنویسیم. یکی از جذّاب‌ترین بخش‌های زبان Rust این است که به صورت پیش‌فرض از فرمت UTF-8 استفاده می‌کند. به همین دلیل می‌توانید بدون انجام هیچ کار اضافی‌ای در آن فارسی بنویسید.

پس ما هم برنامه‌ی hello world را به زبان فارسی خواهیم نوشت.

برای شروع یک فایل به نام main.rs بسازید. حالا داخل آن کد زیر را بنوسید:

حالا برای اجرای برنامه با ترمینال یا cmd به مسیری که فایل قرار دارد بروید و دستور زیر را اجرا کنید:

با اجرای این دستور برنامه‌ی شما کامپایل می‌شود و فایل حاوی کد قابل اجرا در همان مکان ساخته می‌شود.

اگر از لینوکس یا macOs استفاده می‌کنید, برای اجرای برنامه دستور زیر را اجرا کنید:

اگر هم از windows استفاده می‌کنید دستور زیر را اجرا کنید:

و حالا از دیدن حاصل کارتان لذّت ببرید:

نحوه‌ی اجرای برنامه‌را به‌خاطر بسپارید. در قسمت بعد در مورد بخش‌های مختلف همین برنامه‌ای که با هم نوشتیم صحبت می‌کنیم و نگاهی دقیق‌تر به syntax زبان Rust می‌اندازیم.

اگر سؤالی برایتان پیش آمده در بخش نظرات مطرح کنید. اگر در توانم بود کمکتان می‌کنم.

نوشته آموزش زبان برنامه‌نویسی Rust – قسمت ۰: معرفی و شروع به کار اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش توابع scope در کاتلین : let ، run ، with ، also و apply

s

توابع استاندارد یکی از ویژگیهای جالب و عالی جدید کاتلین هست که به کوتاه تر شدن و خواناتر شدن کدها خیلی کمک می کنن. اگه با این ویژگی آشنایی ندارید لطفا تا آخر این مقال همراه ما باشید.

پیش نیاز این آموزش یاد داشتن extension function ها هست، میتونید از اینجا extension functionها رو یاد بگیرید.

خیلی از توابع استاندارد کاتلین خیلی شبیه به هم هستن، – همونطور که کفگیر و ملاقه‌های بالا شبیه به هم هستن 🙂 ولی هر کدوم یک استفاده‌ای دارن – به همین خاطر گاهی اوقات مردد می‌مونیم که از کدوم یکی استفاده کنیم. توی این مقاله یه روش ساده برای اینکه فرق بین اونا رو تشخیص بدیم و بفهمیم از کدوم یکی استفاده کنیم معرفی می‌کنم. فعلا به متدهای پایین توجه نکنید بعدا بیشتر در موردشون توضیح میدم.

متد run

https://gist.github.com/sajjadyousefnia/a742d2b7be22679e0d833ea31c221d7c

متد T.run

https://gist.github.com/sajjadyousefnia/bcee9d0db82253f80912897a0f6b0e43

متد with

https://gist.github.com/sajjadyousefnia/7f85da7083f03d7a8807e779140b87ae

متد T.apply

https://gist.github.com/sajjadyousefnia/65a7d3f514a96661ca44b024943d63fd

متد T.also

https://gist.github.com/sajjadyousefnia/94f68f66cddd946842f92519b2c6b05d

متد T.let

https://gist.github.com/sajjadyousefnia/10d9f342f0b4a93014b30d541b55172b

ا Scoping Functions

توابعی که می‌خوام در مورد اونا صحبت کنم ، T.run ، T.let ، T.also و T.apply هستن. که من به اونا Scoping Functions ( توابع قلمرو ) میگم، به این خاطر که وظیفه‌ی اصلی اونا اینه که توی تابع به ما توانایی به وجود آوردن قلمرو – اسکوپ – کوچکتری رو داخل بدنالبته یه نکته رو عرض کنم که معمولا مرز قلمروها رو با { و } مشخص می‌کنن .

ساده ترین راه برای نشون دادن مسئله، استفاده از تابع run هست.

https://gist.github.com/sajjadyousefnia/dc424bd4bc992348bc774682c5b9b42c

داخل تابع test با انجام این کار تونستیم یک اسکوپ مجزا به وجود بیاریم.داخل اسکوپ run، قبل از چاپ متغییر mood ، مقدارش رو برابر با I am happy قرار دادیم.

شاید این Scoping Functions توی نگاه اول زیاد به درد بخور به نظر نرسه، ولی یه قابلیت مهم دیگه ای هم داره، و اون اینه که میتونه چیزی رو return کنه.

کد پایینی که از این قابلیت استفاده کرده خیلی شسته رُفته‌تر شده، و دیگه نیازی نیست که برای انجام کار موردنظرمون دوبار از متد show استفاده کنیم.

https://gist.github.com/sajjadyousefnia/a85a3398b85145d50e6272cf1f7cb037

انواع Scoping functions

حالا برای این که Scoping Function ها رو بهتر متوجه بشیم، می‌تونیم به سه روش زیر اونا رو دسته بندی کنیم. و با سه ملاک از هم دیگه تمییزشون بدیم.

۱- تابع معمولی یا extension function

توابع with و T.run توی نگاه اول خیلی شبیه هم هستن. همونطور که پایین می‌بینیم، دارن کار یکسانی رو انجام میدن.

https://gist.github.com/sajjadyousefnia/04d8eaeab80ab11586189eb572bfd182

اما در حقیقت کمی متفاوت هستن، و فرقشون اینه که with یک تابع معمولی هست، در حالی که T.run یک extension function هست.( حتی اگه به شکل extension function به کار نره )

به متدهای اونا که اول مقاله نوشته شده، توجه کنید تا بهتر متوجه بشید.

خب حالا یه سوالی پیش میاد و اون اینکه مزیت هر کدوم چیه؟

حالا تصور کنید که احتمال این باشه که webview.settings تهی یا همون null باشه، حالا اون توابع به شکل پایینی درمیان.

https://gist.github.com/sajjadyousefnia/307530313c346b721b16ae69e9fbdcb7

خب همونطور که دیدین حتما متوجه شدین که توی این مورد استفاده از T.run کار بهتری به نظر بهتر میرسه، چون قبل از اینکه بخوایم ازش استفاده کنیم، میتونیم بررسی کنیم که تهی هست یا نه؟

۲- آرگومان this و آرگومان it

خب، اول باید بررسی کنیم که this و it هر کدوم چی هستن و کجا استفاده میشن؟

آرگومان this

از this برای نشون دادن receiver یا همون آبجکت دریافت کننده‌ی فعلی استفاده میکنیممنظور از دریافت کردن، دریافت کردن this هست و در دو جا برابر با دو چیز تقریبا مختلف هست :

۱- توی یک کلاس، this یعنی آبجکت فعلی که از جنس این کلاس ساخته شده.

۲- توی یک extension function یا یک function literals with reciever که از ترکیب لامبدا و extension function ساخته میشن this عبارتست از آخرین پارامتر دریافت کننده‌ای که مربوط به سمت چپ نقطه هست و از جنس عبارت سمت چپ نقطه هم هست،

اگه به مثال توجه کنید بهتر متوجه منظورم میشید:

https://gist.github.com/sajjadyousefnia/f4d100c3ff7dc29499fb031f47305a9c

توی extension function بالا متغییر ، عبارت adult چاپ میشه. چون همونطور که گفتم، این متغییر هست که به عبارت سمت چپ نقطه فرستاده شده. برای خسته کننده نبودن، this توی function literal ها رو دیگه توضیح نمیدم و اینجا هم نیازی به function literal نداریم.

آرگومان it

خیلی پیش میاد که یک لامبدا داشته باشیم که فقط یک پارامتر داشته باشه.

در این صورت اگر که کامپایلر بتونه امضا یا همون پارامتر رو تشخیص بده، میتونیم فلش لامبدا رو حذف کنیم و به جای استفاده از اسم پارامتر، از it استفاده کنیم.

https://gist.github.com/sajjadyousefnia/2e5e06495aa683d96be81caf10b0de33

خب، حالا اگه به متدهای ابتدای مقاله نگاهی بندازید حتما متوجه میشید که چه جاهایی از this و چه جاهایی از it به عنوان آرگومان و پارامتر استفاده میشه.
نکته : اگه کلاسهای تودرتو داشته باشیم، this برابر با داخلی‌ترین آبجکت توی کلاس هست.

https://gist.github.com/sajjadyousefnia/0bf0868731861bcfe4340528e2b5b3ac

اگه یه نگاهی به توابع T.run و T.let بندازیم، حتما متوجه میشید که همه‌ی ویژگی هاشون به جز یکی یکسانه، در واقع، اون ویژگی ای که باعث تمایز این دوتا میشه، نوع آرگومانی که دریافت میکنن هست. اگه به کد پایینی نگاه کنید می‌بینید که ظاهرا هر دو منطق کاملا یکسانی دارن،البته در ادامه بیشتر توضیح میدم.

https://gist.github.com/sajjadyousefnia/78ee6ebf71853a09ed129a178c8d4703

اگه signature یا همون پارامتر تابع T.run رو بررسی کنید، حتما متوجه این میشید که با استفاده از ().block :T داره صرفا یک Extension Function رو ایجاد میکنه. به همین دلیل هست که T داخل قلمروی مورد نظر میتونه با استفاده از this فراخوانی و استفاده بشه. توی کدنویسی هم که اکثر اوقات میشه this رو حذف کرد. به همین خاطر توی عبارت بالا به جای میشه به جای ${this.length} داخل println فقط $length رو قرار داد. که من اسم این کار رو this as argument ( استفاده از this به عنوان آرگومان ) میگذارم.

اگه به T.let توجه کنید میبینید که یک آرگومانی به شکل block:T داره به تابع فرستاده میشه. برای همینه که میشه داخل let ، اون رو با استفاده از it فراخوانی کرد و مورد استفاده قرار داد. که من اسم این قابلیت رو it as argument میگذارم.

ممکنه که اینجوری نتیجه‌گیری کرده باشید که چون ما میتونیم توی T.run اسم پارامترمون رو نبریم، حتی از this هم میشه استفاده نکنیم، ولی توی T.let در خلاصه‌ترین حالت ممکن باید از it استفاده کنیم (یا به قولی T.run از اون یکی implicit تره) ——> پس حتما استفاده از T.run بهتر خواهد بود. در حالی که اینطور نیست! به دلایل زیر استفاده از T.let بهتره :

  • توی T.let بهتر میشه این مسئله رو متوجه شد که این پارامتری که می‌بینیم، عایا مال این کلاس ( تابع یا property ) هست یا (تابع یا property ) کلاس دیگه.( مثلا در حالتی که کلاسهای تودرتو داشته باشیم )
  • توی eventهایی که this قابل حذف شدن نیست ( مثلا فرض کنید که داخل همون اسکوپ let یا run بخوایم اون متغییر رو به عنوان پارامتر یک متد مورد استفاده قرار بدیم )، استفاده از it به جای this به نظر بهتر و کوتاه‌تر میرسه.
  • به لحاظ نام‌گذاری و اینا استفاده از it بهتره، چون می‌تونیم به جای it ، داخل اسکوپ داخلی از یک اسم دیگه براش استفاده کنیم. به مثال زیر توجه کنید :
https://gist.github.com/sajjadyousefnia/c975a52c5acbdd88136ab80e2fcd93c5

۳- جنس چیزی که return میشه از نوع this باشه یا از جنس دیگری

حالا یک نگاهی به T.let و T.also میندازیم. اگه به اسکوپ داخلی تابع نگاهی بندازیم، ظاهرا هر دو یک کار رو انجام میدن.

https://gist.github.com/sajjadyousefnia/1a55699e16e78f60a4c97352c3e5e005

اما کمی با هم متفاوتن، این تفاوت در چیزی که return میکنن هست. T.let یک مقدار از هر نوعی رو میتونه return کنه ولی T.also صرفا متغییری از نوع T رو return میکنه.

هر دوی این توابع زنجیره‌ای به درد بخور هستن و کاربرد زیادی توی توابع زنجیره‌ای دارن، منتها بایستی که هر کدوم توی توابع زنجیره‌ای به شیوه‌ی درستی مورد استفاده قرار بگیرن. چون در T.let ، متغییر هربار دچار تغییر میشه ولی توی همه‌ی T.also ها از یک this یکسان استفاده میشه، به مثال‌های زیر توجه کنید :

https://gist.github.com/sajjadyousefnia/6ca462ef321b8c2383db10d88fa525cc

اینطور به نظر میرسه که بهتره به جای زنجیری نوشتن T.also همه رو داخل یک تابع بنویسیم، ولی اگه عمیق‌تر فکر کنیم متوجه میشیم که این حالت زنجیری سه مزیت داره :

۱- باعث میشه که بهتر بتونیم یک پروسه رو به قسمت‌های کوچکتر تقسیم کنیم.

۲- باعث میشه که بتونیم قبل از خروجی، داده‌ها رو بهتر مدیریت کنیم و احتمال خطا کاهش پیدا میکنه.

با ترکیب زنجیری متدهای مختلف میتونیم یک تابع قدرتمندتر و در عین حال کوتاه‌تر داشته باشیم. مثل پایینی :

https://gist.github.com/sajjadyousefnia/115c5228b3433904d2d23e7ed01a7567

با استفاده از سه ویژگی‌ای که گفته شد، میشه عملکرد یک تابع اسکوپ رو به خوبی فهمید. در ضمن ویژگی‌های ‌T.apply رو که قبل نگفتم به صورت زیر هست :

۱- یک extension function هست.

۲- این متد، this رو به عنوان آرگومان میفرسته.

۳-این متد this رو return میکنه.

ک میتونیم ازش به صورت زیر استفاده کنیم :

https://gist.github.com/sajjadyousefnia/42aab8f7b39667e8e5e1cf65c15b6ea1

یا میتونیم با استفاده ازش یک تابع رو به شکل زنجیری دربیاریم.

https://gist.github.com/sajjadyousefnia/c313a684bd679b7b235b396fdd02dc00

انتخاب تابع مناسب

کاملا واضحه که با استفاده از این سه ویژگی میتونیم توابع رو به سه دسته تقسیم‌بندی کنیم. و براساس همون درختی که ایجاد کردیم تصمیم بگیریم که کِی و از کدوم یکی استفاده کنیم و کدوم یکی به کار ما میاد.

امیدوارم خوب نوشته باشم، اگه دوست داشتید نظرتون رو بفرمایید.

نوشته آموزش توابع scope در کاتلین : let ، run ، with ، also و apply اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

معرفی کتابخانه XOBJ.JS : کار با اشیا، بدون درد و خون‌ریزی!

اگه تجربه کافی در کار با کتابخونه‌های مختلف داشته‌باشید، حتما با لودَش آشنایید و باهاش کار کردید؛ میشه گفت قوی‌ترین utility libraryـه، و چیزی رو دستش نمیاد.
ولی خب، من سعی کردم یکم رو دستش بیام. چیزی که میخوام بهتون معرفی کنم، یه کتابخونه‌ست که خودم ساختمش (درواقع دارم می‌سازمش)؛ تا حدودی شبیه به لودش هست ولی فقط روی اشیا متمرکز شده؛ و سعی کرده در همین حوزه از لودش جلو بزنه؛ اسمشم هست XOBJ (در واقع X-Object).

نصب کتابخانه

اگه می‌خواید با npm نصبش کنید، این‌طوری:

 

و اگر می‌خواید با

بعد یک فایلی بسازید به نام App.jsx که این فایلی هست که برنامه‌ اصلی رو داخلش می‌نویسید، من فعلا چیز ساده‌ای می‌نویسم، اما شما به دلخواه خودتون می‌تونید پوشه بندی کنید و یک مدل بزرگ‌تری رو خلق کنید:

 

Hello World!

 

); } }

یکم جلوتر دوباره سراغ این فایل میام و یکم بهش چیز میز اضافه می‌کنم اما فعلا بذاریم ساده باشه که یه چیز ساده بتونیم توی مرورگر تماشا کنیم که خیالمون راحت باشه همه چیز داره درست کار می‌کنه.

فقط یه چیز خیلی ساده اضافه کنم، react-helmet، این یکی انقدر ساده هستش که نگو، و فوق العاده بدرد بخور، ازوناست که کلی فواید SEOی داره برامون. درواقع قسمت head هر صفحه رو برامون dynamic میسازه و کلی آپشن داره که میشه ازش به راحتی استفاده کرد، برای نصب این از دستور زیر استفاده کنید:

فعلا فقط این رو نصب کنید، زمانی که دوباره به فایل App.jsx برگشتیم، خودتون متوجه می‌شید که چه کارهای ساده ولی به درد بوخوری میشه باهاش کرد.

— — فایل‌های استایل

داخل فولدر styles یک فایل اصلی بسازید به نام styles.pcss و کنارش یک فولدر بسازید به نام partials و داخلش فایلی اضافه کنید به نام _partial.pcss و محتویات زیر رو در اون کپی کنید:

و

— تنظیمات سرور develop

سرور محیط develop ما express.js خواهد بود، در واقع به این صورت هست که ما یک سری middleware استفاده می‌کنیم که زمانی که تغییراتی در فایل‌های PostCSS یا فایل‌های برنامه ایجاد می‌کنیم، به عبارتی داریم develop می‌کنیم، خودش خود به خود فایل‌های نهایی رو بسازه و ما نتیجه آخرین تغییراتمون رو داخل مرورگر ببینیم.

ابتدا باید پکیج‌های dependency رو نصب کنیم:

بعد در روت پروژه یا همون فولدر react-example پوشه‌ای می‌سازیم به نام express و تنظیمات محیط develop رو برای express درش قرار می‌دیم، برای این کار فایلی بسازید به نام development.js و داخلش اینطوری بنویسید:

— ببینیم چی شد تا الآن

حالا وقتشه یه تست ریز بریم ببینم تا الآن چیکار کردیم، برای اینکه ببینیم همه چیز رو تا الآن درست به کار گرفتیم یا نه دستور زیر رو در محیط کامندیمون اجرا می‌کنیم:

اگر ویندوز دارید و خطای NODE_ENV رو دیدید اصلا نگران نشید به این آدرس یه سر بزنید، اونجا نوشتم که چیکار باید بکنید، اگر خطا نداد که باید توی محیط کامندیتون جمله زیر رو ببینید:

اگر آره که نصف راه رو به سلامت رسیدید و می‌تونید مرورگرتون رو با آدرس http://localhost:3000 باز کنید و از شاهکاری که کاشتید لذت ببرید.


— تنظیمات React Router

تا الآن همه چیز فوق العاده بود. تقریبا کلی چیزای باحال رو کنار هم به درستی گذاشتیم و همه چیز با هم کار کرد. تاکید می‌کنم اگر مشکلی داشتید توی همین مقاله در قسمت کامنت مطرح کنید، دربست در خدمتم.

ولی، این react-router رو فقط نصب کردیم و توی برنامه هنوز نیاوردیمش، اونجا که در مورد فایل App.jsx گفتم که بر میگردم، آهان، الآن وقتشه که برگردیم با هم و اون رو به شکلی یکم کامل‌تر بنویسیم. فایل App.jsx رو با کد‌های زیر دوباره ویرایشش کنید:

 

    • Homepage

 

    • About

 

    • Contact

 

 

); } } class Homepage extends Component { render() { return (

 

Homepage

 

); } } class About extends Component { render() { return (

 

About

 

); } } class Contact extends Component { render() { return (

 

Contact

 

); } } export default class App extends Component { render() { return (

); } }

خوب یه توضیح ریز بدم، ببینید الآن توی این فایل App.jsx جدیدمون سه تا کامپوننت جدید آوردیم به اسم‌های Homepage و About و Contact که در واقع نقش سه صفحه ما رو بازی می‌کنن.

بعدش یه کامپوننتی ساختیم به اسم Menu که اولی همین فایل App.jsx قرارش دادیم و اون رو هم توی هر سه کامپوننت ایمپورت کردیم تا در هر سه صفحه مجزایی که داریم منو هم دیده بشه.

نکته‌ای که وجود داره اینه که دیگه مثل گذشته قرار نیست که کلاس‌های تگ‌ها رو اضافه کنیم. ما دیگه با کلاس شدیم و قراره که با CSS-Modules کار کنیم. در طی روند این مقاله من خیلی ریز تنظیماتش رو وارد کردم و شما فقط نیازه بدونی که توی هر کامپوننتی که مجزاش می‌کنی باید با کد:

استایل‌ها رو مثل یک آبجکت اضافه کنید و توی هر تگ که خواستید کلاس بهش بدید از کد زیر استفاده کنید:

فکر کنم خیلی واضحه دیگه، توی فایل‌های PostCSS با هر اسمی که خواستید کلاس‌هاتون رو بسازید و اینجا به جای اینکه مستقیم اسمش رو صدا بزید اون رو به صورت فرزندی از آبجکت styles صدا بزنید، این کار در نسخه‌ای که برای deploy آماده می‌کنید یا همون نسخه production اسم کلاس‌ها رو در DOM به هش تبدیل می‌کنه و می‌تونید تا حداقل ۵ حرف ببریدش، اینطوری فایل CSS آخری که می‌سازید فوق العاده فشرده شده خواهد بود. حالا بعدا، زمانی که دارم در مورد تنظیمات Webpack در محیط production صحبت می‌کنم بیشتر باهاش آشنا می‌شید.

نکتهء دیگه‌ای که خیلی عاشقشم دوست خوبم Helmet هست که به وضوح توی کد‌ها دیده میشه، در هر کامپوننت به صورت مجزا وجود داره، در کامپوننت root یا اصلی یا همون App کامپوننت هم دیده میشه که تنظیمات کلی‌ای رو داره اجرا می‌کنه. انقدر این تنظیمات ساده و خوانا هست که من اینجا از توضیحش صرف نظر می‌کنم.

حالا برای اینکه دوباره ببینم چیکاره هستیم یکبار دیگه دستور اجرا رو برای develop اجرا می‌کنیم:

به نظر معجزه میاد، آره، شما تونستید یه اسکلت عالی از یک برنامه پایه بر React بسازید که همه چیز‌های عالی رو داره. هر صفحه رو که با فشار منو صدا می‌زنید از سمت سرور داره پویش یا همون render میشه و کاملا هم سمت مرورگر شما dynamic هست. ولی به نظر شما کار ما تمام شده؟

هم آره هم نه، آره: چون ما محیط develop عالی‌ای رو درست کردیم و نه: چون هنوز نمی‌دونیم چطور باید اون رو برای deploy روی سرور آماده کنیم.

— آماده سازی برای اعزام به محیط عملیاتی

تا الآن هر کار کردیم، برای این بوده که محیط develop خوبی رو داشته باشیم، ولی از الآن به بعد دیگه قراره که تنظیمات متفاوتی برای production قرار بدیم که سه هدف اصلی رو حتما باید در نظر بگیریم:

  1. باندل کردن کل فایل‌های برنامه و فشرده سازی و از بین بردن debuggerها و console.logها و تبدیل به نسخه ES5.1
  2. استخراج فایل styles.css در یک فایل جدا و فشرده سازی و پاک کردن همه کامنت‌ها
  3. ساختن فایل stats.json که درواقع عواملی Webpackی که برای محیط عملیاتی در سرور برای express نیاز هست رو توش نگه می‌داریم و اون‌هایی که برای محیط develop بوده رو دیگه نمی‌خواهیم.

پیش به سوی تنظیمات برای محیط عملیاتی، کد‌های زیر را اجرا می‌کنیم:

خوب حالا باید توی فولدر webpack یک فایل دیگه به نام webpack.production.config.js بسازید و داخلش رو با کد‌های زیر پر کنید:

و همینطور در فولدر ‌express یک فایل به نام production.js برای محیط production بسازید و کد‌های زیر رو داخلش کپی کنید:

الآن دیگه باید بتونید با دستور زیر فایل‌هایی رو بسازید که قراره برای محیط عملیاتی به سرور اعزام بشه:

مشاهده می‌کنید که فایل‌هایی در فولدر dist ساخته شده و اگر دستور زیر رو در محیط کامندیتون اجرا کنید، شما درواقع محیط عملیاتی رو شبیه سازی کردید. یجورایی چیز نهایی که مردم می‌بینند در واقع همینه:

اگر الآن روی مرورگر Google Chrome دو افزونه React Developer Tools و Wappalyzer رو داشته باشید می‌بینید که علامت React روش ظاهر شده و مخصوصا افزونه React Developer Tools آبی شده و دیگه قرمز نیست. چون قرمز برای محیط دولوپ هست و آبی یعنی شما نسخه مخصوص production رو بردی روی سرور.

جدا تبریک می‌گم. شما فوق العاده‌ای، چون روند این مقاله در عین اینکه ساده‌ترین شکل رو داشته ولی جزو طولانی‌ترین‌ها و پیچیده‌ترین‌ها بوده. وقتی تا اینجا اومدی جلو یعنی شما بهترینی، مدتی هم میگذره تا شما با معجزه‌ای که کردی بیشتر آشنا بشی و اون رو custom خودتون کنید. مثلا eslint بیارید، از Redux استفاده کنید، از Redux-Saga استفاده کنید، تست، مثل Jest رو اضافه کنید و خیلی چیز‌های باحال دیگه.

— اجرا روی سرور واقعی

زمانی که همه کارهای بالا رو انجام دادید باید به نفر DevOps تون بگید که روی سرور به pm2 نیاز دارید. چون برنامه‌های خفن Reactی که کاربرهای زیادی داره رو با دستور بالا روی سرور اصلی اجرا نمی‌کنن، برای این کار باید روی سرور اصلی‌تون دستور زیر رو اجرا کنید:

و برای اجرا:

البته بگما، این کار رو روی کامپیوتری که تا الآن هم استفاده کردید می‌تونید استفاده کنید، هیچ اشکالی نداره، ببینین که چه شکلیه! ولی این خروجی و نمایشتون روی مرورگر اصلا با

فرقی نداره، تفاوت‌هاش رو نفر DevOps میدونه که قراره مدیریت کش و لودبالانس و اینا اضافه کنه. اگر دوست داشتید می‌تونید که داک pm2 رو بخونید.

— اختتام

برای راحتی کار دولوپ، من دستوراتی رو در قسمت scripts در فایل package.json گذاشتم که می‌تونید از آدرس گیت‌هاب که در بالای صفحه گذاشتم استفاده کنید یا همین زیر هم براتون می‌نویسم:

یه توصیه آخر هم از من داشته باشید، درسته که تا الآن داشتیم با npm کار می‌کردیم و الآن با تنظیم بالا مثلا برای شروع develop از دستور npm run dev استفاده می‌کنید ولی سرعت npm خیلی کم هست و زمانی که شما در فایل‌هاتون تغییرات ایجاد می‌کنید تقریبا ۲۷ الی ۳۰ ثانیه طول می‌کشه که براتون سازه جدید رو بسازه و با Hard Reload تغییرات رو ببینید. برای همین من توصیه می‌کنم که yarn رو نصب کنید و با دستور yarn dev شروع به develop کنید، باورتون نمیشه سازه رو در زیر ۵۰۰ میلی ثانیه میسازه.

امیدوارم که تونسته باشم کمکتون کنم، همیشه موفق و شاد باشید.

نوشته مثال کاملی از پیاده سازی یک برنامه وبی پایه بر React اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

فیلتر ها در جاوا اسکریپت

سلام، تو اولین نوشته ی خودم در ویرگول میرم سراغ فیلترها در جاوا اسکریپت
تو این مقاله با استفاده از مثال نحوه عملکرد سیستم آموزشی دانشگاه با فیلترها به خوبی آشنا میشیم.
متد ()filter در مقایسه با متد های ()map و reduce خیلی ساده تر و با مسمی تره :))

شما یک ارایه رو به عنوان ورود به این متد میدین و خروجی رو با یک فانکشن و شرطتون مشخص میکنید و در یک آرایه جدید تحویل میگیرین 🙂

این بنظر خیلی ساده میرسه، اما من عادت دارم ساختار به طور کامل بفهمم تا بتونم راحتر با قضیه کنار بیام پس بیاین باهم بیشتر بریم تو فیلتر!!!

متد ()Filter به صورت true و false بررسی میکنه و خروجی در قالب یک آرایه جدید هست.

من متوجه شدم که فانکشن فیلتر یه چیزی تو مایه های سیستم پذیرش دانشکده هاست. این سیستم طبق معیار هایی که داره در انتخاب دانشجو ها تصمیم گیری میکنه و اونارو پذیرش میکنه. من از صمیم قلب آرزو میکنم که سیستم ورود دانشکده منعطف تر باشه و این پیچیدگی های گاها الکی و بی مورد حذف بشه، اما از بحث دور نشیم. بیشتر معیار ها در پذیرش نمره های دانشجو ها هست. به عکس زیر دقت کنید:

نحوه ورود دانش آموزان به دانشکده و عملکرد متد فیلتر

استفاده از For Loop برای فیلتر کردن فانکشن

بسیار خب، ما الان میخوایم یه ارایه از ۴ دانش آموز رو درست کنیم با اسم و نمره شون. در یکی از دانشکده ها دانش آموز هایی که نمره شون ۳٫۲ و بالاتر باشه رو پذیرش میکنن پس باید همچین چیزی داشته باشیم:

تو کد بالا میبینید که بعد از تعریف ارایه دانش آموزان من با استفاده از حلقه ()for با استفاده شرطی که گذاشتم دانش آموز هارو فیلتر کردم. اما این یه راهیه که خودمونو اذیت کردیم با اینکه جواب داد و خروجی درسته اما تو ادامه به جای حلقه از متد فیلتر استفاده میکنیم و مزایاشو هم باهم چک میکنیم.

استفاده از متد ()Filter

بیاین باهم همون هدفی که بالا داشتیم رو با استفاده از متد فیلتر پیاده کنیم.

۱- فیلتر یک متد آرایه ای هست، خب ماهم با آرایه ای از دانش آموز ها شروع میکنیم
۲- از یک فانکشن بازگشتی (callback function) استفاده میکنه برای اجرای هر المنت در آرایه.
۳- در نهایت هم خروجی که کدوم المنت ها در خروجی هستند رو به صورت آرایه برگشت میده.

اما کد:

همونطور که میبینین ورود ها و خروجی های ما یکسان هستند، اما تفاوت ها تو اینجا چی هست؟

۱- ما احتیاج نداریم که از قبل آرایه ی با اسم admitted رو تعریف کنیم و بعدا اون رو مقدار دهی کنیم. ما همونجا تعریفش کردم و مستقیم مشخص کردیم که با چه دیتایی قراره پرشه.
۲- ما از یک شرطی استفاده کردیم و در نهایت وضعیت رو برگشت دادیم ( به قول فرنگیا return statement)
۳- الان دیگه ما میتونیم از student برای هر المنتی استفاده کنیم، اگه یادتون باشه قبلا students[i] رو تو for loop استفاده میکردیم.

شاید الان بگین که یه چیزی اینجا میزون نیست، پذیرش در دانشگاه در مرحله آخره اما تو کد های ما متغییر admitted در اول قرار گرفته. شاید شما انتظار داشته باشین که آرایه نهایی رو داخل فانکشن ببینین اما ما اینجا از return برای مشخص کردن خروجی های استفاده کردیم

مثال ۲ – استفاده از دو شرط داخل متد فیلتر

تا حالا، ما فقط از یک شرط تو متد فیلترمون استفاده میکردیم. اما همیشه که زندگی اینقد راحت نیست و ممکنه برای چک کردن شروط دیگه هم لازم باشه +۱۰ تا فاکتور رو چک کنیم.

اما در حال حاضر شما به دوتا فاکتور رضایت بدین علاوه بر نمره کل مثلا نمره مهارت های فنی هم با چک کنیم. دانش آموز باید نمره بالای ۳٫۲ و مهارت بالای امتیاز ۱۹۰۰ داشته باشه. همون دستورات بالا رو به شکل زیر اصلاح میکنیم:

خیلی آشنا بنظر میاد نه؟ الان ما دوتا شرط داریم که خروجی هارو مشخص میکنه. اما بیاین یکم بیشتر روش کار کنیم، اگه قسمت فیلتر بالا رو به شکل زیر بنویسم چه اتفاقی میفته؟ به کد زیر دقت کنید:

 

اگه از کد بالا خروجی بگیرین متوجه یه تفاوت دیگه میشین که خیلی مهمه !! که تفات این متد با حلقه for رو مشخص میکنه. اگه شما متغییر goodStudent رو چک کنید متوجه میشد که خروجی true و false هست و نوع بازگشتی boolean هست.

پس در واقع اون true و false تصمیم میگیرند که تو آرایه ای که بازگشت داده میشه کدوم مقادیر قرار بگیرند.

در نهایت امیدوارم که این مطلب براتون مفید واقع شده باشه، شما تجربه استفاده از این متد رو داشتین؟ خوشحال میشم نظراتتون رو زیر این پست ببینم و باهم بیشتر صحبت و تبادل نظر کنیم 🙂

نوشته فیلتر ها در جاوا اسکریپت اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

بازار کار زبان‌های مختلف برنامه نویسی در ایران و جهان

یکی از چالش‌هایی که در زمان شروع یادگیری برنامه نویسی پیش می‌آید انتخاب زبان برنامه نویسی مناسب است. زبان‌های برنامه نویسی متفاوتی با ویژگی‌های مختلف برای کاربردهای متفاوت وجود دارند، طبیعی است که در بدو ورود به این مسیر احساس سردرگمی و کلافگی پیدا کنید. اولین سوالی که از خود می‌پرسید این است که کدام زبان برنامه نویسی بازار کار بهتری دارد؟ پاسخ به این سوال ساده نیست!قبل از انتخاب زبان برنامه نویسی باید بدانید چه می‌خواهید؟ به دنبال چه چیزی هستید؟ تنها با آگاهی پیدا کردن از مقصد است که می‌توانید از انتخاب راه، اطمینان خاطر پیدا کنید.

فرض کنید یک ایده در ذهن‌تان شکل می‌گیرد و تصمیم می گیرید  یک وبسایت ایجاد کنید، سریع صفحه موتور جستجوگر گوگل را باز می‌کنید و عبارت “زبان‌های برنامه نویسی وب” را تایپ می‌کنید.در کمال تعجب خواهید دید که منابع مختلف، زبان‌های برنامه نویسی متفاوتی را برای ایجاد یک وبسایت پیشنهاد کردند و هر کدام نیز در مورد شرایط بازار کار این زبان‌ها نظرات کاملاً متفاوتی ارائه کرده‌اند.

در این نوشته سعی می‌کنیم اطلاعات مفیدی بر اساس نظرسنجی‌های اخیر انجام شده در مورد بازار کار زبان‌های مختلف برنامه نویسی ارائه کنیم تا با دانش بهتری بتوانید وارد مسیر یادگیری برنامه نویسی شوید.

بازار کار زبان‌های مختلف برنامه نویسی در ایران

بر اساس نظرسنجی که توسط جادی در سال گذشته بین ۲۰۰۰ برنامه نویس ایرانی انجام شد، آمار جالبی در رابطه با کار برنامه نویسی به دست آمده که در اینجا ما به چند نتیجه مهم آن اشاره می‌کنیم.

نتایج اولیه نظر سنجی بزرگ وضعیت کار و زندگی برنامه نویسان و مدیر سیستم‌های ایران در سال ۱۳۹۶ به همراه داده‌های خام

نوع توسعه دهندگان

  • ۴۶٪ توسعه‌دهنده بک اند و ۳۳٪ توسعه‌دهنده فول استک هستند. ۲۸٪ هم توسعه دهنده موبایل و ۲۵٪ توسعه دهنده فرانت اند.

پر کاربردترین زبان‌های برنامه‌نویسی

  • پر کاربردترین زبان‌های برنامه‌نویسی‌ جاوااسکریپت با نزدیک ۵۰٪ است و بعد از آن SQL و PHP و پایتون با اختلاف کمی از یکدیگر قراردارند. جاوا با ۳۳٪ رتبه پنجم است و رتبه‌های بعدی مربوط به خانواده‌های سی (شامل سی شارپ) است. پایینترها، سوییفت و Go و متلب همه با ۴٪ نزدیک به هم هستند.
  • بیشتر از ۴۲٪ گفته‌اند علاقه‌مند هستند پایتون را شروع کنند و رتبه بعدی «علاقه‌مندی به کار با زبان بعدی» مربوط به گو (۲۶٪) است و پس از آن جاوا و بعد سوییفت و جاوااسکریپت.

 

بازار کار زبان‌های مختلف برنامه نویسی در خارج از ایران

StackOverflow (وبسایت پرسش و پاسخ برنامه نویسان) نیز هر سال نظرسنجی بین برنامه نویسان انجام می‌دهد. بر اساس نظرسنجی که استک اور فلو درسال ۲۰۱۸ بین ۱۰۰۰۰۰ برنامه نویس انجام داده آمار جالبی به دست آمده که به موارد مهم آن اشاره می کنیم.

مشاهده نظرسنجی استک او فلو

نوع توسعه دهندگان

  • تقریباً ۶۰ درصد برنامه نویسان خود را توسعه دهنده بک‌-اند(back-end developer) معرفی کرده‌اند.
  • ۲۰ درصد خود را توسعه دهنده موبایل معرفی کرده‌اند.
  • مابقی هم توسعه دهنده فرانت-اند، فول استک، مدیر دیتابیس،طراح و … بودند.

پر کاربردترین زبان‌های برنامه‌نویسی

جالب است بدانید که در ۶ سال متوالی زبان جاوا اسکریپت  پر‌کاربردترین زبان برنامه نویسی شناخته شده است! همچنین بر اساس نتیجه نظرسنجی و مقایسه آن با سال‌های قبل، نشان داده شده که زبان پایتون در سال اخیر در حال پیشرفت  است.

دوست داشتنی‌ترین زبان‌های برنامه نویسی

زبان  Rust برای سه سال متوالی از محبوب‌ترین زبان‌های برنامه نویسی بوده است. زبان محبوب بعدی kotlin هست و جالب است که این اولین سالی بوده که این زبان در لیست نظرسنجی قرار می گرفته است. این نشان می‌دهد که میزان استقبال از این زبان جدید بالا بوده است.

ترسناک‌ترین زبان‌های برنامه نویسی

همچنین برای سومین سال متوالی زبان ویژوال بیسیک ۶ به عنوان ترسناک‌ترین زبان شناخته شد!

محبوب‌ترین زبان‌هایی که اکثر افراد تمایل داشتند یاد بگیرند؟

زبان پایتون در صدر این لیست قرار داشت و بعد از آن جاوا اسکریپت،گو، کاتلین و تایپ اسکریپت بود.

پر درآمدترین زبان‌های برنامه نویسی دنیا

بررسی نتایج

شباهت‌هایی بین آمار نظرسنجی برنامه نویسان ایرانی با آمار استک اور فلو وجود داشت.

  • از هر دو این نظرسنجی می‌توان نتیجه گرفت که زبان‌ برنامه نویسی جاوا اسکریپت پر کاربردترین زبان برنامه نویسی چه در ایران و چه در خارج است.
  • در هر دو نظر سنجی متوجه شدیم که زبان پایتون در حال پیشرفت است و افراد زیادی علاقه مند به یادگیری این زبان هستند.
  • همچنین علاوه بر زبان پایتون، افراد زیادی تمایل داشتند زبان‌های گو و کاتلین را نیز یاد بگیرند.
  • درصد بیشتری از برنامه نویسان به صورت توسعه دهنده بک-اند کار می‌کنند.

تفاوت فاحشی که در این دو نظرسنجی وجود داشت اختلاف میزان کسب درآمد از زبان‌های مختلف بود. اساس آمار به دست آمده از وبسایت irantalent گزارشی در مورد حقوق و دستمزد متخصصان ایرانی انتشار دادیم. با مطالعه این گزارش می‌توانید از میزان دریافتی‌های رایج شرکت‌های کوچک و بزرگ در بازار کار برنامه نویسی ایران آگاهی پیدا کنید.

در ادامه پیشنهاد می‌کنیم برای مشاهده بازار کار زبان‌های برنامه نویسی در ایران به سایت‌های کاریابی مثل جابینجا سر بزنید و بررسی کنید که فرصت‌های کاری مختلف برای زبان‌های برنامه نویسی مختلف به چه صورت هستند و نیاز بازار در حال حاضر چیست. از طریق این وبسایت می‌توانید موقعیت‌های شغلی برنامه نویسی (دورکاری،تمام وقت،پاره وقت،…) را در تمام شهرهای ایران جستجو کنید. با بررسی تعدد آگهی‌های کار برای یک تخصص به نسبت جمعیت یک شهر/کشور، میتوانید حدس بزنید که بازار کار آن تخصص چطور هست.

همچنین برای ارزیابی بازار کار برنامه نویسی در خارج از ایران می‌توانید فرصت‌های شغلی برنامه نویسی را از سایت  indeed یا glassdoor ببینید. این دو وبسایت از بزرگترین مراجع کاریابی آنلاین در سراسر جهان هستند. جالب است بدانید که شرکت‌های بزرگ دنیا مثل اپل ،گوگل، Uber نیز  برای جذب نیرو از این وبسایت‌های کاریابی استفاده می‌کنند. امکان خوبی که glassdoor دارد این است که از طریق این لینک می‌توانید بررسی کنید فردی با یک سمت برنامه نویسی خاص در یک کشور دیگر چه میزان حقوق دریافت می‌کند. مثلاً می‌توانید از طریق جستجو در این سایت، متوسط میزان حقوق دریافتی یک توسعه دهنده فرانت اند در المان را مشاهده کنید!

منابع آموزشی جهت یادگیری زبان‌های برنامه نویسی

حال که با وضعیت زبان‌های مختلف برنامه نویسی در ایران و خارج از ایران آشنا شدیم ببینیم چطور می‌توانیم یادگیری زبان برنامه نویسی را شروع کنیم؟ چه منابع آموزشی مناسب هستند؟

راه‌های مختلفی برای یادگیری زبان برنامه نویسی وجود دارد که شما می‌توانید یکی از این روش‌ها را انتخاب کنید.

  • مشاهده ویدئو آموزشی
  • مطالعه کتاب تخصصی برنامه نویسی
  • دوره‌های حضوری یادگیری برنامه نویسی
  • دوره‌های مجازی یادگیری برنامه نویسی

انتخاب روش یادگیری برنامه نویسی بر عهده خود شماست. برای یادگیری برنامه نویسی شیوه ای را انتخاب کنید که فکر می‌کنید برای شما مناسب‌تر است. ممکن است حس کنید با حضور فیزیکی در کلاس اثربخشی بیشتری دارید، در این صورت بهتر است یک آموزشگاه مناسب در شهرتان پیدا کنید و آنجا ثبت نام کنید. همچنین اگر فکر می‌کنید با مشاهده دوره‌های آنلاین راحت‌تر هستید، ما لیستی از منابع انلاین آموزشی را در ادامه به شما معرفی می‌کنیم.

در همین رابطه توصیه می‌کنیم مطلب مفید زیر را نیز مطالعه کنید:

چگونه برنامه نویس شویم؟

دوره‌های آنلاین یادگیری برنامه نویسی

دوره‌های آنلاین زیاد فارسی یا انگلیسی برای یادگیری زبان برنامه نویسی دلخواه شما وجود دارند. ما در اینجا چند مورد منابع یادگیری فارسی و انگلیسی را به شما معرفی می‌کنیم.

دوره‌های آنلاین آموزش:

وبسایت انگلیسی Code Academy
وبسایت انگلیسی coursera
وبسایت انگلیسی udemy
وبسایت انگلیسی tutorialspoint
وبسایت w3schools
وبسایت انگلیسی udacity
وبسایت فارسی فرانش
وبسایت فارسی فرادرس
وبسایت فارسی مکتب خونه
وبسایت فارسی کد فرند
وبسایت فارسی سکان آکادمی

همچنین پیشنهاد می‌کنیم حتماً به این لینک در گیت‌هاب سر بزنید و نقشه راه یادگیری زبان‌های برنامه نویسی را مشاهده کنید. این نقشه راه، شما را در مسیرِ درستِ یادگیریِ برنامه نویسی هدایت می‌کند و چشم انداز کلی کار را به شما نشان می‌دهد.

نقشه راه برنامه نویسی

ورود به بازار کار برنامه نویسی

پس از یادگیری برنامه نویسی، نیاز به انجام پروژه‌های عملی و کسب تجربه برای ورود به بازار کار دارید. در این مرحله لازم است پروژه های واقعی را با مهارت‌هایی که کسب کردید انجام دهید و عیار خودتان را محک بزنید! انجام پروژه واقعی کمک می‌کند در زمینه برنامه نویسی تجربه و تخصص خوبی به طور عملی به دست آورید؛همچنین با داشتن نمونه کار، فرصت‌های بیشتری برای پیدا کردن شغل در شرکت های معتبر خواهید داشت. برای ورود به بازار کار و انجام پروژه‌های عملی، وبسایت‌های برونسپاری پروژه نقطه شروع بسیار خوبی هستند.

می‌توانید در وبسایت‌های برونسپاری پروژه مثل پارسکدرز به عنوان فریلنسر ثبت نام کنید و برای پروژه‌های متناسب با مهارت‌های خودتان درخواست همکاری دهید. خوشبختانه در وبسایت‌های برونسپاری، پروژه‌های مختلف از سطح مبتدی تا حرفه‌ای موجود هستند و می‌توانید با توجه به سطح خود برای ورود به بازار کار از این طریق اقدام کنید.

همچنین توجه داشته باشید که یکی از بهترین زمان‌ها برای شروع یادگیری برنامه‌نویسی و آمادگی برای ورود به بازار کار دوران دانشجویی است. بزرگ‌ترین سرمایه‌ای که به عنوان یک فریلنسر خواهید داشت اعتبار و تجربه است، همین تجربه پس از دوران دانشجویی راه موفقیت در مسیر کاری برنامه نویسی را برای شما هموار خواهد کرد. مزیتی که در این دوران وجود دارد اشتیاق بیشتر، زمان آزاد بیشتر و توقعات مالی کمتر است. این موضوع کمک می کند تا در آغاز کار بتوانید با هدف کسب تجربه و جلب اعتماد، پیشنهاداتی را هر چند با هزینه ناچیز بپذیرید.

در آینده نه چندان دور، همین تجربیات منجر به توصیه شدن شما به دیگران خواهند شد. اعتماد سازی باعث می‌شود کارفرماها شما را به دیگران نیز معرفی کنند و رفته رفته به انجام پروژه های بزرگ برسید. اطمینان داشته باشید که کسب تجربه، در آینده نزدیک شما را ثروتمند خواهد کرد!

 

نوشته بازار کار زبان‌های مختلف برنامه نویسی در ایران و جهان اولین بار در وبلاگ پارسکدرز پدیدار شد.

گردآوری توسط ایده طلایی

کارگاه برنامه نویسی جاوا(۱)

مشخصات رویداد:

تهرانپنج‌شنبه ۱۴ تیراز ۴۲۴,۰۰۰ تومان

ثبت نام

نوشته کارگاه برنامه نویسی جاوا(۱) اولین بار در ایوند پدیدار شد.

گردآوری توسط ایده طلایی