ফাংশনাল প্রোগ্রামিং বনাম অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং - পর্ব এক
উইকিপিডিয়ার মতে,
In computer science, functional programming is a programming paradigm where programs are constructed by applying and composing functions.
এবং
Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data, in the form of fields (often known as attributes or properties), and code, in the form of procedures (often known as methods).
সহজ কথায়, কতগুলো ফাংশন লিখে যদি সম্পূর্ন একটি প্রোগ্রাম তৈরি ফেলা যায় তাহলে তাকেই ফাংশনাল প্রোগ্রামিং বলে। অন্যদিকে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং হচ্ছে অবজেক্ট বেজড অর্থাৎ যা কিছুই আমরা করি না কেন অবজেক্ট দিয়ে করতে হবে। Object শব্দের বাংলা প্রতিশব্দ হচ্ছে বস্তু। না, এখানে পদার্থ বিজ্ঞানের বস্তু টেনে আনলে কিন্তু হবে না। পদার্থ বিজ্ঞানের ভাষায় যা কিছুর প্রাণ আছে তা জীব আর বাদ বাকি সব জড় পদার্থ বা বস্তু। তবে প্রোগ্রামিং এ প্রাণ থাকুক আর না থাকুক সব ই কিন্তু বস্তু।
এখন একটি বস্তুর নিশ্চয়ই নির্দিষ্ট কিছু বৈশিষ্ট্য এবং আচরণ থাকবে? যেমন গাড়ীকে যদি আমরা একটি অবজেক্ট হিসেবে বিবেচনা করি তাহলে এর বৈশিষ্ট্য হতে পারে মডেল নাম্বার, রঙ, মূল্য, গতি প্রভৃতি। আর আচরণ হতে পারে স্টার্ট করা, ব্রেক করা, চালানো, গতি পরিবর্তন প্রভৃতি। অবজেক্টের বৈশিষ্ট্য গুলোকে প্রোগ্রামিং এর ভাষায় বলা হয় প্রোপার্টি বা এট্টিবিউট আর আচরণ গুলোকে বলা হয় মেথড।
কোন বস্তুর বৈশিষ্ট্য এবং আচরণ সমূহ একটি নির্দিষ্ট ক্লাসে এনক্যাপসুলেট করে প্রোগ্রামের বিভিন্ন জায়গায় ব্যবহার করাই হচ্ছে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং। আচ্ছা! ক্লাস আর এনক্যাপসুলেট এসব আবার কি? অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর ফিচার বা পিলার হচ্ছে চারটি। যথাঃ ১। অ্যাবস্ট্রাকশন, ২। এনক্যাপসুলেশন, ৩। ইনহেরিটেন্স এবং ৪। পলিমরফিজম। একটি সহজ অ্যাক্রনেমের সাহায্যে এই চারটি কী-ওয়ার্ড আমরা মনে রাখতে পারি। অ্যাক্রনেম টি হলঃ A PIE.
A - Abstraction
P - Polymorphism
I - Inheritance
E - Encapsulation
তাহলে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর মূল কনসেপ্ট গুলো হলঃ ক্লাস, অবজেক্ট, অ্যাবস্ট্রাকশন, এনক্যাপসুলেশন, ইনহেরিটেন্স এবং পলিমরফিজম। এগুলো সম্পর্কে পরবর্তী পর্ব গুলোতে আমরা বিস্তারিত জানবো। (এই ছয়টি কনসেপ্ট ছাড়াও অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর আরও কিছু কনসেপ্ট আছে সেগুলো হলঃ এসোসিয়েশন, কম্পোজিশন এবং এগ্রিগেশন। অবজেক্ট ওরিয়েন্টেড ডিজাইন ও এনালাইসিস সিরিজে আমরা এসব সম্পর্কে জানবো।)
এখন কথা হচ্ছে,
কোন বস্তুর বৈশিষ্ট্য এবং আচরণ সমূহ একটি নির্দিষ্ট ক্লাসে এনক্যাপসুলেট করে প্রোগ্রামের বিভিন্ন জায়গায় ব্যবহার করাই হচ্ছে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং।
এই কথাটা তো ঠিক বোঝা গেল না! সত্যি কথা বলতে, ভালো ভাবে বুঝতে গেলে আমাদের আগে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর ছয়টি কনসেপ্ট সম্পর্কে পরিষ্কার ধারণা থাকতে হবে। তবে আমরা একটি ডেমো কোড দেখলে এটলিস্ট আন্দাজ করতে পারবো যে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কিভাবে কাজ করে।
ধরা যাক আমরা "অমুক সফটওয়্যার" কোম্পানি তে সফটওয়্যার ইঞ্জিনিয়ার হিসেবে কাজ করি। তো এক ক্লায়েন্ট আসলেন আমাদের কাছে চতুর্ভূজের ক্ষেত্রফল নির্ণয় করার একটি প্রোগ্রাম তৈরি করার আবদার নিয়ে। এখানে ক্লায়েন্ট নিজেও কিন্তু প্রোগ্রামার। সে আমাদের লিখা প্রোগ্রাম টি তার নিজের প্রজেক্টে ব্যবহার করতে চায়। সময় স্বল্পতার কারণে সে আমাদের কাছে এসেছে। দেখি আমরা তাকে সাহায্য করতে পারি কী না! যাই হোক, আমরা প্রথম তাকে ফাংশনাল প্রোগ্রামিং টেকনিক ব্যবহার করে একটি প্রোগ্রাম লিখে দিলাম। প্রোগ্রাম টি দেখতে নিচের মত হলঃ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static decimal CalculateArea(decimal height, decimal width) | |
{ | |
return height * width; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void Main(string[] args) | |
{ | |
var height = 20m, width = 10m; | |
var area = CalculateArea(height, width); | |
Console.WriteLine(area); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Rectangle | |
{ | |
private decimal _height, _width; | |
public decimal Height | |
{ | |
get => _height > 0 ? _height : 0; | |
set => _height = value; | |
} | |
public decimal Width | |
{ | |
get => _width > 0 ? _width : 0; | |
set => _width = value; | |
} | |
public decimal CalculateArea() | |
{ | |
return _height * _width; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void Main(string[] args) | |
{ | |
Rectangle rectangle = new Rectangle(); | |
rectangle.Height = 20m; | |
rectangle.Width = 10m; | |
var area = rectangle.CalculateArea(); | |
Console.WriteLine(area); | |
} |
অবজেক্ট ওরিয়েন্টেড টেকনিকে কোড করার একটি সুবিধা হচ্ছে কোড পুনরায় ব্যবহার করতে পারা। অর্থাৎ ডুপ্লিকেট কোড লিখার প্রয়োজন নেই। ধরুন, আমাদের ক্লায়েন্ট অন্য একটি সমস্যা সমাধান করার সময় ও খেয়াল করল যে তার চতুর্ভুজের ক্ষেত্রফল বের করতে হচ্ছে তাহলে সে যদি আমাদের আগের ফাংশনাল প্রোগ্রামিং এ করা কোড টুকু ইউজ করে তাহলে তাকে সেই নতুন প্রোগ্রামটি তে আমাদের লিখা ফাংশন টা কপি পেস্ট করে ব্যবহার করতে হবে। আর সে যদি আমাদের অবজেক্ট ওরিয়েন্টেড টেকনিক ব্যবহার করা কোড টা নেয় তাহলে শুধু চতুর্ভুজ ক্লাসের একটি অবজেক্ট বানিয়ে নিলেই কাজ হয়ে যাবে। এমনকি পরবর্তীতে যদি আমাদের কোডে কোন প্রকার পরিবর্তন প্রয়োজন হয় তাহলে শুধু চতুর্ভূজ ক্লাসে পরিবর্তন করলেই হবে। ক্লায়েন্ট কোডে কোন পরিবর্তন করতে হবে না।
এছাড়া অবজেক্ট ওরিয়েন্টেড টেকনিকে কোড করলে আমরা সলিড প্রিন্সিপালস মেনে কোড করতে পারবো। আমাদের কোড ক্লিন থাকবে, যে কেউ রি-ইউজ করতে পারবে। সবচেয়ে বড় কথা আমরা খুব সহজে আমাদের কোড টেস্ট করতে পারব।
হ্যাঁ! ফাংশনাল প্রোগ্রামিং হয়তো সোজা। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং শিখতে বা বুঝতে প্রথমে হয়তো একটু সময় লাগতে পারে তবে পরবর্তীতে এটা আপনার যে পরিমাণ সময় বাঁচিয়ে দিবে তা আপনি কল্পনাও করতে পারবেন না! প্রকৃতপক্ষে কেউ যদি একবার অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভালো ভাবে বুঝে যায় সে জীবনেও আর ফাংশনাল প্রোগ্রামিং করে কোন অ্যাপ্লিকেশন লিখতে চাইবে না।
হ্যাঁ! যদি কোন ছোট সমস্যার সমাধান করতে হয় তাহলে দিব্যি আপনি ফাংশনাল প্রোগ্রামিং ব্যবহার করতে পারেন। যেমন কম্পিটিটিভ প্রোগ্রামিং এ আমাদের খুব একটা অবজেক্ট ওরিয়েন্টেড কনসেপ্টের দরকার হয় না। কারণ প্রোগ্রাম টা আমরা আর রি-ইউজ করি না। তবে আপনি যদি বড় কোন অ্যাপ্লিকেশন লিখতে চান যেটাতে কিনা প্রতিনিয়ত নতুন নতুন ফিচার যোগ হবে বা পরিবর্তন হবে তাহলে আপনাকে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ব্যবহার করতে হবে।
ভাবুন! এরকম পাঁচ-দশ হাজার ফাংশন যদি আপনার প্রোগ্রামে থাকে তাহলে তা মেইনটেইন করা কত কঠিন হবে। এছাড়া পুনরায় ব্যবহারযোগ্য কোড লিখতে না পারার কারণে আপনার প্রোগ্রামে কোড ডুপ্লিকেশন হবে যা কিনা প্রোডাক্টিভিটি কমিয়ে দিবে। কখনো কোথাও কোন পরিবর্তন করতে হলে একাধিক জায়গায় পরিবর্তন করতে হবে। বাগ সলভিং এবং কোড ডেপ্লোয় করা আপনার জন্য রীতিমত আতঙ্কের নামে পরিণত হবে।
তো সারমর্ম হচ্ছে, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং টেকনিক ব্যবহার করে কোড করলে আমরা ক্লিন এবং রি-ইউজ্যাবল কোড লিখতে পারব যা কিনা আমাদের প্রচুর সময় বাঁচিয়ে দিবে।
আজকে এই পর্যন্তই! পরবর্তী পর্বে আমরা ক্লাস নিয়ে আলোচনা করব।
0 মন্তব্য(গুলি)