داستان Null در دارت (نال فرزند ناخلف)
توی قسمت قبلی دیدیم که قبل از null safety همه کلاس های Dart فرزند کلاس Object بودن (که البته این موضوع به قبل و بعد null safety ربطی نداره و همچنان صادقه) همچنین دیدیم که یه کلاس به اسم Null داریم که این کلاس فرزند همه کلاس های دیگه هست و تنها نمونه ای هم که از این کلاس میتونیم داشته باشیم کلمه کلیدی و رزرو شده ی null هستش و به خاطر همین موضوع که کلاس Null فرزند همه کلاس های دیگه محسوب میشد میتونستیم مقدار null رو به هر variable ای با هر type ای بدیم.
ولی داستان به همین خوبی پیش نمیرفت و این آقا یا خانم Null مشکلات زیادی رو درست میکرد. هر روز دعوا ها و مشاجره های زیادی به خاطر این آقا بین برنامه نویس ها و Dart و کلاس ها شکل میگرفت.
بیاین داستان یکی از این مشاجره ها رو با هم بخونیم....
از قرار معلوم میرزا قلی یه برنامه نویس فلاتر بود که قرار بود یه اپ ساده بزنه. این اپ یه User داشت و هر user یه سری friend داشت و میرزا قلی باید مشخصات کاربر به همراه تعداد دوستاشو توی یه صفحه ساده نمایش میداد.
میرزا قلی برای مدل سازی کاربر هاش توی اپش کلاس ساده زیر رو در نظر گرفت :
از اونجایی که میرزا قلی قرار بود که اطلاعات کاربر رو از سرور دریافت کنه با دوستش غضنفر که برنامه نویس بک اند بود همکاری میکرد و غضنفر گفت که من بهت یه API میدم که اطلاعات کاربر رو بهت میده. خروجی اون API یه JSON به شکل زیر بود :
میرزا قلی هم اومد و باتوجه به این JSON یه json serialization برای کلاسش نوشت:
میبینید که میرزا قلی یه factory به اسم fromJson به کلاسش اضافه کرد که JSON دریافتی از غضنفر رو به کلاس Dart تبدیل کنه و یه متد toJson هم برای تبدیل کلاسش به JSON نوشت.
تا این جای داستان همه چیز به خوبی و خوشی پیش میرفت و همه خوشحال بودن تا اینکه یهو سر و کله ی حاجی نصرت پیدا شد (حاجی نصرت صاب کار این دو تا بود) , حاجی خیلی عصبانی بود و میگفت چنتا کاربرا وقتی اپ رو باز میکنن اپ میپره بیرون و شما دو تا بی عرضه نتونستین یه اپ درست بدین دست من.
میرزا قلی تقصیر رو مینداخت گردن غضنفر و میگفت این چیزا به من ربطی نداره و مربوط به سرور میشه و غضنفر هم میگفت به من چه آقاااااااا اپ داره سوتی میده و میپره بیرون , تو میگی مربوط به سروره ؟؟؟!!!
خلاصه آخرش میرزا قلی قبول کرد که بشینه و بررسی کنه و بعد از بررسی های شبانه روزی به این نتیجه رسید که غضنفر بعضی مواقع به جای لیست دوستان واسش null میفرسته. یعنی به جای اینکه اطلاعات رو این شکلی بفرسته :
این شکلی میفرسته :
میرزا قلی هم که میخواست روی این لیست عملیات انجام بده و نمیدونست که این لیست بعضی مواقع null ارسال میشه, هیچ چکی انجام نداده بود و یه همچین خطایی رخ میداد :
حالا قضیه این خطا چی بود ؟
همون طور که گفتیم Null فرزند همه بود و میشد null رو که یه نمونه از این کلاس بود رو به همه type ها داد ولی وقتی که میخواستیم یه متد رو روی type مورد نظرمون صدا بزنیم این اقای null میگفت که من همچین متدی ندارم , درسته که من یه فرزند ضمنی از همه کلاس ها به حساب میام ولی از هیچ متدی پشتیبانی نمیکنم و این میشد که این خطا رخ میداد.(واقعن فرزند ناخلف که میگن همینه, فرزند همه بود ولی از هیچی هم پشتیبانی نمیکرد.)
مثلن کد ساده زیر رو در نظر بگیرید :
حالا مقدار name رو عمدن null میدم (مربوط به قبل null safety ایه ها)
میبینید که یه خطا رخ داده و گفته که این متد یعنی length رو روی شی مورد نظر وجود نداره.
توجه داشته باشید که این خطاها از نوع Runtime Exception ها هستن و موقع اجرای برنامه خودشون رو نشون میدن.
حالا توی این مورد ساده میشه با یه if قضیه رو حل کرد :
ولی خب همیشه قضیه به این سادگی ها نیست.
برگردیم به داستانمون ...
میرزا قلی که خطا پیدا کرده بود و فهمیده بود که این لیست بعضی وقتا null ارسال میشه انگشت اشارشو گرفت به سمت غضنفر و خوشحاااال گفت که دیدید گفتم مشکل از سروره .... این آقا داره null میفرسته. غضنفر هم زیر بار نمیرفت که نمیرفت و میگفت بابا جان این تو دیتابیس اینجوری ثبت شده, من که نمیتونم کاریش کنم که, همون چیزی که توی دیتابیس هست رو میگیرم میدم به تو. میرزا قلی هم میگفت تو برنامه نویس نیستی وگرنه میتونستی درست بفرستی. غضنفر هم میگفت اگه تو برنامه نویسی درستش کن.
خلاصه این مشکل فقط برای این ها پیش نیومد و خیلی از برنامه نویس ها درگیرش بودن تا اینکه تصمیم گرفتن برن توی گیت هاب Dart و یه issue باز کنن.برنامه نویس های بیچاره حرفشون این بود که یه کاری کن که به جای اینکه این چیزا رو موقع runtime خطا بگیره و ابرومون رو جلوی کاربرا ببره موقع کدنویسی بهمون بگه.Dart هم اول زیر بار نمیرفت و میگفت که این موضوع مربوط به من نیست و مربوط به کلاس ها میشه و Null بچه اوناست و من دخالت نمیکنم.
خلاصه پس از کش و قوص های فراوان کلاس های Dart یه جلسه تشکیل دادن و یه تصمیم خیلی مهم در مورد Null گرفتن که توی قسمت بعدی این تصمیم مهم رو با هم میبینیم.
مطلبی دیگر از این انتشارات
داستان Null در دارت(نال فرزند سر راهی)
مطلبی دیگر از این انتشارات
فانکشن بدون پرانتز در دارت
مطلبی دیگر از این انتشارات
Git dependencies in Flutter pubspec