داستان Null در دارت(دادگاه رسیدگی به اتهامات دارت-2)

خب همون طور که توی قسمت قبلی دیدیم Dart از جلسه اول دادگاه سربلند بیرون اومد و تونست به خوبی از خودش دفاع کنه و چیزای زیادی در مورد Scope ها مختلفی که variable ها میتونن داخلش تعریف و استفاده بشن و همچنین نحوه ی تعامل با nullable variable ها و non-nullable variable ها و final variable ها در Scope های مختلف و کاربرد دقیق کلمه کلیدی late بهمون یاد داد.

اگه داستان قبلی رو نخوندی حتمن از این لینک بخونش و بعد بیا سراغ داستان جلسه دوم دادگاه.برای اطلاع از کل قسمت های مجموعه داستان Null در دارت هم این لینک رو ببین.

بریم سراغ جلسه دوم دادگاه...

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

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

خب دیگه وقتشه که دفاعیات Dart رو بشنویم.شما رو با قاضی دادگاه و جناب Dart تنها میگذارم و آخر داستان برای خدافظی برمیگردم.???

قاضی دادگاه : لطفن جناب Dart به جایگاه تشریف بیارن و پاسخگوی دومین بند از اتهامات وارده باشن.

جناب Dart : بنده کمی کسالت دارم و سرما خورده ام اگه امکانش هست در این جلسه وکیلم صحبت میکنن.

قاضی دادگاه : مشکلی نیست, از وکیل جناب Dart درخواست میشود به جایگاه تشریف بیارن.

وکیل :‌ با سلام خدمت همه. بدون مقدمه بحث اصلی رو شروع میکنم.

قبل از null safety آرگومان های ورودی یک function یا constructor میتونستن سه حالت مختلف داشته باشن :

  • Required positional arguments
  • Optional positional arguments
  • Optional non-Positional arguments (or named arguments)

ولی بنظر میرسید که این حالت ها یک جای خالی دارن.

تصویر بالا رو نگاه کنید.

  • نوع Positional args دو حالت اختیاری(Optional) یا اجباری (Required) رو شامل میشن.
  • ولی نوع Named args فقط حالت اختیاری(Optional) رو پشتیبانی میکنن.

بنابراین موکل بنده یک کلمه کلیدی جدید رو به خودش اضافه کرد که این کلمه required نام داره و برای پر کردن این جای خالی هست.

بنابراین در حال حاضر انواع محتلف آرگومان های ورودی یه function به چهار حالت تقسیم میشن.

  • Required positional arguments
  • Optional positional arguments
  • Optional named arguments
  • Required named arguments

یا به عبارت دیگه :‌

نوع Positional :

این نوع با Position اشون شناخته میشن و رعایت تناظر بین Position تعریف و مقداردهیشون مهمه.یعنی با همون ترتیبی که موقع تعریف function تعریف شدن موقع call کردن function هم باید بهشون مقدار بدیم.

این نوع به دو دسته ی Required و Optional تقسیم میشن که برای تعریف نوع Optional باید اون ها رو داخل [ ] قرار بدیم .

اما نکاتی که برای این نوع از آرگومان ها باید بدونیم :‌

  • نوع Required رو همیشه باید ابتدای لیست آرگومان های function بگذاریم و آخر لیست Optional ها رو قرار بدیم (داخل [ ]). پس اول همه Required ها و بعد Optional ها .
  • موقع call کردن function باید به همون ترتیبی که آرگومان ها رو تعریف کردیم بهشون مقدار بدیم و میتونیم برای Optional ها که داخل [ ] هیچ مقداری ارسال نکنیم.

هر سه حالت بالا برای call کردن این function صحیح هست.برای آرگومان اول و دوم چون که Required هستن حتمن باید مقدار ارسال بشه ولی برای سومی و چهارمی چون که Optional هستن میتونیم مقداری ارسال نکنیم.

  • نوع Required هم میتونن به صورت nullable باشن و هم non-nullable و اگه از نوع nullable باشن موقع call کردن function میتونیم مقدار null رو هم بهشون بدیم.

توی کد بالا اولی nullable و دومی non-nullable هست.

  • نوع Optional چون که احتمال داره براشون مقداری ارسال نشه یا باید nullable باشن که در صورت ارسال نشدن مقدار, null رو بگیرن و یا اینکه باید یه مقدار Default براشون تنظیم بشه که در صورت ارسال نشدن مقدار, اون مقدار Default رو بگیرن.

توی کد بالا اولی non-nullable هست ولی مقدار پیش فرض داره و درصورتی که هیچی براش ارسال نشه مقدار پیش فرض رو میگیره ولی دومی nullable هست و در صورت ارسال نشدن هیچ مقداری , null رو میگیره.

ولی حالت زیر غلطه:

پس Optional ها یا باید nullable باشن یا مقدار Default داشته باشن یا هر دو باهم.


نوع Named :

این نوع از آرگومان ها با اسمشون شناخته میشن و موقع call کردن function باید با اسمشون بهشون مقدار بدیم و ترتیب اون ها مهم نیست.

و اما نکات این نوع :

  • این آرگومان ها رو داخل { } قرار میدیم.
  • موقع call کردن function باید با اسمشون بهشون مقدار بدیم و ترتیب مهم نیست.
  • اگه همزمان توی function نوع Positional هم داشتیم حتمن باید اول اون ها رو بیاریم و بعد از همه Positional ها این ها رو قرار بدیم.

به صورت زیر غلطه :‌

  • همزمان نمیتونیم توی یه function نوع Named و نوع Optional positional رو با هم داشته باشیم.
  • این نوع خودشون به دو دسته Optional و Required تقسیم میشن.
  • حالت معمولی اون ها حالت Optional هست و در این حالت موقع call کردن function میتونیم هیچ مقداری واسشون ارسال نکنیم.

چون در این حالت احتمال داره که هیچ مقداری براشون ارسال نشه پس یا باید nullable باشن که در صورت ارسال نشدن هیچ مقداری, null رو بگیرن و یا باید براشون مقدار پیش فرض تعریف کنیم.

کد بالا دو تا Named arg رو نشون میده که هر دو اختیاری هستن و اولی nullable هست و در صورتی که هیچ مقداری براش ارسال نشده null رو میگیره و دومی non-nullable هست ولی مقدار Default داره و درصورتی که هیچ مقداری براش ارسال نشه مقدار Default رو میگیره.

مثال زیر هم حالات مختلف call کردن این function رو نشون میده که همگی درست هستن.

ولی حالت زیر غلطه :‌

یعنی وقتی که آرگومان non-nullable هست نمیتونه همزمان Optional هم باشه و براش هیچ مقدار پیش فرضی تعریف نشده باشه.چون که ممکنه موقع call شدن هرچ مقداری براش ارسال نشه.

پس Named arg هایی که از نوع Optional هستن یا باید nullable باشن و یا واسشون مقدار Default تعریف بشه.

  • حالت دیگه Named arg ها حالت Required یا اجباری هست که در این حالت موقع call کردن function باید حتمن حتمن براشون مقدار تعیین کنیم.

برای این مورد قبل از اسم و نوع آرگومان از کلمه کلیدی required که به تازگی به موکلم اضافه شده استفاده میکنیم.

در این حالت همون طور که میبینید آرگومان هم میتونه از نوع nullable باشه و هم از نوع non-nullable.

توی این حالت موقع call کردن function حتمن حتمن باید برای آرگومان مقدار تعیین کنیم.

حتا اگه آرگومان nullable هم باشه چون که required شده باید براش مقدار تعیین بشه.

توی کد بالا برای اولی که nullable هست مقدار ندادیم ولی خطا داریم.

پس تنها حالت صحیح call کردن این function این هست که برای هر دو مقدار تعیین کنیم.

ولی چون اولی nullable هست میتونیم مقدار null رو هم بهش پاس بدیم.

همچنین توی این حالت نمیتونیم برای ارگومان مورد نظر مقدار پیش فرض تعریف کنیم.


وکیل : عرایض بنده تمام شد اگر سوالی دارید در خدمتم.

قاضی دادگاه :‌ متشکرم.برای مشورت و صدور رای نهایی 45 دقیقه تنفس اعلام میکنیم.

45 دقیقه بعد ...

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

همه اتهامات نام برده از جناب Dart رد شده و به این صورت ایشان از حصر آزاد میشوند و همچنین به دلیل اتهامات بی موردی که میرزا قلی نسبت به جناب Dart روا داشتن و باعث شورش برنامه نویس ها و آشوب و نا امنی و خسارت به اموال عمومی شد, میرزا قلی به مدت 10 سال به جزیره گامبولوها تبعید میشوند و باید در این مدت Dart را به طور کامل و از زیر صفر تا بالای 100 به مردم این جزیره تدریس نماید.


من برگشتم???

خب Dart که بی گناهیش اثبات شد. میرزا قلی هم به جزیره گامبولوها تبعید شد.

وای به حال میرزا قلی و وای به حال تره گامبولوها.???


قسمت های بعدی رو از دست ندین که قراره کلی چیز جذاب تر یاد بگیرم.

فعلن...