ডার্ট ১০১ - ভ্যারিয়েবল ও কন্ট্রোল-ফ্লো

এই পোস্টে আমরা কথা বলব ডার্ট টাইপ, ভ্যারিয়েবল ডিক্লারেশন, কন্ট্রোল ফ্লো নিয়ে। অনেকের কাছেই হয়ত আজকের পোস্ট অনেক সহজেবোধ্য হবে কারণ ডার্ট ও সি (ও তার পরিবারবর্গের) যথেষ্ট মিল রয়েছে, এমনকি একের কোড ওপরের ভেতর কপি/পেস্ট করলেও খুব অল্প পরিবর্তনেই রান করবে।

ভ্যারিয়েবল ও এসাইনমেন্ট

টাইপ

ডার্ট একটি টাইপসেফ ল্যাঙ্গুয়েজ। প্রতিটি ভ্যারিয়েবলের টাইপ থাকবে এবং এটি যেমন আপনার কোডকে করে সেলফ ডকুমেন্টেড, আবার স্ট্যাটিক এনালাইসিসের মাধ্যমে আপনি অনেক ধরণের এরর থেকে মুক্তি পেতে পারেন। আবার এডিটর অনেকটাই উপকারী হয়ে ওঠে টাইপ থাকার ফলে, যেমন রিফ্যাক্টরিং, ইন্টেলিজেন্স, অটোকমপ্লিট ইত্যাদি টাইপড ল্যাঙ্গুয়েজে অনেক শক্তিশালী ডাইনামিকালি টাইপড ল্যাঙ্গুয়েজ থেকে। তবে আমরা নিম্নের বুলেট পয়েন্ট থেকে বুঝতে পারব যে ডার্টের টাইপ অতটা দীর্ঘ করবে না আপনার কোডকে বরং এর টাইপ সিস্টেম কিছুটা স্মার্ট। এবং যদিও তা স্ক্যালা অথবা কটলিনের মত পাওয়ারফুল না, বোধগম্যতা ও শক্তির মাঝে বেশ ভালো সামঞ্জস্য স্থাপন করতে পেরেছে ডার্ট।

যেহেতু ক্লাস ও অবজেক্ট নিয়ে আমরা এই পর্বে কথা বলছি না কাজেই টাইপের সাথে আমাদের দেখা আরেকবার হবে জেনেরিক্স এর পোস্টে, আপাতত আমরা বেসিক টাইপ নিয়ে আলোচনা করব

  • ডার্ট ভ্যারিয়েবলের নামকরণের নিয়ম হল, নাম্বার দিয়ে শুরু হতে পারবে না, _, $, যে কোন নাম্বার অথবা লেটার থাকতে পারবে বাকিগুলি। পিএইচপি/জাভাস্ক্রিপ্টের মতো

  • একগুচ্ছ কীওয়ার্ড রয়েছে যা এখানে দেখতে পাবেন, তবে, কিছু কিছু কীওয়ার্ডকে জায়গাভেদে কিন্তু আপনি ভ্যারিয়েবলের নাম হিসেবে ব্যবহার করতে পারবেন। যদিও তা না করাটাই ভাল।

  • আপনি ডিক্লেয়ার করুন String name = "Dart", সরাসরি ডিক্লেয়ার না করে ইনিশিয়ালাইজ করুন var name = "Dart", অথবা শুধু ডিক্লেয়ার করুন var name। ডার্ট হয় টাইপ বাইনড করবে, টাইপ অনুমান করে নিবে (টাইপ ইনফেয়ারেন্স), অথবা dynamic টাইপ দিয়ে নিবে।

  • ডার্ট ভ্যারিয়েবল এসাইনমেন্ট ও টাইপ সিনট্যাক্স সি, সি++, সি-শার্প অথবা যাবার মতোই, আগে টাইপ (অথবা var), এরপর ভ্যারিয়েবলের নাম, এরপর = ও তার মান যদি ইনিশিয়ালাইজ করেন, সেমিকোলন ও সমাপ্তি যদি বিনা বাইন্ডিং এ রেখে দেন ভবিষ্যতের জন্য। যেমন: var answer = 42; (ডিক্লেয়ারেশন) ও int answer = 42; (ইনফেয়ারেন্স) একই কাজ করে

  • যদি শুধু var দিয়ে ডিক্লেয়ার করে বসে থাকেন, তাহলে তার টাইপ হবে Null অর্থাৎ যা প্রথমে দিবেন তার টাইপ গ্রহণ করবে ভ্যারিয়েবলটি। dynamic টাইপ থেকেও তা হতে পারে। উদাহরণস্বরূপ-

void main() {
  dynamic whatIsMyType;
  // অথবা var whatIsMyType

  print(whatIsMyType.runtimeType);

  whatIsMyType = "Mafinar";

  print(whatIsMyType.runtimeType);

  whatIsMyType = 100;

  print(whatIsMyType.runtimeType == int);
}

ডার্টপ্যাডে রান করে দেখুন কখন কার মান কি আসে

  • যদি শুধু ভ্যারিয়েবল ডিক্লেয়ার,করেন তাহলে তা যে টাইপেরই থাকুক না কেন, মান হবে “null

  • অপরিবর্তনশীল ভ্যালু বোঝাতে আপনি final অথবা const ব্যবহার করবেন। এদের পার্থক্য হল- final কেবলমাত্র একবারই এসাইন্ড হতে পারে, তার মানে, যে কোন ক্লাসের ফিল্ড final হতে পারে যা কন্সট্রাক্টরে ডিক্লেয়ার করা হবে (অন্যদিনের টপিক এটা), তবে cont কম্পাইল সময় থেকেই অপরিবর্তনশীল। final-কে আপনি এক্সেস না করলে তা কোন জায়গা দখল করবে না মেমোরিতে, তবে const ডিক্লেয়ার করা মাত্রই মেমোরি নিয়ে বসবে। এদের সম্পর্কে আরো জানতে পারবো পরের পোস্টগুলিতে।

$${} এর মাধ্যমে টাইপ ইন্টারপোলেশন হয়, যেমন-

void main() {
  var filename = "string";
  var extension = ".dart";
  var language = "Dart";

  print("An example of $language filename could be ${filename + extension}");
}

শুধু মান প্রতিস্থাপনের জন্য $ এবং ডার্ট এক্সপ্রেশান প্রতিস্থাপনের জন্য ${} ব্যবহৃত হয়

  • ডাবল ও সিঙ্গেল দু'ধরণের কোটেশন ব্যবহার করা যায় ডার্টে। এদের মধ্যে কোন পার্থক্য নেই (জাভাস্ক্রিপ্টের মত), আবার পাইথনের মতো ট্রিপল কোটেশনও রয়েছে।

  • int, double, bool অন্য ল্যাঙ্গুয়েজে (যেমন জাভা) প্রিমিটিভ টাইপ, অবজেক্ট নয়, তবে ডার্টে কিন্তু সবাই অবজেক্ট।

  • লিস্ট একাধিক বস্তু ধারণ করে থাকে সারিভুত করে। যেমন: ১ থেকে ৫ পর্যন্ত সমস্ত নাম্বারকে আমরা রাখতে পারি লিস্টে সিনট্যাক্স var oneToFive = [1,2,3,4,5];[x] এর মাধ্যমে আমরা লিস্টের x-তম সদস্য বের করতে পারি যা হবে উক্ত সদস্যের ক্রম সংখ্যা যা হয় শূন্য-ভিত্তিক। অর্থাৎ, [0] দিয়ে প্রথম সংখ্যা, [1] দিয়ে দ্বিতীয় ইত্যাদি।

  • ম্যাপ এর সদস্যদের ক্রমবর্ধমান সংখ্যার মাধ্যমে না রেখে যে কোন কী মাধ্যমে রেখে থাকে, যা সম্ভব হ্যাশিং এর মাধ্যমে, যেখানে লিস্ট হবে- var capitals = ["Dhaka", "Ottawa", "Canberra"]; সেখানে ম্যাপ হবে- var capitals = {"Bangladesh": "Dhaka", "Canada": "Ottawa", "Australia": "Canberra"}, যেখানে লিস্টে আমরা ম্যান নির্ণয় করব- capitals[0] দিয়ে সেখানে ম্যাপে- capitals["Bangladesh"] দিয়ে আমরা তা বের করব। বুঝাই যাচ্ছে- {ক: খ} হলো ম্যাপের সিনট্যাক্স যেখানে হল কী এবং হল ভ্যালু।

  • লিস্ট ও ম্যাপ উভয়েই টাইপড হয়ে থাকে, তবে তা নিয়ে আমরা আলোচনা করব জেনেরিকসের পোস্টে, এই মুহূর্তে এগুলি নিয়ে কথা বলার কারণ, আগামী ২/১ পোস্টে আমাদের লিস্ট অথবা ম্যাপ নিয়ে কাজ করতে হতে পারে। আর এই পোস্ট এর নিচের এক সেকশানে লিস্ট সম্পর্কে জানা লাগবে।

অপারেটর

  • অপেরেটর (ল্যাঙ্গুয়েজভেদে) সহজবোধ্য অথবা ভ্রান্তিকর বিষয় হতে পারে। সৌভাগ্যক্রমে ডার্টের ক্ষেত্রে তা প্রথমটি!

  • +, -, *, / কি করে তা বোঝানো কি দরকার পরবে?

  • / এর ক্ষেত্রে অবশ্য যদি আপনি দুটি int কে ভাগ দিয়ে রেজাল্ট int চান তাহলে ~/ অপারেটর ব্যবরোমে হার করা লাগবে।

  • &, |, ^, ~, <<, >> যথাক্রমে AND, OR, XOR, NOT, SHIFT LEFTSHIFT RIGHT বোঝায়।

  • লজিক্যাল অপারেটর যা বুলিয়ান ভেলুর উপর কাজ করে বুলিয়ান ভেলু প্রদান করে, তা হল &&, || ! যা যথাক্রমে এবং, অথবা এবং নট বুঝায় (বুলিয়ান)।

  • = দিয়ে এসাইনমেন্ট বোঝানো হয়, এবং পূর্ববর্তী অপারেটর ও = একত্রিত হয়ে দুটি কাজ একত্রে করে, যেমন: x += 10; মানে x = x + 10;, অনুরূপভাবে -=, *=, /=, ~/=, |=, &=

  • ++-- করে ইনক্রিমেন্ট ও ডিক্রিমেন্ট করে থাকে (সি/জাভা-র মতো)

?? একটি বিশেষ অপারেটর, এর মানে হল, a ?? b যদি a null হয় তাহলে তা b এর মান পাবে অথবা যা ছিল তা-ই থাকবে। অন্য কথায় a = a == null ? b : a

  • অনেক অপারেটর যেমন: is, is!, as, ., .?. .. নিয়ে এখানে আলোচনা করিনি কারণ এদের স্থান অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ যা ভবিষ্যত পোস্টের টপিক।

কমেন্ট ও সেমিকোলন

  • ডার্ট স্টেটমেন্ট শেষ হয় সেমিকোলনের (;) মাধ্যমে।

  • কমেন্ট তিন প্রকার, /* */ হল একাধিক লাইনভুক্ত কমেন্ট, // এক লাইনিয় কমেন্ট, /// ডকস্ট্রিং

  • ডকস্ট্রিং ফাংশন অথবা ভ্যারিয়েবলের পূর্বে বসে এবং তা মার্কডাউন গ্রহণ করতে পারে।

  • লাইন ব্রেক প্রোগ্রামের মাঝে লাইন ব্রেক যদি হয় তাহলে সেমিকোলন পাওয়ার আগে পর্যন্ত চেষ্টা করবে কম্পাইলার এদের একত্রিত করে পার্স করতে, তবে কোন ভেলুর মাঝে যদি (যেমন নাম্বারের মাঝখানে, স্ট্রিংয়ের মাঝখানে ইত্যাদি) তা হয় তবে এরর দিবে।

var x = "hello
  world"; // ভুল

var x = "hello "
  + " world"; // সঠিক

var x = "hello "
   " world"; // সঠিক

var x = "hello " +
   " world"; // সঠিক

আমরা জানলাম দুটি স্ট্রিংয়ের মাঝে স্পেইস থাকলে তা + এর কাজ করে এবং তাদের যুক্ত করে।

কন্ট্রোল ফ্লো

ব্রানচিং - ইফ/এলস

  • ডার্ট if স্টেটমেন্ট জাভা/সি এর মতো। অর্থাৎ if(<bool condition>) { <body > }else এবং else if একইরকম, যেমনটি নিচের কোড স্নিপেট-
  String status;
  int grade = 47; // My HSC grade in English Paper II. Only God knows why though!
  if (grade == null) {
    status = "ABSENT";
  } else if (grade > 33) {
    status = "PASS";
  } else if (grade <= 33) {
    status = "FAIL";
  } else {
    status = "INVALID"
  }
  • else এবং else if থাকা বাধ্যতামূলক না, তবে টার্নারি অপারেটর হলে তা লাগবে।

  • <condition> ? <true-value> : <false-value> হল টার্নারি অপারেটর, যেমন: age >= 18 ? "can vote" : "can't vote";

  • উপরে <condition> বলতে বুলিয়ান ভেলু (true অথবা false) বুঝানো হয়েছে, null false হিসেবে কাজ করবে তবে 0, "" ইত্যাদি বুলিয়ান হিসেবে কাজ করবে না

ব্রানচিং - সুইচ/কেইস

  • switch অনেকটা সংক্ষিপ্ত if/else এর মতো, এর কাঠামোগত উদাহরণ হল-
switch (<ি>) {
  case <>:
      <ি   ি     >
      break;
  case <>:
  case <>:
      <ি   ি       >
      break;
  default:
      <ি   , ,  ি  ি   >
  • == দিয়ে মাপা যায় এমন সব মান switch এর case এ বসবে। অন্যান্য ল্যাঙ্গুয়েজের মতো প্যাটার্ন ম্যাচিং অথবা </> ব্যবহার করা যাবে না

  • যেখানে পাবেন case সেখানে থাকবে break! শুধুমাত্র খালি case ছাড়া (<খ> ও <গ> এর কেইসে যা হয়েছে)।

  • উদাহরণ-

main() {
  var grade = "A";

  switch (grade) {
    case "A":
      print("Excellent");
      break;

    case "B":
    case "C":
      print("Fair");
      break;

    case "D":
      print("Poor");
      break;

    case "F":
      print("Fail :)");
      break;
    default:
      print("Invalid choice");
  }
}
  • if এর এক-লাইন বডি থাকলে {} না দিলেও পারি। যেমন: if (number < 0) break;

লুপিং

সি ফ্যামিলির ট্রেডিশানকে মাথায় রেখে ডার্ট তিন ধরণের লুপের ফ্যাসিলিটি প্রদান করে থাকে- for, whiledo...while, for আবার foreach এর কাজও করে

যে কোন কাজ যা বার বার করতে হয়, তার কিছু কন্ট্রোলিং ফ্যাক্টর- শুরু/শেষ থাকে। মাঝপথে বের হয়ে যাওয়ার পন্থা থাকে, কাজ শেষ হওয়ার আগেই পরবর্তী ধাপে যাওয়ার ব্যবস্থা থাকে। একগুচ্ছ কোডকে যখন বার বার একই কাজ করবেন, তখন অবশ্যই আপনার বলে দিতে হবে এর শেষ কখন হবে? এবং যদি না হয়, তাহলে প্রোগ্রামিং ল্যাঙ্গুয়েজের ব্যবস্থা করে দিতে হবে লুপটিকে থামানোর। break দিয়ে যে কোন লুপ থেকে বের হওয়া যায়, আবার continue দিয়ে লুপের বাদবাকি অংশ স্কিপ পরে পরবর্তী লুপ চালু করানো যায়, এবং লুপ কন্ট্রোল করতে হলে কিভাবে চিন্তা করা লাগবে তার উপর ভিত্তি করেই আসে for, for(each), while ইত্যাদি।

for লুপ

ডার্ট ২ ধরণের for কীওয়ার্ড প্রদত্ত লুপ দিয়ে থাকে, প্রথমটি সি এর মতো- অর্থাৎ for (<ক্রম শুরু>, <ক্রোম কি চলবে?>, <ক্রম শেষের দিকে এক ধাপ অগ্রসর>) { <যা করা দরকার> } খেয়াল করুন, ক্রম শুরু থেকে শেষ যে বেড়ে বেড়ে যাবে তা কিন্তু বলা হয়নি, বলা হয়েছে শেষের পথে অগ্রসর। ক্রম যদি শুরু হয় ১০০ দিয়ে এবং শেষ হয় তে তাহলে কিন্তু অগ্রসর বলতে বিয়োগ বোঝাবে, অন্যথায় তা জীবনেও শেষ হবে না, যদি না কোনো break থাকে কোড। ক্রোম কি চলবে? কিন্তু একটা প্রশ্ন ছিল। ক্রম শেষ হবে একটা মানে পৌঁছালে এবং তা হয়েছে কিনা তা একটা প্রশ্ন, যার উত্তর হ্যা/না তথা বুলিয়ানে হবে। এবং সবশেষে ক্রমের মান পরিবর্তন, যা হওয়া উচিত এমন যেন তা কোনো না কোনো সময়ে ক্রমকে শেষ মানের দিকে নিয়ে যায়-

main() {
  var sum = 0;
  var product = 1;

  for (var i = 0; i < 15; i++) {
    sum += i;
  }

  for (var j = 1; j < 15; j++) {
    product *= j;
  }

  print("SUM: $sum \n PRODUCT: $product");
}

breakcontinue এখানে কাজ করে। নিচের কোডটি দেখি-

main() {
  var output = true;
  var isItPrime = 8310270189677;

  if (isItPrime%2 == 0) output = false;
  else {
    for (var i = 3; i*i < 123; i += 2) {
      if (isItPrime%i == 0) {
        output = false;
        break;
      }
    }
  }

  print("Is $isItPrime a prime? AND: $output");
}

এখানে আমরা দেখছি শুরু, শেষ এবং বর্ধন যথাক্রমে এসাইনমেন্ট, কন্ডিশন এবং রি-এসাইনমেন্ট। যদি কোন লজিকে লুপ শেষ হওয়ার আগে বের হতে হয়, তাহলে break দিয়ে করতে পারি।

লিস্ট ও for লুপ নিয়ে একটু চিন্তা করা যাক এবার। আমরা জানি একটি লিস্টকে কি করে এক্সেস করা যায় ([] এর মাধ্যমে), কাজেই, আমাদের ওই ১ থেকে ৫ এর লিস্টের প্রত্যেকের যোগফলকে যদি আমরা পেতে চাই তাহলে নিচের কোডটি চালাতে পারি-

main() {
  var list = [1, 2, 3, 4, 5];
  var sum = 0;

  for (var i = 0; i < 5; i++) {
    sum += list[i];
  }

  print(sum);
}

এর আরেকটি সহজ উপায় আছে, কেননা লুপটির মূলনীতি- আমি এক থেকে লিস্টের সাইজ পর্যন্ত যাবো, এবং তুমি প্রত্যেকটি নাম্বার নিয়ে লিস্টকে দাও এবং বল যে তত-তম সদস্য দাও না হয়ে আমি লিস্ট থেকে একটা একটা করে সদস্য তোমাকে দিচ্ছি? ঠিক এই এটিচুড দেখায় for লুপের দ্বিতীয় রূপ, যার সিনট্যাক্স for (<লিস্টের সদস্য> in <লিস্ট অথবা লিস্টের মতো কিছু>) { <যা করার> }। এতে উপরের কোডটি দাঁড়ায়-

main() {
  var list = [1, 2, 3, 4, 5];
  var sum = 0;

  for (var i in list) {
    sum += i;
  }

  print(sum);
}

whiledo...while

for লুপকে একটু ঘুরিয়ে চিন্তা করা যাক, ধরুন কন্ট্রোল ভ্যারিয়েবল আগে থেকেই ডিক্লেয়ার করা এবং আমাদের লুপিং বক্তব্য দাঁড়ায়- যতক্ষন কন্ট্রোল ভ্যারিয়েবলের মান অমুক মানের সমান না হবে ততক্ষন পর্যন্ত লুপ চালাও এখানেই আসে whiledo...while লুপ।

while এর সিনট্যাক্স হল- while (<লুপ কি চলবে?>) { <চালিয়ে যাও>} আর do...while লুপ দাঁড়ায়- do { <চালিয়ে যাও>} while (<লুপ থামানোর শর্ত কি পূর্ন হয়েছে?>)। দুটোর মধ্যে পার্থক্য? নিচের কোড দেখি-

main() {
  var i = 0;
  do {
    i++;
  } while (i < 0);

  print(i);

  var j = 0;

  while (j < 0) {
    j++;
  }

  print(j);
}

রেজাল্ট কী হল? একজন 0 আরেকজন 1। কারণ while লজিকে কন্ডিশন আগে দেখা হয়, এব do... while পরে। এই ক্ষেত্রে মান আগে থেকেই ছিল কন্ডিশন বহির্ভুত, কাজেই while লুপ তা ধরে বের করে দেয়, কিন্তু do...while লুপ একবার লুপ চালিয়ে এরপর শর্ত অতিক্রম দেখতে পায় ও বন্ধ করে লুপ, কিন্তু ততক্ষনে ১ বার লুপ চলেছে, যে কারণে এ দু'রকম বিহেভিয়ার।

forwhile লুপ একই কাজ দুভাবে প্রেজেন্ট করে, নিচের কোড দেখা যাক-

main() {
  var forSum = 0;
  for (var i = 0; i < 10; i++) {
    forSum += i;
  }

  var whileSum = 0;

  var j = 0; // Initialization
  while (j < 10) { // Condition
    whileSum += j;
    j++; // Increment
  }

  print("FOR: $forSum <=> WHILE: $whileSum");
}

কোড দেখেই আমরা পার্থক্য বুঝতে পারছি, একই কাজ, দু'রকম চেহারা।

if এর মতো forwhile এও এক-লাইন বডি থাকলে {} না দিলেও পারি। যেমন: for (var item in list) sum += item;

লুপ সমাপ্ত!

নিজেকে প্রশ্ন করুন

  • ইন্টিজার ওভারফ্লো হয় ডার্টে? ইন্টিজার ওভারফ্লো কী?

  • বাংলা নাম কি রাখতে পারবেন আপনার ভ্যারিয়েবলের?

  • continue এর ব্যবহার কোথায় এবং কিভাবে হতে পারে?

  • স্টেটমেন্ট ও এক্সপ্রেশনের পার্থক্য কি? এই পোস্টে প্রাপ্ত সিন্ট্যাক্সগুলির মাঝে কোনগুলি স্টেটমেন্ট? এক্সপ্রেশন কে কে?

  • null ভ্যালু যদি if স্টেটমেন্টে দেন তাহলে কি == null দেয়া লাগবে? যদি না লাগে তাহলে কেন? শূন্য মানের ক্ষেত্রে তা লাগে কেন?

  • switch স্টেটমেন্টে break কেন লাগে? এমনতো না যে পরবর্তী কেইসের লজিক মিলে যাবে?

  • if না শিখে শুধু switch শিখে কি সমস্ত টাইপ প্রব্লেম সল্ভ করতে পারবেন? উল্টোটা কি সম্ভব?

  • for লুপে কি আপনি কোন অংশ খালি রাখতে পারবেন? যেমন: ইনিশিয়ালাইজার দিবেন না, অথবা চেঞ্জ করবেন না?

  • whilefor এর আসল পার্থক্য কি? এদের কোনো একটা কখনো ব্যবহার না করে কি আপনি প্রোগ্রামিং প্রব্লেম সল্ভ করতে পারবেন?

  • কয়েকটা নাম্বার সর্টিং করেন, এই পর্যন্ত যা শিখেছেন তা দিয়ে, উল্টা ও সিধা দু ধরণের সর্টিংই করে দেখান।

  • একটা লিস্টকে উল্টা করে দেখান এই পর্যন্ত যা শিখেছেন তা দিয়ে

টিপস

  • হয়ত বুঝতেই পেরেছেন, সিন্ট্যাক্সীয় নৈকট্যের জন্য সি অথবা জাভা বই পড়েও আপনি ডার্ট সম্পর্কে জানতে পারবেন। ধরুন আপনি অনেক জটিল একটা এলগোরিদম ইমপ্লিমেন্ট করতে চাচ্ছেন ডার্ট দিয়ে তবে আটকে গিয়েছেন। ইন্টারনেটে কিন্তু হাজার খানেক রিসোর্সে পাবেন যা সি, জাভা অথবা সি শার্পে করা, সেগুলো থেকে কিন্তু সহজেই ডার্টে পরিণত করতে পারবেন আপনার কোডকে।

  • এরর মেসেজ থেকে অনেক কিছুই শিক্ষণীয় আছে। যা-ই শিখবেন, ডার্টপ্যাড খুলে রাখবেন ব্রাউজারে এবং তা ট্রাই করবেন, যদি এরর পান, তাহলে প্রথমেই এররটিকে গুগল করে নিবেন, ফলো করতে করতে দেখবেন, যা শিখেছেন, ২/৩টি বই শেষ করেও শিখতে পার্বতেন না।

  • সমস্যায় যদি না পরেন, অর্থাৎ যা টেস্ট করছেন তা যদি কারেক্ট হয়, তাহলে প্যারামিটার চেঞ্জ করে করে এরর পাওয়ার চেষ্টা করেন, এবং পূর্বের বুলেট পয়েন্ট ফলো করেন।

  • “What If…” অনেক ভাল একটা উপায় ব্রেন-টিজ করার, সিনট্যাক্স এর বিভিন্ন কম্বিনেশন ট্রাই করুন, অন্য (আপনার আগে থেকে জানা) ল্যাঙ্গুয়েজে এর সাথে তুলনা করে সে ল্যাঙ্গুয়েজে এর ফীচার নেই কেন তা নিয়ে গুগল করুন, কাহিনী পড়ুন, ভিডিও দেখুন।

  • ডার্ট কনফারেন্সের সিলেক্ট করা দেখুন, ইউটিউব ঘাটলেই পাবেন।

আজকের জন্য এতটুকু এডভাইজ যথেষ্ট। তবে এগুলো কে যদি অভ্যাসে পরিণত করা যায় তাহলে যে কোন ল্যাঙ্গুয়েজের বেসিক আয়ত্ব করা ব্যাপার থাকবে না।

আগামী পোস্ট হবে ফাংশন নিয়ে এবং সেটি আজকের মতো এতো বড় হবে না।

তো আমরা এই পোস্টটি থেকে খুবই বেসিক সিন্ট্যাক্সের সাথে পরিচিত হলাম ডার্টের। আমরা শিখলাম ভ্যারিয়েবল ডিক্লেয়ার করা, টাইপ চিনলাম, জানলাম লুপিং ও ব্রানচিং নিয়ে।

comments powered by Disqus