If you're seeing this message, it means we're having trouble loading external resources on our website.

তোমার যদি কোন ওয়েব ফিল্টার দেওয়া থাকে, তাহলে দয়া করে নিশ্চিত কর যে *.kastatic.org এবং *.kasandbox.org ডোমেইনগুলো উন্মুক্ত।

মূল বিষয়বস্তু

স্ট্যাটিক ফাংশন বনাম উদাহরণস্বরূপ পদ্ধতি

অ্যালগোরিদম #3 করার আগে (মাউসের দিকে ত্বরান্বিত করা), আমরা ভেক্টর এবং PVector অবজেক্টের একটি বিশেষ অংশ দেখবো: স্থির (static) ফাংশন এবং অস্তিত্ব তথা ইন্সট্যান্স (instance) মেথডের মধ্যকার পার্থক্য।
ভেক্টরকে উপেক্ষা করে, নিচের কোড দেখি:
var x = 0;
var y = 5;
x = x + y;
খুব সহজ, তাই না? x এর মান হল 0, আমরা y কে যোগ করি এবং এখন x এর মান হল 5। আমরা PVector এর উপর ভিত্তি করে খুব সহজেই এটার সাথে সঙ্গতিপূর্ণ কোড করতে পারি।
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
ভেক্টর v এর মান হল (0,0), এটার সাথে u যোগ করি এবং এখন v এর মান হল (4,5)। সহজ, তাই না?
গণিতের আরও কিছু সাধারণ উদাহরণ দেখি:
var x = 0;
var y = 5;
var z = x + y;
x এর মান হল 0, আমরা তার সাথে y যোগ করি এবং ফলাফলটি একটি নতুন চলক z এ সংরক্ষণ করি। এই উদাহরণে x এবং y এর মান অপরিবর্তিত থাকে! এই গাণিতিক প্রক্রিয়াকে খুবই সাধারণ এবং তুচ্ছ একটি বিষয় বলে মনে হতে পারে। কিন্তু, PVector এ, এই গাণিতিক প্রক্রিয়াটি এতটা সহজ নয়। ব্যাপারটি স্পষ্টভাবে বোঝার জন্য কোড করি।
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // এটা কিন্তু সঠিক নয়!!!
উপরের কোডটি সঠিক বলে মনে হচ্ছে, কিন্তু PVector অবজেক্ট এভাবে কাজ করে না। add() সংজ্ঞাটি দেখা যাক...
PVector.prototype.add = function(v) {
    this.x = this.x + v.x;
    this.y = this.y + v.y;
 };
...আমরা এখন বুঝতেই পারছি যে এই কোড দিয়ে কাজ হবে না। প্রথমত, এটা নতুন PVector কে রিটার্ন করে না (কোন return স্টেটমেন্ট নেই) এবং দ্বিতীয়ত, এটা PVector কে কল করার সময় এর মান পরিবর্তন করে। দুইটি PVector অবজেক্ট যোগ করে ফলাফল হিসেবে একটি নতুন PVector কে রিটার্ন করার জন্য অবশ্যই "স্থির" add() ফাংশন ব্যবহার করতে হবে।
একটি "স্থির" ফাংশন হল এমন একটি ফাংশন যা অবজেক্টের উপর সংজ্ঞায়িত হয়, কিন্তু এটা অবজেক্টের বৈশিষ্ট্য পরিবর্তন করে না। কিন্তু কেন অবজেক্টের উপর সংজ্ঞায়িত করবো? আসলে, এটাকে অবজেক্টের সাথে কিছু করতে হবে, এজন্য এটাকে অবজেক্টের সাথে যুক্ত করাই যুক্তিসংগত। এটা একটি অবজেক্টে namespace (নেমস্পেস) এর মত ব্যবহার করা হয়। উদাহরণস্বরূপ, PVector এর সকল স্থির ফাংশন অবশ্যই এতে পাঠিয়ে দেওয়া PVector অবজেক্ট নিয়ে কোন না কোন কাজ করে এবং সবসময় কোন না কোন মান রিটার্ন করে। আমরা এই ফাংশনগুলোকে সার্বজনীনভাবে সংজ্ঞায়িত করতে পারি, কিন্তু এইভাবে করলে, আমরা সার্বজনীন ফাংশনকে এড়িয়ে চলতে পারি এবং এটার জন্য শ্রেণিকরণে সুবিধা হয়।
তুলনা করে দেখা যাক। এখানে আমরা add() এর ইন্সট্যান্স মেথডটি ব্যবহার করি:
v.add(u);
এই কোডটি v কে পরিবর্তন করবে, তাই রিটার্ন করা মান সংরক্ষণ করতে হবে না। পক্ষান্তরে, এইভাবে আমরা add() এর স্থির ফাংশনটি ব্যবহার করবো:
var w = PVector.add(v, u);
এক্ষেত্রে যদি আমরা ফাংশনটির ফলাফল সংরক্ষণ না করি, তাহলে উপরের কোডের কোন মূল্য থাকবে না, কারণ স্থির ফাংশন অবজেক্টকে পরিবর্তন করে না। PVector এর স্থির ফাংশন দিয়ে আমরা PVectors এর দেওয়া মানগুলো অপরিবর্তিত রেখে, সাধারণ গাণিতিক প্রক্রিয়াগুলো PVector অবজেক্টে প্রয়োগ করতে পারি।
এভাবে স্থির ফাংশনের add() কোড করা হয়:
PVector.add = function(v1, v2) {
  var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
};
এখানে কয়েকটি পার্থক্য আছে:
  • আমরা সরাসরি অবজেক্টের উপর ফাংশন সংজ্ঞায়িত করি, এটার প্রোটোটাইপে নয়
  • ফাংশনের মধ্যে কখনই this ব্যবহার করা হয় না
  • ফাংশন থেকে একটি মান রিটার্ন করা হয়
PVector অবজেক্টের add(), sub(), mult() এবং div() এর স্থির ফাংশন আছে। এটার আরও স্থির ফাংশন আছে যা ইন্সট্যান্স মেথডে নেই, যেমন angleBetween(), dot() এবং cross()। আমরা PVector দিয়ে আরও প্রোগ্রাম তৈরি করার সময় এসকল ফাংশনের ব্যবহার দেখবো।

এই "প্রাকৃতিক সিমুলেশন" কোর্সটি নেওয়া হয়েছে Daniel Shiffman (ড্যানিয়েল শিফম্যান) এর লেখা "The Nature of Code" (কোডের প্রকৃতি) থেকে এবং এটি ক্রিয়েটিভ কমন্সের এট্রিবিউশন-নন কমার্শিয়াল 3.0 আনপোরটেড লাইসেন্সের অধিনস্ত।

আলোচনায় অংশ নিতে চাও?

কোন আলাপচারিতা নেই।
ইংরেজি জানো? খান একাডেমির ইংরেজি সাইটে আরো আলোচনা দেখতে এখানে ক্লিক কর।