যদিও, পলিমারফিজমটি ইতিমধ্যে এই পোস্টে দুর্দান্ত বিবরণে ব্যাখ্যা করা হয়েছে তবে আমি কেন এটির অংশ নিয়ে আরও জোর দিতে চাই।
যে কোনও ওওপি ভাষায় পলিমারফিজম কেন এত গুরুত্বপূর্ণ।
আসুন উত্তরাধিকার / পলিমॉर्फিজম এবং এর সাথে একটি টিভিতে একটি সাধারণ অ্যাপ্লিকেশন তৈরি করার চেষ্টা করি। অ্যাপ্লিকেশনটির প্রতিটি সংস্করণ পোস্ট করুন, আমরা একটি ছোট প্রাকট্রিসিপেক্টিভ করি।
ধরুন, আপনি একটি টিভি সংস্থার একটি সফটওয়্যার ইঞ্জিনিয়ার এবং আপনাকে ব্যবহারকারী কমান্ডের মান বাড়ানোর এবং হ্রাস করার জন্য আপনাকে ভলিউম, উজ্জ্বলতা এবং রঙ নিয়ন্ত্রকদের জন্য সফ্টওয়্যার লিখতে বলা হয়েছে।
আপনি এই বৈশিষ্ট্যগুলির প্রতিটিটির জন্য লেখার ক্লাস যুক্ত করে শুরু করুন
- সেট: - একটি নিয়ামকের মান নির্ধারণ করতে। (মনে করুন এটির নিয়ামকের নির্দিষ্ট কোড রয়েছে)
- পান: - একটি নিয়ামকের মান পেতে। (ধরুন এটিতে নিয়ামকের নির্দিষ্ট কোড রয়েছে)
- সামঞ্জস্য করুন: - ইনপুটটি বৈধকরণ এবং একটি নিয়ামক সেট করতে Gen (জেনেরিক বৈধতা .. নিয়ন্ত্রকদের থেকে পৃথক)
- নিয়ামকদের সাথে ব্যবহারকারী ইনপুট ম্যাপিং: - ব্যবহারকারী ইনপুট এবং তদনুসারে নিয়ন্ত্রকগুলিকে আহরণ করতে।
অ্যাপ্লিকেশন সংস্করণ 1
import java.util.Scanner;
class VolumeControllerV1 {
private int value;
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of VolumeController \t"+this.value);
this.value = value;
System.out.println("New value of VolumeController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class BrightnessControllerV1 {
private int value;
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of BrightnessController \t"+this.value);
this.value = value;
System.out.println("New value of BrightnessController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class ColourControllerV1 {
private int value;
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of ColourController \t"+this.value);
this.value = value;
System.out.println("New value of ColourController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
/*
* There can be n number of controllers
* */
public class TvApplicationV1 {
public static void main(String[] args) {
VolumeControllerV1 volumeControllerV1 = new VolumeControllerV1();
BrightnessControllerV1 brightnessControllerV1 = new BrightnessControllerV1();
ColourControllerV1 colourControllerV1 = new ColourControllerV1();
OUTER: while(true) {
Scanner sc=new Scanner(System.in);
System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
System.out.println("Press any other Button to shutdown");
int button = sc.nextInt();
switch (button) {
case 1: {
volumeControllerV1.adjust(5);
break;
}
case 2: {
volumeControllerV1.adjust(-5);
break;
}
case 3: {
brightnessControllerV1.adjust(5);
break;
}
case 4: {
brightnessControllerV1.adjust(-5);
break;
}
case 5: {
colourControllerV1.adjust(5);
break;
}
case 6: {
colourControllerV1.adjust(-5);
break;
}
default:
System.out.println("Shutting down...........");
break OUTER;
}
}
}
}
এখন আপনার কাছে আমাদের প্রয়োগের প্রথম সংস্করণ স্থাপনের জন্য প্রস্তুত। এখন পর্যন্ত করা কাজ বিশ্লেষণ করার সময়।
টিভি অ্যাপ্লিকেশন সংস্করণে সমস্যাগুলি 1
- অ্যাডজাস্ট (ইনট মান) কোডটি তিনটি শ্রেণিতেই সদৃশ। আপনি কোড সদৃশটি ছোট করতে চান like (তবে আপনি ডুপ্লিকেট কোড এড়াতে সাধারণ কোড এবং এটিকে কিছু সুপার ক্লাসে নিয়ে যাওয়া ভাবেননি)
আপনার আবেদন যতক্ষণ প্রত্যাশা অনুযায়ী কাজ করবে আপনি ততক্ষণ তার সাথে বেঁচে থাকার সিদ্ধান্ত নিয়েছেন।
কখনও কখনও পরে, আপনার বস আপনার কাছে ফিরে আসে এবং আপনাকে বিদ্যমান অ্যাপ্লিকেশনটিতে পুনরায় সেট করার কার্যকারিতা যুক্ত করতে বলে। রিসেটটি সমস্ত 3 টি তাদের নিজস্ব ডিফল্ট মানগুলিতে নিয়ামক সেট করে।
আপনি নতুন কার্যকারিতার জন্য একটি নতুন ক্লাস (রিসেটফিউশনভি 2) লেখা শুরু করেন এবং এই নতুন বৈশিষ্ট্যের জন্য ব্যবহারকারী ইনপুট ম্যাপিং কোডটি মানচিত্র করুন।
অ্যাপ্লিকেশন সংস্করণ 2
import java.util.Scanner;
class VolumeControllerV2 {
private int defaultValue = 25;
private int value;
int getDefaultValue() {
return defaultValue;
}
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of VolumeController \t"+this.value);
this.value = value;
System.out.println("New value of VolumeController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class BrightnessControllerV2 {
private int defaultValue = 50;
private int value;
int get() {
return value;
}
int getDefaultValue() {
return defaultValue;
}
void set(int value) {
System.out.println("Old value of BrightnessController \t"+this.value);
this.value = value;
System.out.println("New value of BrightnessController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class ColourControllerV2 {
private int defaultValue = 40;
private int value;
int get() {
return value;
}
int getDefaultValue() {
return defaultValue;
}
void set(int value) {
System.out.println("Old value of ColourController \t"+this.value);
this.value = value;
System.out.println("New value of ColourController \t"+this.value);
}
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class ResetFunctionV2 {
private VolumeControllerV2 volumeControllerV2 ;
private BrightnessControllerV2 brightnessControllerV2;
private ColourControllerV2 colourControllerV2;
ResetFunctionV2(VolumeControllerV2 volumeControllerV2, BrightnessControllerV2 brightnessControllerV2, ColourControllerV2 colourControllerV2) {
this.volumeControllerV2 = volumeControllerV2;
this.brightnessControllerV2 = brightnessControllerV2;
this.colourControllerV2 = colourControllerV2;
}
void onReset() {
volumeControllerV2.set(volumeControllerV2.getDefaultValue());
brightnessControllerV2.set(brightnessControllerV2.getDefaultValue());
colourControllerV2.set(colourControllerV2.getDefaultValue());
}
}
/*
* so on
* There can be n number of controllers
*
* */
public class TvApplicationV2 {
public static void main(String[] args) {
VolumeControllerV2 volumeControllerV2 = new VolumeControllerV2();
BrightnessControllerV2 brightnessControllerV2 = new BrightnessControllerV2();
ColourControllerV2 colourControllerV2 = new ColourControllerV2();
ResetFunctionV2 resetFunctionV2 = new ResetFunctionV2(volumeControllerV2, brightnessControllerV2, colourControllerV2);
OUTER: while(true) {
Scanner sc=new Scanner(System.in);
System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
int button = sc.nextInt();
switch (button) {
case 1: {
volumeControllerV2.adjust(5);
break;
}
case 2: {
volumeControllerV2.adjust(-5);
break;
}
case 3: {
brightnessControllerV2.adjust(5);
break;
}
case 4: {
brightnessControllerV2.adjust(-5);
break;
}
case 5: {
colourControllerV2.adjust(5);
break;
}
case 6: {
colourControllerV2.adjust(-5);
break;
}
case 7: {
resetFunctionV2.onReset();
break;
}
default:
System.out.println("Shutting down...........");
break OUTER;
}
}
}
}
রিসেট বৈশিষ্ট্য সহ আপনার অ্যাপ্লিকেশন প্রস্তুত রয়েছে। তবে, এখন আপনি এটি বুঝতে শুরু করেন
টিভি অ্যাপ্লিকেশন সংস্করণ 2-এ ইস্যু
- যদি পণ্যটিতে একটি নতুন নিয়ন্ত্রক প্রবর্তিত হয়, আপনাকে রিসেট বৈশিষ্ট্য কোডটি পরিবর্তন করতে হবে।
- যদি কন্ট্রোলারের গণনা খুব বেশি বৃদ্ধি পায় তবে আপনার নিয়ন্ত্রণকারীদের রেফারেন্স ধরে রাখতে সমস্যা হবে।
- রিসেট বৈশিষ্ট্য কোডটি সমস্ত নিয়ামক শ্রেণীর কোডের সাথে (ডিফল্ট মান পেতে এবং সেট করতে) শক্তভাবে মিলিত হয়।
- রিসেট বৈশিষ্ট্য শ্রেণি (রিসেটফিউশনভি 2) কন্ট্রোলার শ্রেণির (সামঞ্জস্য) এর অন্য পদ্ধতি অ্যাক্সেস করতে পারে যা অনাকাঙ্ক্ষিত।
একই সময়ে, আপনি বসের কাছ থেকে শুনেছেন যে আপনাকে একটি বৈশিষ্ট্য যুক্ত করতে হতে পারে যার মাধ্যমে প্রতিটি কন্ট্রোলারকে ইন্টারনেটের মাধ্যমে কোম্পানির হোস্ট করা ড্রাইভার সংগ্রহস্থল থেকে ড্রাইভারের সর্বশেষ সংস্করণটি পরীক্ষা করতে হবে।
এখন আপনি ভাবতে শুরু করেছেন যে এই নতুন বৈশিষ্ট্যটি যুক্ত করা হবে সেটি পুনরায় সেট বৈশিষ্ট্যটির সাথে সাদৃশ্যযুক্ত এবং অ্যাপ্লিকেশনগুলির ইস্যু (ভি 2) এর সাথে মিলে যায় যদি আপনি নিজের অ্যাপ্লিকেশনটিকে পুনরায় ফ্যাক্টর না করেন তবে গুণিত হবে।
আপনি উত্তরাধিকার ব্যবহারের কথা ভাবতে শুরু করেন যাতে আপনি জাভা এর পলিমারফিক ক্ষমতা থেকে সুবিধা নিতে পারেন এবং আপনি একটি নতুন বিমূর্ত শ্রেণি (কন্ট্রোলারভি 3) যুক্ত করতে পারেন
- গেট অ্যান্ড সেট পদ্ধতির স্বাক্ষর ঘোষণা করুন।
- সমন্বিত পদ্ধতি বাস্তবায়ন যা এর আগে সমস্ত নিয়ামকের মধ্যে প্রতিলিপি করা হয়েছিল।
- সেটডাফল্ট পদ্ধতিটি ঘোষণা করুন যাতে পুনরায় সেট বৈশিষ্ট্যটি বহুবর্ষবাদ উপকারের মাধ্যমে সহজেই প্রয়োগ করা যায়।
এই উন্নতিগুলির সাথে, আপনার সাথে আপনার টিভি অ্যাপ্লিকেশনটির 3 সংস্করণ প্রস্তুত রয়েছে।
অ্যাপ্লিকেশন সংস্করণ 3
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
abstract class ControllerV3 {
abstract void set(int value);
abstract int get();
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
abstract void setDefault();
}
class VolumeControllerV3 extends ControllerV3 {
private int defaultValue = 25;
private int value;
public void setDefault() {
set(defaultValue);
}
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of VolumeController \t"+this.value);
this.value = value;
System.out.println("New value of VolumeController \t"+this.value);
}
}
class BrightnessControllerV3 extends ControllerV3 {
private int defaultValue = 50;
private int value;
public void setDefault() {
set(defaultValue);
}
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of BrightnessController \t"+this.value);
this.value = value;
System.out.println("New value of BrightnessController \t"+this.value);
}
}
class ColourControllerV3 extends ControllerV3 {
private int defaultValue = 40;
private int value;
public void setDefault() {
set(defaultValue);
}
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of ColourController \t"+this.value);
this.value = value;
System.out.println("New value of ColourController \t"+this.value);
}
}
class ResetFunctionV3 {
private List<ControllerV3> controllers = null;
ResetFunctionV3(List<ControllerV3> controllers) {
this.controllers = controllers;
}
void onReset() {
for (ControllerV3 controllerV3 :this.controllers) {
controllerV3.setDefault();
}
}
}
/*
* so on
* There can be n number of controllers
*
* */
public class TvApplicationV3 {
public static void main(String[] args) {
VolumeControllerV3 volumeControllerV3 = new VolumeControllerV3();
BrightnessControllerV3 brightnessControllerV3 = new BrightnessControllerV3();
ColourControllerV3 colourControllerV3 = new ColourControllerV3();
List<ControllerV3> controllerV3s = new ArrayList<>();
controllerV3s.add(volumeControllerV3);
controllerV3s.add(brightnessControllerV3);
controllerV3s.add(colourControllerV3);
ResetFunctionV3 resetFunctionV3 = new ResetFunctionV3(controllerV3s);
OUTER: while(true) {
Scanner sc=new Scanner(System.in);
System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
int button = sc.nextInt();
switch (button) {
case 1: {
volumeControllerV3.adjust(5);
break;
}
case 2: {
volumeControllerV3.adjust(-5);
break;
}
case 3: {
brightnessControllerV3.adjust(5);
break;
}
case 4: {
brightnessControllerV3.adjust(-5);
break;
}
case 5: {
colourControllerV3.adjust(5);
break;
}
case 6: {
colourControllerV3.adjust(-5);
break;
}
case 7: {
resetFunctionV3.onReset();
break;
}
default:
System.out.println("Shutting down...........");
break OUTER;
}
}
}
}
যদিও ভি 2 এর ইস্যু তালিকায় তালিকাভুক্ত বেশিরভাগ ইস্যুকে সম্বোধন করা হয়েছে
টিভি অ্যাপ্লিকেশন সংস্করণ 3 এ ইস্যু
- রিসেট বৈশিষ্ট্য শ্রেণি (রিসেটফিউশনভি 3) কন্ট্রোলার শ্রেণির (সামঞ্জস্য) এর অন্য পদ্ধতি অ্যাক্সেস করতে পারে যা অনাকাঙ্ক্ষিত।
আবার, আপনি এই সমস্যাটি সমাধান করার কথা ভাবেন, এখনকার মতো কার্যকর করার জন্য আপনার কাছে আরও একটি বৈশিষ্ট্য রয়েছে (শুরুতে ড্রাইভার আপডেট)। আপনি যদি এটি ঠিক না করেন তবে এটি নতুন বৈশিষ্ট্যগুলিতেও প্রতিলিপি তৈরি হবে।
সুতরাং আপনি বিমূর্ত শ্রেণিতে সংজ্ঞায়িত চুক্তিটি ভাগ করে নিন এবং এর জন্য 2 টি ইন্টারফেস লিখুন
- বৈশিষ্ট্য পুনরায় সেট করুন।
- ড্রাইভার আপডেট।
এবং আপনার 1 ম কংক্রিট ক্লাসটি নীচের মতগুলি প্রয়োগ করুন
অ্যাপ্লিকেশন সংস্করণ 4
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
interface OnReset {
void setDefault();
}
interface OnStart {
void checkForDriverUpdate();
}
abstract class ControllerV4 implements OnReset,OnStart {
abstract void set(int value);
abstract int get();
void adjust(int value) {
int temp = this.get();
if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0))) {
System.out.println("Can not adjust any further");
return;
}
this.set(temp + value);
}
}
class VolumeControllerV4 extends ControllerV4 {
private int defaultValue = 25;
private int value;
@Override
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of VolumeController \t"+this.value);
this.value = value;
System.out.println("New value of VolumeController \t"+this.value);
}
@Override
public void setDefault() {
set(defaultValue);
}
@Override
public void checkForDriverUpdate() {
System.out.println("Checking driver update for VolumeController .... Done");
}
}
class BrightnessControllerV4 extends ControllerV4 {
private int defaultValue = 50;
private int value;
@Override
int get() {
return value;
}
@Override
void set(int value) {
System.out.println("Old value of BrightnessController \t"+this.value);
this.value = value;
System.out.println("New value of BrightnessController \t"+this.value);
}
@Override
public void setDefault() {
set(defaultValue);
}
@Override
public void checkForDriverUpdate() {
System.out.println("Checking driver update for BrightnessController .... Done");
}
}
class ColourControllerV4 extends ControllerV4 {
private int defaultValue = 40;
private int value;
@Override
int get() {
return value;
}
void set(int value) {
System.out.println("Old value of ColourController \t"+this.value);
this.value = value;
System.out.println("New value of ColourController \t"+this.value);
}
@Override
public void setDefault() {
set(defaultValue);
}
@Override
public void checkForDriverUpdate() {
System.out.println("Checking driver update for ColourController .... Done");
}
}
class ResetFunctionV4 {
private List<OnReset> controllers = null;
ResetFunctionV4(List<OnReset> controllers) {
this.controllers = controllers;
}
void onReset() {
for (OnReset onreset :this.controllers) {
onreset.setDefault();
}
}
}
class InitializeDeviceV4 {
private List<OnStart> controllers = null;
InitializeDeviceV4(List<OnStart> controllers) {
this.controllers = controllers;
}
void initialize() {
for (OnStart onStart :this.controllers) {
onStart.checkForDriverUpdate();
}
}
}
/*
* so on
* There can be n number of controllers
*
* */
public class TvApplicationV4 {
public static void main(String[] args) {
VolumeControllerV4 volumeControllerV4 = new VolumeControllerV4();
BrightnessControllerV4 brightnessControllerV4 = new BrightnessControllerV4();
ColourControllerV4 colourControllerV4 = new ColourControllerV4();
List<ControllerV4> controllerV4s = new ArrayList<>();
controllerV4s.add(brightnessControllerV4);
controllerV4s.add(volumeControllerV4);
controllerV4s.add(colourControllerV4);
List<OnStart> controllersToInitialize = new ArrayList<>();
controllersToInitialize.addAll(controllerV4s);
InitializeDeviceV4 initializeDeviceV4 = new InitializeDeviceV4(controllersToInitialize);
initializeDeviceV4.initialize();
List<OnReset> controllersToReset = new ArrayList<>();
controllersToReset.addAll(controllerV4s);
ResetFunctionV4 resetFunctionV4 = new ResetFunctionV4(controllersToReset);
OUTER: while(true) {
Scanner sc=new Scanner(System.in);
System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
int button = sc.nextInt();
switch (button) {
case 1: {
volumeControllerV4.adjust(5);
break;
}
case 2: {
volumeControllerV4.adjust(-5);
break;
}
case 3: {
brightnessControllerV4.adjust(5);
break;
}
case 4: {
brightnessControllerV4.adjust(-5);
break;
}
case 5: {
colourControllerV4.adjust(5);
break;
}
case 6: {
colourControllerV4.adjust(-5);
break;
}
case 7: {
resetFunctionV4.onReset();
break;
}
default:
System.out.println("Shutting down...........");
break OUTER;
}
}
}
}
এখন আপনার দ্বারা মোকদ্দমার সমস্ত সমস্যার সমাধান হয়ে গেছে এবং আপনি বুঝতে পেরেছেন যে উত্তরাধিকার এবং পলিমারফিজমের ব্যবহারের সাহায্যে আপনি
- আবেদনের বিভিন্ন অংশটি শিথিলভাবে একত্রে রাখুন। (রিসেট বা ড্রাইভার আপডেট বৈশিষ্ট্য উপাদানগুলিকে প্রকৃত নিয়ামক শ্রেণীর (ভলিউম, উজ্জ্বলতা এবং রঙ) সম্পর্কে সচেতন করার দরকার নেই, অনারসেট বা অন স্টার্ট প্রয়োগকারী কোনও শ্রেণীর পুনরায় সেট বা ড্রাইভার আপডেট বৈশিষ্ট্যটিতে গ্রহণযোগ্য হবে) উপাদান যথাক্রমে)।
- অ্যাপ্লিকেশন বর্ধন সহজতর হয়ে উঠেছে control
- বিমূর্ততার স্তরটি রাখুন Now
আশাকরি এটা সাহায্য করবে :-)