স্কিপ করে মূল কন্টেন্ট এ যান

গঠনকৌশল

সংক্ষিপ্ত বিবরণ

Wave ভাষার গঠনকৌশলগুলি ব্যবহারকারী সংজ্ঞায়িত ডেটা টাইপ ঘোষণার জন্য একটি মূল সিনট্যাক্স উপাদান। গঠনকৌশলগুলি ব্যবহার করে বিভিন্ন ধরণের মানগুলি একক যৌক্তিক স্তরে একত্র করা যায় এবং জটিল ডেটা কাঠামো তৈরি করা যায় যা আরও নির্ভুল এবং নিরাপদ মডেলিংয়ের জন্য কাজ করে।

Wave এর গঠনকৌশল একটি মান টাইপ হিসেবে কাজ করে। সব ক্ষেত্র অবশ্যই স্পষ্ট টাইপ সহ ঘোষিত হতে হবে, এবং গঠনকৌশল ইনস্ট্যান্স তৈরি করলে সব ক্ষেত্রগুলো অবশ্যই প্রাথমিককরণ করতে হবে। এই নিয়মগুলি নিশ্চিত করে যে গঠনকৌশলের অবস্থা সবসময় সম্পূর্ণ এবং পূর্বাভাসযোগ্য থাকে।

গঠনকৌশল ঘোষণা সিনট্যাক্স

গঠনকৌশল ঘোষণায় struct কীওয়ার্ড ব্যবহার করা হয়। গঠনকৌশলের নামগুলি পাস্কাল কেস ব্যবহার করে এবং গঠনকৌশলের দেহে একটি বা একাধিক ক্ষেত্র সংজ্ঞায়িত থাকতে পারে।

একটি ক্ষেত্রকে নাম: টাইপ; ফর্ম্যাটে ঘোষণা করা হয়, এবং প্রত্যেক ক্ষেত্র ঘোষণার পরে একটি সেমিকোলন থাকা আবশ্যক।

struct Box {
size: i32;
weight: f32;
}

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

গঠনকৌশল সৃষ্টির নিয়ম

গঠনকৌশল, গঠনকৌশল নাম ব্যবহারকারী লিটারাল ধাঁচে তৈরি করা হয়। স্ট্রাকচার লিটারেলগুলি StructName { field_name: value; ... } আকারে লেখা হয়।

var b: Box = Box {
size: 42;
weight: 10.5;
};

গঠনকৌশল তৈরি করার সময় নির্ধারিত সব ক্ষেত্রগুলো অব্যক্তিপূর্বক করতে হবে, অন্যথায় কম্পাইলার ত্রুটি দেয়।

আরম্ভের সময়ে ক্ষেত্র নির্মাণের ক্রমটি গঠনকৌশল ঘোষণার ক্রমের সাথে মেলে না প্রয়োজন হয় না, তবে প্রতিটি ক্ষেত্রের মানের টাইপটি অবশ্যই গঠনকৌশলে ঘোষিত টাইপের সাথে সঠিকভাবে মিলে যেতে হবে। Wave-এ গঠনকৌশল ক্ষেত্র প্রাথমিককরণের প্রক্রিয়ায় ইমপ্লিসিট টাইপ কনভারশনগুলিকে অনুমোদন করে না।


গঠনকৌশল ক্ষেত্র অ্যাক্সেস নিয়ম

গঠনকৌশলের ক্ষেত্র ডট নোটেশন ব্যবহার করে অ্যাক্সেস করা হয়। ক্ষেত্র অ্যাক্সেসিং একই সংক্রান্ত নিয়মে পড়া এবং লেখা ব্রতিত হয়।

println("Size: {}", b.size);
println("Weight: {}", b.weight);

অধরা ক্ষেত্রগুলির নাম ব্যবহার করতে চাইলে কম্পাইল লেভেলে ত্রুটি তৈরি হয়। গঠনকৌশল একটি মান টাইপ হওয়ায়, সমগ্র গঠনকৌশলটি পাস করা বা ফাঙ্কশন প্যারামিটার হিসাবে পাস করার ক্ষেত্রে গঠনকৌশলে উপস্থিত সব ফিল্ডগুলি একসঙ্গে কপি করা হয়।


গঠনকৌশল পদ্ধতি সংজ্ঞা নিয়ম

Wave ভাষায় গঠনকৌশলের ভিতরে সরাসরি মেথডগুলো সংজ্ঞায়িত করা হয় না। পরিবর্তে proto কীওয়ার্ড ব্যবহার করে গঠনকৌশলে সংযুক্ত মেথড সঙ্কলিত হয়।

proto ব্লক একটি নির্দিষ্ট গঠনকৌশলের অন্তর্ভুক্ত ফাঙ্কশনগুলির সেট যা সেই ব্লকের ভিতর সংজ্ঞায়িত হয় এবং সংশিষ্ট গঠনকৌশলের মেথড হিসেবে কাজ করে।

মথডে প্রথম প্যারামিটার হিসাবে self ব্যবহার করে গঠনকৌশল ইনস্ট্যান্স রেফারেন্স পায়। proto গঠনকৌশলের সম্পূর্ণ মানের অর্থ বহন করে এবং মানটি কপি করা পদ্ধতিতে পাস করা হয়।

proto Box {
fun print(self) {
println("size={}, weight={}", self.size, self.weight);
}

fun added_size(self, x: i32) -> i32 {
return self.size + x;
}
}

proto ব্লকগুলি গঠনকৌশল ঘোষণার ফাইলের পাশাপাশি অবস্থানে থাকতে হয় না এবং একাধিক proto ব্লকের মাধ্যমে একই গঠনকৌশলের জন্য মেথডগুলির সেট সংজ্ঞায়িত করা যায়।

পদ্ধতি কল করার সময় বিন্দু নোটেশন ব্যবহার করা হয় এবং সাধারণ ফাংশন কলের মতো একইভাবে কাজ করে।

b.print();
var n: i32 = b.added_size(5);

ফাংশনের আর্গুমেন্ট হিসাবে গঠন ব্যবহার

একটি স্ট্রাক্টকে ফাংশনের আর্গুমেন্ট হিসাবে পাস করার সময় মান কপি পদ্ধতি দ্বারা পরিচালনা করা হয়। যদিও একটি ফাংশনের ভিতরে স্ট্রাক্টের ফিল্ডগুলি পরিবর্তন করা হয়, তবুও কল হওয়া পৃষ্ঠার স্ট্রাক্ট ইনস্ট্যান্সে তার কোনো প্রভাব ফেলে না।

fun calc(box: Box) -> i32 {
return box.size * 2;
}

যদি স্ট্রাক্ট কলের জন্য একটি রিটার্ন ভ্যালু হিসেবে ব্যবহার করা হয়, একইভাবে একটি মান কপি ঘটে। এই আচরণটি কাঠামোর অপূরণীয়তা এবং অনুমানযোগ্য ডেটা প্রবাহ নিশ্চিত করে।


নেস্টেড স্ট্রাকচার

Wave-এ স্ট্রাকচারের ফিল্ড টাইপ হিসেবে অন্য একটি স্ট্রাকচার ব্যবহার করা যেতে পারে। স্ট্রাকচারগুলি সম্পূর্ণ ধরনের হওয়ায়, স্ট্রাকচারগুলিকে স্ট্রাকচারের ভিতরে থাকতে দিয়ে অবাধে নেস্ট করা যায়।

struct Position {
x: i32;
y: i32;
}

struct Player {
name: str;
pos: Position;
}

নেস্ট হওয়া স্ট্রাকচারের ফিল্ডগুলিতে ডট নোটেশনধারক ব্যবহার করে অ্যাক্সেস করা হয়।

var p: Player = Player {
name: "Alice";
pos: Position { x: 10; y: 20; };
};

println("Player X: {}", p.pos.x);
println("Player Y: {}", p.pos.y);

স্ট্রাকচার লিটারালের ভিতরে অন্য স্ট্রাকচার লিটারাল নেস্ট করে লেখা যেতে পারে এবং এই ক্ষেত্রেও সমস্ত ফিল্ড আরম্ভ নিয়ম একইভাবে প্রযোজ্য।


স্ট্রাক্ট অ্যারে

স্ট্রাকচারগুলি অ্যারে উপাদানের প্রকার হিসেবে ব্যবহৃত হতে পারে। Wave-এর অ্যারে সিনট্যাক্স ব্যবহার করে array<প্রকার, দৈর্ঘ্য> এবং একে স্ট্রাকচার প্রকার হিসেবেও নির্ধারণ করা যেতে পারে।

var players: array<Player, 3> = [
Player { name: "A"; pos: Position { x: 1; y: 2; }; },
Player { name: "B"; pos: Position { x: 3; y: 4; }; },
Player { name: "C"; pos: Position { x: 5; y: 6; }; }
];

স্ট্রাকচার অ্যারের উপাদানে অ্যাক্সেস করতে প্রথমে অ্যারে সূচী যতটা ব্যবহৃত হবে তারপর ডট নোটেশন দিয়ে স্ট্রাকচারের ভিতরের ফিল্ডে অ্যাক্সেস করা হয়।

println("Second Player X: {}", players[1].pos.x);

স্ট্রাক্টের মৌলিক অপারেশন সম্ভব কিনা

Wave-এর স্ট্রাকচারগুলি ব্যবহারের জন্য সংজ্ঞায়িত টাইপ হওয়ায়, তারা গাণিতিক অপারেশন বা তুলনামূলক অপারেশনে স্বয়ংক্রিয়ভাবে অংশগ্রহণ করে না।

স্ট্রাকচারের সমতা তুলনা, বাছাই, হ্যাশিং, গাণিতিক অপারেশন ইত্যাদি প্রয়োজন হয় তবে এই পরিবেশের কাজগুলি একটি proto ব্লকের মাধ্যমে স্পষ্টভাবে সংজ্ঞায়িত করতে হবে। Wave স্ট্রাকচারের জন্য অপারেটর ওভারলোডিং সরবরাহ করে না এবং সমস্ত অপারেশন স্পষ্টভাবে সংজ্ঞায়িত না হওয়া পর্যন্ত কার্যনির্বাহ হয় না।