সম্পাদনা: আমি এই প্রশ্নের উত্তর দিয়েছি কারণ এখানে প্রচুর লোকেরা জিজ্ঞাসা করছে প্রোগ্রামিং শিখছে, এবং বেশিরভাগ উত্তর খুব প্রযুক্তিগতভাবে দক্ষ, তবে আপনি বুঝতে পারছেন না যে আপনি কোনও নবাগত। আমরা সবাই নবাগত ছিলাম, তাই আমি ভেবেছিলাম আমি আরও নবাগত বন্ধুত্বপূর্ণ উত্তরে আমার হাতটি চেষ্টা করব।
দুটি প্রধান বিষয় হ'ল বহুমুখীতা এবং বৈধতা। এমনকি যদি এটি কেবল একটি বোকা ডেটা কাঠামো।
ধরা যাক আমাদের এই সাধারণ বর্গ রয়েছে:
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
একটি খুব সাধারণ শ্রেণি যা এটিতে তরল কী পরিমাণ এবং এর ক্ষমতা (মিলিলিটারে) কী তা ধারণ করে।
আমি যখন করি তখন কী হয়:
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
ঠিক আছে, আপনি আশা করেন না যে এটি কাজ করবে, তাই না? আপনি চান কিছু ধরণের বিলোপযুক্ত পরীক্ষা। এবং সবচেয়ে খারাপ, আমি যদি সর্বাধিক ক্ষমতা নির্দিষ্ট না করি তবে কী হবে? ওহে প্রিয়, আমাদের সমস্যা আছে।
তবে আরও একটি সমস্যা আছে। বোতলগুলি কেবল এক ধরণের ধারক হলে কী হবে? আমাদের যদি বেশ কয়েকটি ধারক থাকে, সমস্ত ক্ষমতা এবং পরিমাণে তরল ভরা থাকে? যদি আমরা কেবল একটি ইন্টারফেস তৈরি করতে পারি, আমরা আমাদের প্রোগ্রামের বাকি অংশগুলিকে সেই ইন্টারফেসটি মেনে নিতে দিতে পারি, এবং বোতল, জেরিকান এবং সমস্ত ধরণের স্টাফ কেবল আন্তঃব্যক্তভাবে কাজ করতে পারে। এটা কি আরও ভাল হবে না? ইন্টারফেসগুলি যেহেতু পদ্ধতির চাহিদা রাখে, এটিও একটি ভাল জিনিস।
আমরা এরকম কিছু দিয়ে শেষ করব:
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
গ্রেট! এবং এখন আমরা কেবল বোতলটি এতে পরিবর্তন করি:
public class Bottle extends LiquidContainer {
private int capacityMl;
private int amountFilledMl;
public Bottle(int capacityMl, int amountFilledMl) {
this.capacityMl = capacityMl;
this.amountFilledMl = amountFilledMl;
checkNotOverFlow();
}
public int getAmountMl() {
return amountFilledMl;
}
public void setAmountMl(int amountMl) {
this.amountFilled = amountMl;
checkNotOverFlow();
}
public int getCapacityMl() {
return capacityMl;
}
private void checkNotOverFlow() {
if(amountOfWaterMl > capacityMl) {
throw new BottleOverflowException();
}
}
আমি অনুশীলন হিসাবে বোতলওভারফ্লো এক্সপশনটির সংজ্ঞা পাঠকের কাছে ছেড়ে দেব।
এখন লক্ষ্য করুন এটি আরও কত শক্তিশালী। আমরা এখন বোতল পরিবর্তে লিকুইডকন্টেইনার গ্রহণ করে আমাদের কোডে যে কোনও ধরণের ধারককে মোকাবেলা করতে পারি। এবং এই বোতলগুলি এই ধরণের স্টাফের সাথে কীভাবে ডিল করে তা সমস্তই পৃথক হতে পারে। আপনার কাছে এমন বোতল থাকতে পারে যাগুলি যখন পরিবর্তিত হয় তখন ডিস্কে তাদের রাজ্য লেখেন বা বোতলগুলি যা এসকিউএল ডাটাবেসগুলিতে বা জিএনইউতে সংরক্ষণ করে অন্য কী জানে।
এবং এই সমস্তগুলির বিভিন্ন ওপসিকে পরিচালনা করার বিভিন্ন উপায় থাকতে পারে। বোতলটি কেবল যাচাই করে এবং যদি এটি উপচে পড়ে তবে এটি একটি রানটাইম এক্সেকশনকে ছুঁড়ে দেয়। তবে এটি করা ভুল জিনিস হতে পারে। (ত্রুটি পরিচালনার বিষয়ে একটি দরকারী আলোচনা হওয়া দরকার, তবে আমি এটি এখানে উদ্দেশ্যকে খুব সহজ করে রাখছি comments মন্তব্যগুলিতে লোকেরা সম্ভবত এই সরল পদ্ধতির ত্রুটিগুলি চিহ্নিত করবে;))
এবং হ্যাঁ, মনে হচ্ছে আমরা খুব সহজ ধারণা থেকে দ্রুত আরও ভাল উত্তর পেতে চলেছি।
দয়া করে মনে রাখবেন যে আপনি বোতলটির ক্ষমতা পরিবর্তন করতে পারবেন না। এটি এখন পাথর স্থাপন করা হয়। আপনি এটি কোনও চূড়ান্ত ঘোষণা করে কোন int দিয়ে এটি করতে পারেন। তবে এটি যদি একটি তালিকা হয়ে থাকে তবে আপনি এটিকে খালি করতে পারতেন, এতে নতুন কিছু যুক্ত করতে পারেন। আপনি অভ্যন্তরের অভ্যন্তরে স্পর্শ করার অ্যাক্সেসকে সীমাবদ্ধ করতে পারবেন না।
তৃতীয় জিনিসটিও যা সবাই সম্বোধন করে না: গেটর এবং সেটটাররা মেথড কল ব্যবহার করে। এর অর্থ হল যে তারা অন্য যে কোনও জায়গায় সাধারণ পদ্ধতির মতো দেখায়। ডিটিও এবং স্টাফগুলির জন্য অদ্ভুত নির্দিষ্ট বাক্য গঠন করার পরিবর্তে আপনার সর্বত্র একই জিনিস রয়েছে।