
دارت یا همان Dart (در صورت علاقه میتوانید سایت رسمی این زبان را مشاهده نمایید) زبان برنامه نویسی ای است که حدود 6 سال از معرفی آن میگذرد، گوگل آن را توسعه میدهد و گفته میشود این زبان به عنوان راه حلی برای مشکلات موجود در جاوا اسکریپت (بهطور مثال مشکل حافظه) معرفی شده است. نظرات متفاوتی در رابطه با این زبان و آینده ی آن مطرح شده که جای تأمل دارد. از تعریف و تمجیدها گرفته و استفاده در Flutter به عنوان نکات مثبت، تا ابراز تأسف برخی از برنامه نویسان و ابراز تعجب اشخاص معروفی در حوزه آی تی و برنامه نویسی بابت حمایت گوگل از توسعه ی این زبان نظیر Brendan Eich (کسی که جاواسکریپت را توسعه داد و در زمان نوشتن این مقاله دیدی منفی نسبت به این زبان مطرح کرده است).
اینکه نهایتاً سرنوشت این زبان چه خواهد شد و پیشبینی برخی که اعتقاد دارند در آینده برای توسعه ی نرم افزارها و خودِ سیستم عامل فیوژا Fuchsia استفاده خواهد شد یا خیر جای بحث دارد، اما بصورت کلی یادگیری زبانی که شروعش ساده است و شرکتی مانند گوگل از آن حمایت میکند برای برنامه نویسان (مخصوصاً اشخاصی که بخواهند در حال حاضر با کمک Flutter اقدام به توسعه ی نرم افزار های موبایل برای هر دو سیستم عامل اندروید و iOS نمایند) عملی توجیه پذیر است. به همین دلیل در ادامه با سینتکس این زبان آشنا خواهیم شد.
از آنجا که بهترین کار برای یادگیری یک زبان برنامه نویسی تمرین است، حین خواندن این مقاله میتوانید اینجا نمونه کدهای خود را تست کنید (که البته در زمان نوشتن این مقاله، با ip ایران کدنویسی در لینکِ گفته شده امکان پذیر نیست و مجبور به تغییر ip میباشد).
همچنین توجه کنید که این آموزش مربوط به نسخه 2.0.0 ورژن استیبل این زبان میباشد.
با ابتدائی ترین موارد در هر زبان برنامه نویسی شروع میکنیم، متغیرها. تمامی متغیرها در دارت زیرمجموعه ی کلاس Object هستند.
در زبان دارت (همانند بسیاری از زبان های سطح بالا نظیر جاوااسکریپت، کاتلین، سوئیفت و...) هنگام تعریف یک متغیر نیازی نیست حتماً نوع آن را مشخص کرد و بصورت زیر میتوانید هر متغیری از هر نوعی تعریف کنید (در زبان دارت باید از سمیکالن یا همان ; استفاده کنید):
var myNubmer = 123; print(myNubmer); var myString = 'test'; print(myString);
در مثال های بالا با واژه var میگوییم یک متغیر داریم، پس از آن اسم متغیر، و در نهایت مقدار آن را مشخص میکنیم. اگر میخواهید انواع ثابتی از داده را تعریف کنید نگاهی به final و const بیندازید. بصورت خلاصه به شکل زیر میتوانید انواع ثابت را تعریف کنید:
final name = 'Mohammad'; final nickName = 'Misagh'; const age = 27; var foo = const []; final bar = const []; const baz = [];
نوع دیگری که در دارت وجود دارد dynamic میباشد. به این معنی که نوع خاصی برای آن در نظر گرفته نمیشود و میتواند هر نوعی از داده را داشته باشد:
dynamic testDynamic = 10; print(testDynamic); testDynamic = 'salam'; print(testDynamic); testDynamic = 12.5; print(testDynamic);
در قسمت قبل متوجه شدیم میتوان بدون مشخص کردن نوع، یک متغیر تعریف کرد. حال اگر بخواهیم بصورت صریح مشخص کنیم که متغیر از چه نوعی باشد بصورت زیر میتوان این کار را انجام داد:
String str = 'test'; print(str);
همانطور که مشخص است، ابتدا نوع را مشخص میکنیم، سپس نامگذاری و پس از آن مقداردهی میکنیم. در قسمت بعدی با انواع مختلف داده در زبان دارت آشنا میشویم.
بصورت پیشفرض این زبان شامل انواع زیر میباشد:
int x=1; // خط زیر مقدار عدد تعریف شده را نشان میدهد print(x);
int hex = 0xABEDA; // زبان دارت از اعداد هگز پشتیبانی میکند print(hex);
double y = 1.4; print(y);
double exponent = 1.24e-5; print(exponent);
هر دو نوع فوق زیرمجموعه ی نوعی به نام num میباشد. هنگام تعریف یک عدد میتوان آن را num تعریف کرد که هر دو مقدار صحیح و اعشاری را شامل میشود.
رشته ها بصورت "..." یا '...' تعریف میشوند.
// single quotes var s1 = 'hello'; print(s1); // double quotes var s2 = "hi misagh" print(s2); // interpolation var y1 = 2; var z1 = 5; // میتوانید هر پارامتر، متغیر یا فرمولی را به این صورت در رشته مستقیماً بکار ببرید ${...} var sum = 'The sum is ${y1+z1*2}'; print(y1); // 2 print(z1); // 5 print(sum); // The sum is 12 // همچنین اگر با یک پارامتر کار داریم میتوانیم بدون هیچ آکولادی از مقدار پارامتر استفاده کنیم var number = 12; print('$number is a number'); // 12 is a number
کدهای زیر مثالی از تبدیل رشته و عدد است:
// Srring -> int var one = int.parse('1'); print(one); // 1 // اعمال محدودیت روی تعداد ارقام عدد اعشاری String pi = 3.1415.toStringAsFixed(2); print(pi); // 3.14
متغیرهای بولین شامل true یا false.
bool b1 = false; bool b2 = true; bool b3 = 3==4; bool b4 = b1==b1; bool b5 = b1==b2; print(b1); // false print(b2); // true print(b3); // false print(b4); // true print(b5); // false print(0==false); // false print(1==false); // false
مثالی از تعریف یک لیست بصورت زیر میباشد:
var list = [1, 2, 3]; // element access print(l1[1]); // element assignment l1[2] = 9; // lenght print(l1.length); // insertion l1.add(55); // constant list var lConst = [1,2,3,4]; l2[2] = 20; // error l2.add(123); // error
در یک لیست میتان با صدا زدن (...)list.forEach عملیاتی را روی کل مقادیر انجام داد که در بخش توابع این مورد را خواهیم دید.
مپ ها مجموعه ای هستند از تعدادی عنصر کلید و مقدار ( keys and values ) که بصورت زیر تعریف میشوند:
var rates = { // Key: Value 'first': 'one', 'second': 'two', 'third': 'three' }; var numbers = { 1: 'one', 3: 'three' };
همچنین بصورت زیر نیز میتوان مپ ها را تعریف کرد:
var rates = Map(); // خط بالا یک شی از کلاس مپ ایجاد میکند. در ادامه ی آموزش با کلاس ها و اشیا آشنا خواهیم شد rates['first'] = 'one'; rates['second'] = 'two'; rates['fifth'] = 'five'; var numbers = Map(); numbers[1] = 'one'; numbers[3] = 'three'; // با اجرای خط زیر مقدار مرتبط با کلید 1 تغییر میکند numbers[1] = 'NEW ONE'; // اگر بصورت زیر تعریف کنیم نمیتوان مقدار کلیدی را تغییر داد final finalNumbers = const { 1: 'one', 3: 'three' }; var vcs = const[1, 'three'];
مثال دیگری از استفاده ی map ها را ببینیم:
// map creation var m1 = { 2:'test', 10:'hehe' }; var m2 = new Map(); print(m1); print(m2); // element access print(m1[2]); // test // missing keys print(m1[3]); // null // setting values m1[10] = 'changeTen'; m1[100] = 'changeHundred'; // length print(m1.length);
خوب است به (Symbol (compile-time constants و Runes (رشته های UTF-32) هم نگاهی بندازید.
دارت مثل اکثر زبانهای برنامه نویسی از اعمال اصلی پشتیبانی میکند. اجازه بدهید اولین کد کامل رو امتحان کنیم (تابع main شروع کننده ی برنامه هست، در مورد توابع در ادامه ی مقاله صحبت خواهیم کرد):
main(){ var a = 5; var b = 3; // add جمع print(a+b); // 8 // subtract تفریق print(a-b); // 2 // multiply ضرب print(a*b*0.5); // 7.5 // division تقسیم print(a/b); // 1.6666666666666667 // quotient خارج قسمت print(a ~/ b); // 1 // reminder باقیمانده print(a % b); // 2 // increment a++; ++a; print(a); // 7 }
زبان دارت از اعمال برابری و رابطه ای پشتیبانی میکند. کد زیر را ببینیم:
main(){ var a = 5; var b = 3; // Equal برابری print(a==b); // Not equal نابرابری print(a!=b); // Less than کوچکتر print(a<b); // Less than or equal کوچکتر یا مساوی print(a>b); // Greater than بزرگتر print(a<=b); // Greater than or equal بزرگتر یا مساوی print(a>=b); }
مواقع زیادی ممکن است نیاز داشته باشیم نوع یه متغیر را چک یا تبدیل کنیم. بصورت زیر میتوان این کار را انجام داد:
main(){ var list = ["hi", "hello"]; // is print(list is List<String>); // true // is! print(list is! String); // true print(list is! List<String>); // false // as print(list as List<String>); // [hi, hello] print((list as List<String>).length); // 2 print((list as int) + 4); // Error: Uncaught ... }
حالت عادی مقدار دهی را در کدهایی که تا کنون مرور کردیم، دیدیم. مثالی دیگر را بررسی میکنیم (از ویژگی های زبان دارت =?? است که عملکرد آن را خواهیم دید):
main(){ // assign num a = 5; print(a); // 5 // assign if null مقداردهی در صورتی که پارامتر مقداردهی نشده باشد var b; print(b); // null b ??= '6'; print(b); // 6 b ??= a; print(b); // 6 // compound assignment *= /= += -= ... a *= 2; print(a); // 10 }
دارت عملگرهای منطقی را نیز پشتیبانی میکند. مثالی از or، and و not را ببینیم:
main(){ // میتوان در یک خط چند متغیر تعریف کرد var a = true, b = false; // or print(a || b); // true // and print(a && b); // false // not print(!a); // false }
از دیگر ویژگی های زبان دارت، عملگرهای بیتی و شیفت میباشد. ببینیم این عملگرها به چه صورت تأثیر گذار خواهند بود:
main(){ var x = 1, y = 9; // Bitwise OR print(x | y); // 9 // Bitwise AND print(x & y); // 1 // Bitwise XOR print(x ^ y); // 8 // Bitwise NOT print(~x); // 4294967294 // Shift left print(1<<2); // 4 // Shift right print(3>>1); // 1 }
زبان دارت از عملگرهای شرطی تک خطی نیز پشتیبانی میکند. دو نوع از پیاده سازی را بررسی میکنیم. یکی بصورت condition ? expr1 : expr2 (اگر condition برابر true بود expr1 و در صورت false بودن expr2) و دیگری بصورت expr1 ?? expr2 (اگر expr1 برابر null نبود خودش، در صورت null بودن expr2)
main(){ // condition ? expr1 : expr2 var numbers = [2,3,5]; // میتوانیم بفهمیم عضوی در یک آرایه وجود دارد یا خیر .contains print(numbers.contains(4) ? 'prime' : 'not prime'); // not prime print(numbers.contains(3) ? 'prime' : 'not prime'); // prime // expr1 ?? expr2 var nobleGases = { 2:'helium', 10:'neon', 18:'aragon' }; print(nobleGases[2] ?? 'not a noble gas'); // helium print(nobleGases[3] ?? 'not a noble gas'); // not a noble gas }
در این قسمت میخواهیم شرط ها و حلقه ها و یا به عبارتی روند کنترل جریان را در دارت بررسی کنیم.
در زبان دارت میتوان هم بصورت if بدون else و هم بصورت if همراه با else و هم بصورت ترکیبی و تو در تو شرط ها را پیاده سازی کرد. برای مثال:
var x = 5; if(x<5){ print('less than 5'); }else if (x<10){ print('less than 10'); }else{ print('greater or equal to 7'); if(x%2==0){ //... }else{ //... } }
حالت دیگری از شرط ها، استفاده از switch-case میباشد:
switch(day){ case 'test': print('test'); break; // این عبارت برای اتمام کار در هر قسمت باید نوشته شود case 'testDay': print('testDay'); break; default: // اگر هیچ کدام از موارد بالا اجرا نشود این قسمت اجرا میشود print('noDay'); }
این زبان همانند اکثر زبانهای برنامه نویسی متعارف از حلقه ها پشتیبانی میکند. در مثال زیر یک لیست تعریف کرده و دو مدل for را بررسی میکنیم. یکی حالت standard و دیگری با استفاده از واژه ی کلیدی in:
var list = ['one', 'two', 'three']; // standard for for(var i=0; i<list.length; i++){ print('${list[i]} is shown'); } // for-in loop for(var number in list){ print('$number is a number'); }
همانند سایر زبانها، تنها تفاوت میان دو حلقه، در این است که حلقه do-while حدأقل یکبار اجرا میشود و پس از آن قبل از هربار اجرای بدنه شرط چک میشود، در صورتی که حلقه ی while از همان ابتدا هربار قبل از اجرای بدنه، شرط را چک میکد.ساختار حلقه ی while به صورت زیر میباشد:
while(شرط){ // تا زمانی که شرط برقرار است بدنه اجرا میگردد }
مثالی از پیاده سازی حلقه while
// while loop var x=0; while(x<2){ print(x); x++; } // خروجی این حلقه نمایش اعداد 0 و 1 میباشد x=0; while(x<0){ print(x); x++; } // حلقه اجرا نمیشود
ساختار حلقه ی do-while به صورت زیر میباشد:
do{ // بدنه یکبار اجرا شده و تا زمانی که شرط برقرار است مجدد اجرا میگردد }while(شرط);
مثالی از حلقه ی do-while
// do-while loop var y=0; do{ print(y); y++; }while(y<5); // خروجی این حلقه نمایش اعداد 0 تا 4 میباشد y=0; do{ print(y); y++; }while(y<0); // حلقه فقط یکبار اجرا شده و عدد 0 نشاغن داده میشود
main(){ // break for(var i=1; i<10; i++){ if(i%5==0) break; // زمانی که شرط برقرار باشد از حلقه خارج میشویم print(i); } // اعداد 1 تا 4 نشان داده میشوند // continue for(var i=0; i<10; i++){ if(i%2==0) continue; // زمانی که شرط برقرار باشد ادامه ی این قسمت بدنه ی حلقه اجرا نشده و مرحله ی بعدی حلقه اجرا میشود print(i); } // اعداد فرد 1 تا 9 نشان داده میشوند }
تا اینجا با مقدمات زبان دارت، متغیرها، انواع داده، عملگرهای اصلی و کنترل جریان این زبان آشنا شدیم. ادامه ی این آموزش (توابع، کنترل خطا و کلاس ها) را میتوانید در شروع برنامه نویسی با زبان دارت Dart - بخش دوم مشاهده کنید.
منتشر شده در ویرگول توسط محمد قدسیان https://virgool.io/@mohammad.ghodsian
https://virgool.io/@mohammad.ghodsian/dart1-nfbaxk7nhvsa