بریم سراغ یکی از ترسناکترین کلمهها تو تاریخ برنامهنویسی: null. اگه تا حالا کد زده باشی، حتماً به این کابوس برخوردی. اون خطای معروفی که میگه: NullPointerException یا Cannot read properties of null. این خطا، معروفِ به «اشتباه میلیارد دلاری»، مثل یه بمب ساعتیه که تو کدت کار میذاری و نمیدونی کی قراره منفجر بشه و کل اپلیکیشن رو بفرسته هوا. حالا، دنیای برنامهنویسی سالهاست داره تلاش میکنه این بمب رو خنثی کنه. این تلاشها دوتا اسم داشتن: یکی Null Safe (که خوبه) و اون یکی Sound Null Safe (که یه انقلاب مطلقه).
متأسفانه، خیلیا این دوتا رو با هم قاطی میکنن. فکر میکنن اینا یکیان و «Sound» فقط یه کلمه تبلیغاتیه که گوگل چسبونده اولش تا خفن به نظر بیاد. اما حقیقت اینه که فرق sound null safe با null safe، زمین تا آسمونه. فرقش مثل فرق یه «هشدار امنیتی» با یه «گاوصندوق ضدگلوله» است.
تو این مقاله، میخوایم یه شیرجه عمیق بزنیم تو این دوتا مفهوم. قراره با یه مثال ساده شروع کنیم و بعدش بریم تو دل مستندات فنی تا ببینی چرا Sound Null Safe (که فقط تو زبانهایی مثل زبان دارت و سوئیفت اپل پیدا میشه) آینده برنامهنویسی و دلیل اصلی برتری فلاتر flutter هست.
قبل از اینکه بریم سراغ «خنثیسازی»، بذار خودِ بمب رو بشناسیم. null یعنی «هیچی». یعنی «پوچ». این مفهوم رو یه دانشمند کامپیوتر بزرگ به اسم «تونی هور» (Tony Hoare) تو سال ۱۹۶۵ اختراع کرد. خود این آدم، سالها بعد، رسماً عذرخواهی کرد و گفت این «اشتباه میلیارد دلاری» من بود. فرض کن تولدته و کلی جعبه کادو جلوته. تو با خوشحالی جعبه اول رو باز میکنی تا اسباببازی توش رو برداری و باهاش بازی کنی. اما… جعبه خالیه. تو که انتظار اسباببازی داشتی، دستت به «هیچی» میخوره و کل ذوقت کور میشه و میزنی زیر گریه.
null دقیقاً همینه. تو توی کدت میگی:
User user = database.getUser(123);
String name = user.name;
print('Hello, $name');
تو به اپلیکیشنت میگی: «برو کاربر شماره ۱۲۳ رو از دیتابیس بگیر، بعد اسمش رو بردار و چاپ کن». حالا اگه به هر دلیلی (مثلاً کاربر ۱۲۳ وجود نداشت)، دیتابیس به جای «کاربر»، یه «جعبه خالی» (null) بهت برگردونه، چی میشه؟ تو خط بعدی، اپلیکیشن میخواد name رو از یه جعبه «خالی» برداره. نمیتونه. نتیجه؟ بوم! اپلیکیشن کرش میکنه و بسته میشه. این کابوسِ هر روزه برنامهنویسها بود.
مرحله اول : Null Safe (هشدار امنیتی)
بعد از سالها فاجعه، زبانهای برنامهنویسی جدیدتر (مثل تایپاسکریپت، کاتلین، سیشارپ و…) گفتن: «بیاید یه فکری بکنیم. بیاید حداقل روی جعبههای خالی یه برچسب بزنیم!». این شد فلسفه Null Safe (ایمن از نال). ایده این بود، از این به بعد، ما دو نوع جعبه داریم:
۱. جعبههای معمولی (Non-nullable) که قسم میخوریم هیچوقت خالی نیستن. (مثلاً String name).
۲. جعبههای مشکوک (Nullable) که ممکنه خالی باشن. ما اینا رو با یه علامت سوال ؟ مشخص میکنیم. (مثلاً String? name). و یه قانون گذاشتن: «تو حق نداری از یه جعبه مشکوک (؟) مستقیماً استفاده کنی، مگه اینکه اول چکش کنی که خالیه یا نه».
function sayHello(user: User | null) {
console.log(user.name);
if (user != null) {
console.log(user.name);
}
}
این عالی بود! یه پیشرفت بزرگ! کامپایلر (مترجم کد) قبل از اجرای برنامه بهت هشدار میداد: «داداش، داری به یه جعبه مشکوک دست میزنی، اول چکش کن!». پس مشکلش چیه؟ مشکل «اعتماد» بود. مشکل اینه که تو اکثر این زبانها، این سیستم «هشدار» ۱۰۰٪ قابل اعتماد نبود. مثل یه نگهبانه که میگه «من حواسم هست»، ولی گاهی اوقات چرت میزنه.
مثلاً تو تایپاسکریپت (TypeScript)، تو میتونی هر لحظه با استفاده از any یا ! (non-null assertion) به کامپایلر دروغ بگی و بگی «نگران نباش، من میدونم این خالی نیست». اگه دروغ گفته باشی، اپلیکیشن باز هم تو زمان اجرا (Runtime) کرش میکنه. یا تو کاتلین (Kotlin)، اگه داری با یه کتابخونه قدیمی جاوا (که Null Safe نیست) کار میکنی، اون کتابخونه جاوا میتونه یه null رو یواشکی رد کنه و بفرسته تو دل کد «ایمن» کاتلین تو و باز هم همهچیز منفجر بشه. پس Null Safe یه سیستم «خوشبینانه» است. بهت هشدار میده، ولی تضمین نمیکنه.
حالا میرسیم به Sound Null Safe، یعنی همون چیزی که تو زبان دارت (از نسخه ۲.۱۲ در سال ۲۰۲۰) و سوئیفت (Swift) داریم. کلمه کلیدی اینجا Sound هست. «Sound» (به معنی استوار، قطعی، معتبر) یه اصطلاح تو علوم کامپیوتره که یعنی: «یه سیستم که از نظر ریاضی اثبات شده و هیچ راه فراری نداره». فرق sound null safe با null safe دقیقاً همینه:
Null Safe (معمولی)میگه من سعی میکنم جلوی خطاهای نال رو بگیرم (یه هشدار)
Sound Null Safe (دارت) میگه من به تو ضمانت میدم که اگه یه متغیر علامت ؟ نداشته باشه، عمراً، تحت هیچ شرایطی، هیچوقت null نخواهد بود (یه گاوصندوق)
بریم سراغ بخش فنی که چرا این «ضمانت» (Guarantee) فقط یه دلخوشی ساده نیست، بلکه یه انقلاب فنیه و مستقیماً روی سرعت اپلیکیشن تو تأثیر میذاره.
۱. بهینهسازی فضایی کامپایلر (Compiler Optimization) این مهمترین بخش ماجراست که ۹۹٪ برنامهنویسها نمیدونن. تو یه زبان Null Safe معمولی (مثل کاتلین)، کامپایلر هنوز شک داره. چون میدونه ممکنه یه null از دنیای ناامن جاوا وارد کدش بشه، مجبوره تو کد نهایی (ماشینکد) یه سری چکهای امنیتی if (x != null) رو مخفیانه بذاره که اگه یهو null اومد، برنامه کرش نکنه و یه خطای بهتر بده. این چکهای اضافه، کد تو رو سنگینتر و کندتر میکنن.
اما تو Sound Null Safe دارت، وقتی تو میگی String name (بدون ؟)، کامپایلر دارت یقین داره که این متغیر null نیست. اثباتش کرده. چون یقین داره، به خودش میگه: «خب، اگه این هیچوقت null نیست، پس من چرا الکی چکش کنم؟». و کامپایلر تمام چکهای if (name != null) اضافه رو از کد نهایی تو حذف میکنه.
اپلیکیشنهای فلاتر که با Sound Null Safe کامل نوشته شدن، نه تنها امنتر هستن، بلکه به طور قابل توجهی کوچکتر (حجم فایل) و سریعتر (پرفورمنس اجرا) هستن. Sound Null Safe فقط یه سپر دفاعی نیست؛ یه موتور توربوشارژه!
۲. جهنمِ همکاری یا Interop Hell وجود نداره. همونطور که گفتیم، کابوس کاتلین، جاواست. کابوس تایپاسکریپت، جاوااسکریپته. زبان دارت این مشکل رو نداره. چرا؟ چون دارت (برخلاف کاتلین) روی ماشین مجازی جاوا (JVM) اجرا نمیشه و (برخلاف تایپاسکریپت) به جاوااسکریپت تبدیل نمیشه (حداقل تو فلاتر موبایل). دارت مستقیماً به کد ماشین نیتیو کامپایل میشه. هیچ دنیای «ناامن» دیگهای وجود نداره که بتونه یواشکی بهش null تزریق کنه. قلعه دارت کاملاً ایزوله و نفوذناپذیره.
۳. تولد ابزارهای جدید مثلِ کلمه کلیدی late. وقتی تو یه سیستم «ضدگلوله» میسازی، باید برای همه سناریوها فکر کنی. یکی از اولین چالشهای Sound Null Safe تو فلاتر flutter این بود که خب، من یه متغیر String name دارم که non-nullable هست. طبق قانون، باید همون لحظه مقداردهیش کنم. ولی من میخوام مقدارش رو از اینترنت بگیرم و این کار رو تو متد ()initState (که بعد از ساخته شدن کلاس صدا زده میشه) انجام میدم. الان چیکار کنم؟»
اگه سیستم «Sound» نبود، میگفتی «بیخیال، فعلاً null بذار، بعداً پرش میکنم». اما تو دارت نمیشه! اینجا بود که زبان دارت یه راهحل هوشمندانه معرفی کرد: کلمه کلیدی late. کلمهی late یه «قول شرف» رسمی به کامپایلره.
تو به کامپایلر میگی: «نگهبان عزیز! میدونم این جعبه الان خالیه، ولی قسم میخورم قبل از اینکه کسی بخواد ازش استفاده کنه، حتماً پرش میکنم. تو فعلاً اجازه ورود بده.» کامپایلر هم میگه: «باشه، رو قول تو حساب میکنم. ولی اگه بدقولی کنی و کسی زودتر بهش دست بزنه، همون لحظه برنامه رو منفجر میکنم (Runtime error)». این late، یه ابزار جراحی دقیق و زیباست که بهت اجازه میده تو یه دنیای ۱۰۰٪ امن، کدهای پیچیده و غیرهمزمان (asynchronous) رو هم به راحتی مدیریت کنی.
۴. آنالیز جریان کد (Control Flow Analysis) در حد خدا چون کامپایلر دارت «یقین» داره، میتونه خیلی هوشمندانه به کد تو نگاه کنه.
void test(String? maybeName) {
if (maybeName == null) {
print('It is null');
return;
}
print(maybeName.length); // OK!
}
کامپایلر دارت جریان کد تو رو میخونه و میفهمه: «آها، تو خط ۲ چک کردی که اگه null بود، از تابع برگردی (return). پس اگه به خط ۸ رسیدی، قطعاً دیگه null نیستی.» این هوشمندی باعث میشه لازم نباشه کدتو با ! (علامت تعجب) یا ؟. شلوغ کنی. کد نهایی، تمیز، خوانا و در عین حال ۱۰۰٪ امن میشه.
سوئیفت (Swift) چطور؟ اونم که Sound هست!
زبان دارت تنها زبان «Sound» نیست. زبان سوئیفت (Swift) اپل هم همین سیستم رو داره (اونجا بهش میگن Optionals). اینکه اپل و گوگل، دوتا از بزرگترین غولهای نرمافزاری دنیا، مستقلاً به این نتیجه رسیدن که سیستم «Sound» تنها راه نجاته، بهت نشون میده که این آینده قطعی برنامهنویسیه.
اما یه فرق sound null safe با null safe تو داستان دارت و سوئیفت هست: سوئیفت از روز اول (۲۰۱۴) با این قابلیت به دنیا اومد. مثل بچهای که تو یه خانواده ثروتمند به دنیا میاد. اما زبان دارت اینطوری نبود. دارت اولش (۲۰۱۱) این قابلیت رو نداشت. تیم گوگل تو سال ۲۰۲۰ یه تصمیم دیوانهوار گرفت: «کل زبان و کل اکوسیستم (دهها هزار پکیج) رو به Sound Null Safe مهاجرت میدیم.» این مثل این بود که یه شهر قدیمی رو، در حالی که مردم دارن توش زندگی میکنن، از اول، آجر به آجر، ضدزلزله کنی. یه شاهکار مهندسی بود که با موفقیت انجام شد و نشون میده گوگل چقدر روی آینده زبان دارت جدیه.
چرا این مقاله باید برات مهم باشه؟
اگه تا اینجای مقاله اومدی، دیگه فرق sound null safe با null safe رو کامل درک کردی. Null Safe (معمولی) یه «پیشنهاد» امنیتی بود. Sound Null Safe (دارت) یه «ضمانت» ریاضی و مهندسیه. این فقط یه «ویژگی» (Feature) نیست؛ این یه «فلسفه» است. فلسفهای که میگه: «امنیت و پایداری نباید یه گزینه آپشنال باشه؛ باید پایه و اساس سیستم باشه.» این فلسفه به تو به عنوان برنامهنویس فلاتر flutter سه تا هدیه بزرگ میده:
۱. آرامش خیال: تو میدونی که اپلیکیشنت به خاطر null کرش نمیکنه.
۲. سرعت (پرفورمنس): تو میدونی که کامپایلر کدهای اضافه رو حذف کرده و اپلیکیشنت داره با بالاترین سرعت ممکن اجرا میشه.
۳. کدنویسی لذتبخش: تو ابزارهای مدرنی مثل late و آنالیز جریان کد داری که باعث میشه کد تمیزتری بنویسی.
این «استواری» (Soundness) همون اسلحه مخفیه که زبان دارت رو به یکی از قویترین و مدرنترین زبانهای برنامهنویسی حال حاضر دنیا تبدیل کرده. اگه میخوای برنامهنویسی رو اصولی و مدرن یاد بگیری، یادگیری زبان دارت و سیستم Sound Null Safe اون، بهترین نقطه شروعه. بعد از اون، تو آمادهای که با فلاتر flutter اپلیکیشنهایی بسازی که نه تنها خوشگلن، بلکه ضدگلوله و سریع هم هستن.
امتیاز شما به مقاله
4.9 / 5. 31
31 رای 4.9
4.9
(31)
قوانین ارسال دیدگاه
متوجه شدم
برای ثبت نظر، حتما اسم و فامیل خود را به فارسی وارد کنید.
حتما ایمیل صحیح را وارد کنید تا در صورت بررسی کارشناسان، پاسخ برای شما ایمیل شود.
داخل متن کامنت کدهای برنامه نویسی قرار ندهید.
2نقد و بررسیها
روزبه
23 بهمن 1403
واقعا عالی بود ممنون استاد معلمی عزیز
( 1 )
موافقم با دیدگاه
ولی زاده
16 اسفند 1401
بهترین و قشنگ ترین توضیح در مورد این قابلیت رو سایت شما داده. واقعا که بهترین هستید. آرزوی موفقیت دارم برای شما و تیم خوبتون
ما همیشه تاکید کردهایم که بهترین سرمایهگذاری، سرمایهگذاری روی خودتان است. سایت آموزشی نابغهها با هدف ارائه آموزشهای برنامه نویسی و لینوکس به شما در مسیر موفقیت کمک میکند. برای شما موفقیت و تجربهای مفید در سایت آرزو میکنیم.
ivahid Specialized and Professional Web Design &
Development Company