CodeGym /Java Blog /এলোমেলো /OOP নীতিমালা
John Squirrels
লেভেল 41
San Francisco

OOP নীতিমালা

এলোমেলো দলে প্রকাশিত
ওহে! আজকের পাঠে, আমরা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর নীতি সম্পর্কে কথা বলব। আপনি কি কখনও ভেবে দেখেছেন কেন জাভা ঠিক যেমন ডিজাইন করা হয়েছে? আমি বলতে চাচ্ছি, আপনি ক্লাস ঘোষণা করেন এবং ক্লাসের উপর ভিত্তি করে অবজেক্ট তৈরি করেন, ক্লাসের পদ্ধতি আছে ইত্যাদি। কিন্তু কেন ভাষা এমনভাবে গঠন করা হয় যাতে প্রোগ্রামগুলি ক্লাস এবং অবজেক্ট নিয়ে থাকে, অন্য কিছু নয়? কেন একটি "বস্তু" ধারণা উদ্ভাবিত এবং সামনে রাখা হয়েছিল? সব ভাষা এই ভাবে ডিজাইন করা হয়? যদি না হয়, এটা জাভা কি সুবিধা দেয়? আপনি দেখতে পাচ্ছেন, এখানে প্রচুর প্রশ্ন রয়েছে :) আসুন আজকের পাঠে তাদের প্রতিটির উত্তর দেওয়ার চেষ্টা করি।

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) কি?

অবশ্যই, জাভা শুধুমাত্র মজার জন্য অবজেক্ট এবং ক্লাস নিয়ে গঠিত নয়। তারা জাভা এর স্রষ্টাদের বাতিক নয়, এমনকি তাদের উদ্ভাবনও নয়। বস্তুর উপর ভিত্তি করে আরও অনেক ভাষা রয়েছে। প্রথম এই ধরনের ভাষা "সিমুলা" বলা হয়। এটি 1960-এর দশকে নরওয়েতে উদ্ভাবিত হয়েছিল। আরও কি, একটি "শ্রেণী" এবং "পদ্ধতি" এর ধারণাগুলি সিমুলাতে উপস্থিত হয়েছিল। সফ্টওয়্যার বিকাশের মান অনুসারে, "সিমুলা" একটি প্রাচীন ভাষার মতো মনে হয়, তবে যে কেউ জাভার সাথে এর "পারিবারিক সাদৃশ্য" দেখতে পারে। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর মূলনীতি - ১আপনি সম্ভবত এই ভাষায় লেখা কোডটি সহজেই পড়তে পারেন এবং এটি কী করে তা বিস্তৃত স্ট্রোকে ব্যাখ্যা করতে পারেন :)

Begin
	Class Rectangle (Width, Height); Real Width, Height;
			           
	 Begin
	    Real Area, Perimeter;  
	 
	    Procedure Update;      
	    Begin
	      Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
	      Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
	    End of Update;
	 
	    Update;               
	    OutText("Rectangle created: "); OutFix(Width,2,6);
	    OutFix(Height,2,6); OutImage;
	 End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;
			           
	Begin   	  
	    OutText("ColouredRectangle created, color = "); OutText(Color);
	    OutImage;
        End of ColouredRectangle;

 
      	 Ref(Rectangle) Cr;            
	 Cr :- New ColouredRectangle(10, 20, "Green"); 
End;
এই কোড নমুনা কোডটি Weekly-geekly দ্বারা "Simula - OOP এর 50 বছর" থেকে নেওয়া হয়েছে। আপনি দেখতে পাচ্ছেন, জাভা তার পিতামহ থেকে খুব বেশি আলাদা নয় :) এটি এই কারণে যে সিমুলার উপস্থিতি একটি নতুন ধারণার জন্ম দিয়েছে: অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং। উইকিপিডিয়া ওওপিকে এভাবে সংজ্ঞায়িত করে: "অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) হল "অবজেক্ট" এর ধারণার উপর ভিত্তি করে একটি প্রোগ্রামিং দৃষ্টান্ত, যেটিতে ডেটা থাকতে পারে, ফিল্ড আকারে (প্রায়শই অ্যাট্রিবিউট নামে পরিচিত), এবং কোড আকারে। পদ্ধতির (প্রায়শই পদ্ধতি হিসাবে পরিচিত)।" আমার মতে, এটি একটি সত্যিই ভাল সংজ্ঞা. আপনি জাভা শিখতে শুরু করেছেন এটা খুব বেশিদিন আগে হয়নি, কিন্তু এই সংজ্ঞায় সম্ভবত এমন কোনো শব্দ নেই যা আপনি জানেন না :) আজ ওওপি হল সবচেয়ে সাধারণ প্রোগ্রামিং পদ্ধতি। জাভা ছাড়াও, আপনি হয়তো শুনেছেন এমন অনেক জনপ্রিয় ভাষায় OOP নীতিগুলি ব্যবহার করা হয়। উদাহরণস্বরূপ, C++ (সক্রিয়ভাবে গেম ডেভেলপমেন্টে ব্যবহৃত), অবজেক্টিভ-সি এবং সুইফট (অ্যাপল ডিভাইসের জন্য প্রোগ্রাম লেখার জন্য ব্যবহৃত), পাইথন (মেশিন লার্নিংয়ে সবচেয়ে জনপ্রিয়), পিএইচপি (একটি জনপ্রিয় ওয়েব ডেভেলপমেন্ট ল্যাঙ্গুয়েজ), জাভাস্ক্রিপ্ট ( এটি কিসের জন্য ব্যবহার করা হয় না তা বলা সহজ) এবং আরও অনেক। সুতরাং, OOP এর নীতিগুলি কি যাইহোক? আমরা আপনাকে বিস্তারিত জানাব। যাইহোক OOP এর নীতিগুলি কি? আমরা আপনাকে বিস্তারিত জানাব। যাইহোক OOP এর নীতিগুলি কি? আমরা আপনাকে বিস্তারিত জানাব।

OOP নীতিমালা

এগুলো ফাউন্ডেশনের ভিত্তি। 4টি প্রধান বৈশিষ্ট্য যা একসাথে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং প্যারাডাইম গঠন করে। একজন সফল প্রোগ্রামার হওয়ার জন্য তাদের বোঝা অপরিহার্য।

নীতি 1. উত্তরাধিকার

সুসংবাদ: আপনি ইতিমধ্যে OOP এর কিছু নীতি জানেন! :) আমরা ইতিমধ্যে পাঠে কয়েকবার উত্তরাধিকারের সম্মুখীন হয়েছি, এবং আমরা এটি ব্যবহার করতে পেরেছি। উত্তরাধিকার এমন একটি প্রক্রিয়া যা আপনাকে একটি বিদ্যমান (অভিভাবক) শ্রেণীর উপর ভিত্তি করে একটি নতুন ক্লাস বর্ণনা করতে দেয়। এটি করতে গিয়ে, নতুন শ্রেণী মূল শ্রেণীর বৈশিষ্ট্য এবং কার্যকারিতা ধার করে। উত্তরাধিকার কিসের জন্য এবং এটি কি সুবিধা প্রদান করে? সর্বোপরি, কোড পুনঃব্যবহার। প্যারেন্ট ক্লাসে ঘোষিত ক্ষেত্র এবং পদ্ধতিগুলি বংশধর শ্রেণিতে ব্যবহার করা যেতে পারে। যদি সব ধরনের গাড়ির 10টি সাধারণ ক্ষেত্র এবং 5টি অভিন্ন পদ্ধতি থাকে, তাহলে আপনাকে কেবল সেগুলিকে অটোতে নিয়ে যেতে হবেঅভিভাবক শ্রেণী। আপনি কোন সমস্যা ছাড়াই বংশধর শ্রেণীতে তাদের ব্যবহার করতে পারেন। সলিড সুবিধা: উভয় পরিমাণগত (কম কোড) এবং ফলস্বরূপ, গুণগত (ক্লাসগুলি অনেক সহজ হয়ে যায়)। অধিকন্তু, উত্তরাধিকার খুবই নমনীয় — আপনি লিখতে আলাদা কার্যকারিতা যোগ করতে পারেন যা বংশধরদের অনুপস্থিত (কিছু ক্ষেত্র বা আচরণ যা একটি নির্দিষ্ট শ্রেণীর জন্য নির্দিষ্ট)। সাধারণভাবে, বাস্তব জীবনের মতো, আমরা সকলেই আমাদের পিতামাতার সাথে কিছুটা মিল, তবে তাদের থেকে কিছুটা আলাদা :)

নীতি 2. বিমূর্ততা

এটি একটি খুব সহজ নীতি। বিমূর্তকরণের অর্থ হল কোন কিছুর প্রধান, সবচেয়ে তাৎপর্যপূর্ণ বৈশিষ্ট্য সনাক্ত করা, একই সাথে ছোট এবং তুচ্ছ কিছুকে পরিত্যাগ করা। চাকা পুনরায় উদ্ভাবনের প্রয়োজন নেই। আসুন ক্লাস সম্পর্কে একটি পুরানো পাঠ থেকে একটি উদাহরণ স্মরণ করি। ধরুন আমরা কোম্পানির কর্মীদের জন্য একটি ফাইলিং সিস্টেম তৈরি করছি। "কর্মচারী" অবজেক্ট তৈরি করতে, আমরা একটি কর্মচারী ক্লাস লিখেছি । কোম্পানি ফাইলিং সিস্টেমে তাদের বর্ণনা করার জন্য কোন বৈশিষ্ট্যগুলি গুরুত্বপূর্ণ? নাম, জন্ম তারিখ, SSN, এবং কর্মচারী আইডি। কিন্তু এই ধরনের রেকর্ডের জন্য আমাদের কর্মচারীর উচ্চতা, চোখের রঙ বা চুলের রঙের প্রয়োজন হবে এমন সম্ভাবনা নেই। কোম্পানির একজন কর্মচারী সম্পর্কে এই ধরনের তথ্যের প্রয়োজন নেই। সুতরাং, কর্মচারী শ্রেণীতে, আমরা নিম্নলিখিত ভেরিয়েবলগুলি ঘোষণা করি:, int বয়স , int socialSecurityNumber , এবং int কর্মচারী আইডি । এবং আমরা চোখের রঙের মতো অপ্রয়োজনীয় তথ্যগুলিকে বিমূর্ত করি। যাইহোক, যদি আমরা একটি মডেলিং এজেন্সির জন্য ফাইলিং সিস্টেম তৈরি করি, পরিস্থিতি নাটকীয়ভাবে পরিবর্তিত হয়। একজন মডেলের উচ্চতা, চোখের রঙ এবং চুলের রঙ গুরুত্বপূর্ণ বৈশিষ্ট্য, কিন্তু তার SSN আমাদের কাছে একেবারেই অপ্রাসঙ্গিক। সুতরাং, মডেল ক্লাসে, আমরা নিম্নলিখিত ভেরিয়েবলগুলি তৈরি করি: স্ট্রিং উচ্চতা , স্ট্রিং চুল , স্ট্রিং চোখ

নীতি 3. এনক্যাপসুলেশন

আমরা ইতিমধ্যে এই মধ্যে চালানো হয়েছে. জাভাতে, এনক্যাপসুলেশন মানে ডেটা পড়ার এবং পরিবর্তন করার ক্ষমতা সীমাবদ্ধ করা। আপনি দেখতে পাচ্ছেন, শব্দটি "ক্যাপসুল" শব্দের উপর ভিত্তি করে। আমরা কিছু গুরুত্বপূর্ণ ডেটা লুকানোর জন্য একটি "ক্যাপসুল" ব্যবহার করব যা আমরা অন্যরা পরিবর্তন করতে চাই না। এখানে বাস্তব জীবন থেকে একটি সহজ উদাহরণ. আপনার একটি প্রথম নাম এবং একটি পদবি আছে। আপনার সব বন্ধু তাদের জানেন. কিন্তু তাদের আপনার প্রথম বা শেষ নাম পরিবর্তন করার ক্ষমতা নেই। আমরা বলতে পারি যে এটি করার প্রক্রিয়াটি আদালতের ব্যবস্থা দ্বারা "এনক্যাপসুলেটেড": আপনি শুধুমাত্র আদালতের ক্লার্কের মাধ্যমে আপনার শেষ নাম পরিবর্তন করতে পারেন এবং শুধুমাত্র আপনি এটি করতে পারেন। অন্যান্য "ব্যবহারকারীদের" আপনার প্রথম এবং শেষ নামের "শুধুমাত্র পাঠযোগ্য" অ্যাক্সেস রয়েছে :) আরেকটি দৃষ্টান্তমূলক উদাহরণ হল নগদ বাড়িতে রাখা। আপনার ঘরের মাঝখানে এটিকে সরল দৃষ্টিতে ছেড়ে দেওয়া ভাল ধারণা নয়। যেকোন "ব্যবহারকারী" (আপনার বাড়িতে আসা ব্যক্তি) আপনার অর্থের পরিমাণ পরিবর্তন করতে সক্ষম হবে, অর্থাৎ তারা আপনার টাকা নিতে পারবে। এটি একটি নিরাপদ মধ্যে আবদ্ধ করা ভাল হবে. তারপর অ্যাক্সেস শুধুমাত্র আপনার জন্য উপলব্ধ হবে এবং শুধুমাত্র একটি বিশেষ কোড ব্যবহার করে। এনক্যাপসুলেশনের সুস্পষ্ট উদাহরণ যেগুলির সাথে আপনি ইতিমধ্যে কাজ করেছেন তা হল অ্যাক্সেস মডিফায়ার (প্রাইভেট, পাবলিক, ইত্যাদি), সেইসাথে সেটার এবং গেটার। আপনি encapsulate না হলেবিড়াল শ্রেণীর বয়স ক্ষেত্র, তারপর যে কেউ লিখতে পারেন:

Cat.age = -1000;
এনক্যাপসুলেশন মেকানিজম আমাদের বয়সের ক্ষেত্রটিকে একটি সেটার পদ্ধতির মাধ্যমে রক্ষা করতে দেয়, যেখানে আমরা নিশ্চিত করতে পারি যে বয়স একটি ঋণাত্মক সংখ্যায় সেট করা যাবে না।

নীতি 4. বহুরূপতা

পলিমরফিজম হল বিভিন্ন ধরনের সাথে কাজ করার ক্ষমতা যেন তারা একই ধরনের। অধিকন্তু, বস্তুর আচরণ তাদের প্রকারের উপর নির্ভর করে ভিন্ন হবে। যে শব্দ জটিল? এর এখনই এটা বোঝা যাক. সবচেয়ে সহজ উদাহরণ নিন: প্রাণী। একটি একক স্পিক() পদ্ধতি এবং দুটি সাবক্লাস - ক্যাট এবং ডগ দিয়ে একটি প্রাণী ক্লাস তৈরি করুন ।

public class Animal {

   public void speak() {
      
       System.out.println("Hello!");
   }
}

public class Dog extends Animal {
  
   @Override
   public void speak() {
       System.out.println ("Woof-woof!");
   }
}

public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}
এখন আমরা একটি প্রাণী রেফারেন্স ভেরিয়েবল ঘোষণা করার চেষ্টা করব এবং এটিতে একটি কুকুর বস্তু বরাদ্দ করব।

public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.speak();
   }
}
কি পদ্ধতি বলা হবে বলে মনে করেন? Animal.speak() বা Dog.speak() ? কুকুর ক্লাসে পদ্ধতিটিকে বলা হবে: উফ-উফ! আমরা একটি প্রাণীর রেফারেন্স তৈরি করেছি, কিন্তু বস্তুটি কুকুরের মতো আচরণ করে । প্রয়োজনে, এটি একটি বিড়াল, ঘোড়া বা অন্য কোন প্রাণীর মতো আচরণ করতে পারে। গুরুত্বপূর্ণ বিষয় হল সাধারণ প্রাণী রেফারেন্স ভেরিয়েবলে একটি নির্দিষ্ট সাবক্লাস বরাদ্দ করা। এটি বোধগম্য হয়, কারণ সমস্ত কুকুর প্রাণী। যখন আমরা বলেছিলাম যে "বস্তুর আচরণ তাদের প্রকারের উপর নির্ভর করে ভিন্ন হবে।" যদি আমরা একটি বিড়াল বস্তু তৈরি করি ...

public static void main(String[] args) {

   Animal cat = new Cat();
   cat.speak();
}
স্পিক () পদ্ধতিটি "মিওউ!" প্রদর্শন করবে। কিন্তু 'অনেক ধরনের কাজ করার ক্ষমতা যেন একই ধরনের হয়' বলতে আমরা কী বুঝি? এটিও বেশ সোজা। আসুন কল্পনা করি যে আমরা পশুদের জন্য একটি নাপিত দোকান তৈরি করছি। আমাদের নাপিত দোকানের যেকোন প্রাণীকে ট্রিম দিতে সক্ষম হওয়া উচিত, তাই আমরা একটি প্রাণীর প্যারামিটার (প্রাণীটি চুল কাটার জন্য) সহ একটি ট্রিম() পদ্ধতি তৈরি করি।

public class AnimalBarbershop {

   public void trim(Animal animal) {

       System.out.println("The haircut is done!"); 
   }
}
এবং এখন আমরা Cat এবং Dog অবজেক্টকে trim() পদ্ধতিতে পাস করতে পারি!

public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.trim(cat);
   barbershop.trim(dog);
}
এবং এখানে স্পষ্ট উদাহরণ: অ্যানিমাল বারবারশপ ক্লাস বিড়াল এবং কুকুরের ধরনগুলির সাথে কাজ করে যেন তারা একই ধরণের। একই সময়ে, বিড়াল এবং কুকুরের বিভিন্ন আচরণ রয়েছে: তারা প্রত্যেকে আলাদাভাবে কথা বলে।

কেন আমরা OOP প্রয়োজন?

কেন ওওপি কখনও একটি নতুন প্রোগ্রামিং ধারণা হিসাবে উত্থিত হয়েছিল? প্রোগ্রামারদের কার্যকরী সরঞ্জাম ছিল, যেমন পদ্ধতিগত ভাষা। কি তাদের মৌলিকভাবে নতুন কিছু উদ্ভাবন করতে প্ররোচিত করেছিল? সর্বোপরি, তারা যে কাজের জটিলতার মুখোমুখি হয়েছিল। যদি 60 বছর আগে প্রোগ্রামারের কাজটি "কিছু গাণিতিক অভিব্যক্তি মূল্যায়ন" এর মত কিছু ছিল, এখন এটি এমন কিছু হতে পারে যেমন "স্টলকার গেমের জন্য 7টি ভিন্ন প্রান্ত প্রয়োগ করা, A, B, C, DE পয়েন্টে খেলোয়াড়ের সিদ্ধান্তের সমন্বয়ের উপর নির্ভর করে , এবং খেলায় এফ।" আপনি দেখতে পাচ্ছেন, গত কয়েক দশক ধরে কাজগুলি স্পষ্টতই আরও জটিল হয়ে উঠেছে। এবং ফলস্বরূপ, ডেটা প্রকারগুলি আরও জটিল হয়ে উঠেছে। এটি OOP উপস্থিত হওয়ার আরেকটি কারণ। একটি গাণিতিক অভিব্যক্তি সাধারণ আদিম ব্যবহার করে সহজেই মূল্যায়ন করা যেতে পারে। এখানে কোন বস্তুর প্রয়োজন নেই। কিন্তু গেমের শেষের কাজটি কাস্টম ক্লাস ব্যবহার না করে বর্ণনা করাও কঠিন হবে। এটি বলেছে, ক্লাস এবং অবজেক্ট ব্যবহার করে এটি বর্ণনা করা বেশ সহজ। স্পষ্টতই, আমাদের বেশ কয়েকটি ক্লাসের প্রয়োজন হবে: গেম, স্টকার, এন্ডিং, প্লেয়ার ডিসিশন, গেম ইভেন্ট এবং আরও অনেক কিছু। অন্য কথায়, এমনকি সমস্যার সমাধান শুরু না করেও, আমরা সহজেই আমাদের মাথায় একটি সমাধান "স্কেচ আউট" করতে পারি। কাজের ক্রমবর্ধমান জটিলতা প্রোগ্রামারদের তাদের অংশে বিভক্ত করতে বাধ্য করে। কিন্তু পদ্ধতিগত প্রোগ্রামিংয়ে এটি করা এত সহজ ছিল না। এবং প্রায়শই একটি প্রোগ্রাম একটি গাছের মতো ছিল যেখানে প্রচুর শাখা রয়েছে যা কার্যকর করার সম্ভাব্য সমস্ত পথকে উপস্থাপন করে। নির্দিষ্ট শর্তের উপর নির্ভর করে, প্রোগ্রামের একটি শাখা বা অন্যটি কার্যকর করা হয়েছিল। ছোট প্রোগ্রামগুলির জন্য, এটি সুবিধাজনক ছিল, তবে একটি বড় সমস্যাকে অংশে ভাগ করা খুব কঠিন ছিল। এটি OOP এর উত্থানের আরেকটি কারণ ছিল। এই দৃষ্টান্তটি প্রোগ্রামারদের একটি প্রোগ্রামকে "মডিউল" (ক্লাস) এর একটি গুচ্ছে বিভক্ত করার ক্ষমতা দিয়েছে, যার প্রত্যেকটি কাজের নিজস্ব অংশ করে। একে অপরের সাথে যোগাযোগের মাধ্যমে, সমস্ত বস্তু আমাদের প্রোগ্রামের কাজ সম্পন্ন করে। উপরন্তু, আমরা প্রোগ্রামের অন্য কোথাও আমাদের কোড পুনরায় ব্যবহার করতে পারি, যা অনেক সময় বাঁচায়।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION