এনক্যাপসুলেশনের একটি উদ্দেশ্য রয়েছে তবে এটির অপব্যবহার বা অপব্যবহারও করা যেতে পারে।
অ্যান্ড্রয়েড এপিআইয়ের মতো এমন কিছু বিবেচনা করুন যার কয়েক সহস্র ক্ষেত্র (শত শত না হলে) সহ ক্লাস রয়েছে। এপিআই-র গ্রাহক os ক্ষেত্রগুলি উন্মোচিত করা নেভিগেট এবং ব্যবহার করা আরও শক্ত করে তোলে, এটি ব্যবহারকারীকে ভ্রান্ত ধারণা দেয় যে সে যে ক্ষেত্রগুলি ব্যবহার করতে পারে তার সাথে বিরোধযুক্ত হতে পারে এমন ক্ষেত্রগুলির সাথে তিনি যা চান তা করতে পারেন। সুতরাং রক্ষণাবেক্ষণযোগ্যতা, ব্যবহারযোগ্যতা, পঠনযোগ্যতা এবং ক্রেজি বাগগুলি এড়ানোর জন্য এনক্যাপসুলেশন সেই অর্থে দুর্দান্ত।
অন্যদিকে, সিওডি / সি ++ এর স্ট্রাক্টের মতো পিওডি বা সমতল পুরাতন ডেটা প্রকারগুলি যেখানে সমস্ত ক্ষেত্র পাবলিক সেগুলিও দরকারী। লম্বোকে @ ডেটা টীকা দ্বারা উত্পন্ন অকার্যকর গেটার / সেটারগুলি থাকা "এনক্যাপসুলেশন প্যাটার্ন" রাখার একমাত্র উপায়। জাভাতে আমরা "অকেজো" getters / setters করার কয়েকটি কারণগুলির মধ্যে একটি হল পদ্ধতিগুলি একটি চুক্তি সরবরাহ করে ।
জাভাতে, আপনার একটি ইন্টারফেসে ক্ষেত্র থাকতে পারে না, সুতরাং আপনি ইন্টারফেসের সমস্ত বাস্তবায়নকারীদের যে কোনও সাধারণ সম্পত্তি নির্দিষ্ট করতে গেটার এবং সেটটার ব্যবহার করেন। কোটলিন বা সি # এর মতো আরও সাম্প্রতিক ভাষাগুলিতে আমরা বৈশিষ্ট্যগুলির ক্ষেত্র হিসাবে ধারণাটি দেখি যার জন্য আপনি একটি সেটর এবং গেটার ঘোষণা করতে পারেন। শেষ অবধি, অকার্যকর গেটার্স / সেটটাররা জাভাতে যে উত্তরাধিকার সূত্রে বাস করতে হবে তার বেশি হ'ল যদি না ওরাকল এতে বৈশিষ্ট্য যুক্ত করে। কোটলিন, উদাহরণস্বরূপ, যা জেটব্রেইনস দ্বারা বিকাশ করা অন্য জেভিএম ভাষা, ডেটা ক্লাস রয়েছে যা মূলত লম্বোকে @ ডেটা টীকাটি করে যা করে।
এছাড়াও এখানে কয়েকটি উদাহরণ দেওয়া হল:
class DataClass
{
private int data;
public int getData() { return data; }
public void setData(int data) { this.data = data; }
}
এটি এনক্যাপসুলেশনের খারাপ পরিস্থিতি। গেটর এবং সেটার কার্যকরভাবে অকেজো। এনক্যাপসুলেশন বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয় কারণ এটি জাভা জাতীয় ভাষায় স্ট্যান্ডার্ড। কোড বেস জুড়ে ধারাবাহিকতা বজায় রাখার পাশাপাশি আসলে সহায়তা করে না।
class DataClass implements IDataInterface
{
private int data;
@Override public int getData() { return data; }
@Override public void setData(int data) { this.data = data; }
}
এটি encapsulation একটি ভাল উদাহরণ। এই ক্ষেত্রে আইডিটাআইন্টারফেস একটি চুক্তি প্রয়োগের জন্য এনক্যাপসুলেশন ব্যবহৃত হয়। এই উদাহরণে এনক্যাপসুলেশনের উদ্দেশ্য হ'ল এই শ্রেণীর গ্রাহকরা ইন্টারফেসের মাধ্যমে সরবরাহিত পদ্ধতিগুলি ব্যবহার করা। যদিও প্রাপ্তি এবং সেটর অভিনব কোনও কাজ না করে, আমরা এখন ডেটা ক্লাস এবং আইডিটাআইন্টারফেসের অন্যান্য প্রয়োগকারীদের মধ্যে একটি সাধারণ বৈশিষ্ট্যকে সংজ্ঞায়িত করেছি। সুতরাং আমি এই মত একটি পদ্ধতি থাকতে পারে:
void doSomethingWithData(IDataInterface data) { data.setData(...); }
এখন, এনক্যাপসুলেশন সম্পর্কে কথা বলার সময় সিনট্যাক্স সমস্যার সমাধান করাও এটি গুরুত্বপূর্ণ মনে করি। আমি প্রায়শই লোকেদের সিনট্যাক্স সম্পর্কে অভিযোগ দেখতে পাই যা এনক্যাপসুলেশন না করে নিজেই এনক্যাপসুলেশন প্রয়োগ করতে প্রয়োজনীয়। একটি উদাহরণ যা মনে মনে আসে তা হ'ল ক্যাসি মুরেটেরির (আপনি তার রেন্ট এখানে দেখতে পারেন )।
মনে করুন আপনার কাছে এমন কোনও প্লেয়ার শ্রেণি রয়েছে যা এনকেপসুলেশন ব্যবহার করে এবং তার অবস্থানটি 1 ইউনিট দ্বারা স্থানান্তরিত করতে চান। কোডটি এর মতো দেখায়:
player.setPosX(player.getPosX() + 1);
এনক্যাপসুলেশন ছাড়াই এটি দেখতে এরকম হবে:
player.posX++;
এখানে তিনি যুক্তি দিয়েছিলেন যে এনক্যাপসুলেশনগুলি অতিরিক্ত কোনও সুবিধা না দিয়ে আরও অনেক বেশি টাইপ করে এবং এটি অনেক ক্ষেত্রে সত্য হতে পারে তবে কিছু লক্ষ্য করুন। যুক্তি সিনট্যাক্সের বিপরীতে, নিজেই এনক্যাপসুলেশন নয়। এমনকি সি-এর মতো ভাষায় যে এনক্যাপসুলেশনের ধারণার অভাব রয়েছে আপনি প্রায়শই '_' বা 'আমার' এর সাথে প্রিক্সফাইড বা সুফিকযুক্ত স্ট্রাক্টগুলিতে ভেরিয়েবল দেখতে পাবেন বা এপিআই-র গ্রাহক দ্বারা এগুলি ব্যবহার করা উচিত হবে না এমনটি বোঝাতে হবে যেমন তারা ছিল ব্যক্তিগত.
বিষয়টির সত্যতা হ'ল এনক্যাপসুলেশন কোডটিকে আরও বেশি রক্ষণাবেক্ষণযোগ্য এবং সহজেই ব্যবহারযোগ্য করে তুলতে সহায়তা করে। এই শ্রেণি বিবেচনা করুন:
class VerticalList implements ...
{
private int posX;
private int posY;
... //other members
public void setPosition(int posX, int posY)
{
//change position and move all the objects in the list as well
}
}
যদি ভেরিয়েবলগুলি এই উদাহরণে সর্বজনীন হয় তবে এই API এর কোনও গ্রাহক কখন বিএসএক্সএক্স এবং পজওয়াই ব্যবহার করবেন এবং কখন সেটপজিশন () ব্যবহার করবেন তা নিয়ে বিভ্রান্ত হবেন। এই বিবরণগুলি গোপন করে আপনি গ্রাহককে স্বজ্ঞাত উপায়ে আপনার এপিআই ব্যবহার করতে আরও ভাল সহায়তা করেন।
যদিও সিনট্যাক্সটি অনেক ভাষায় একটি সীমাবদ্ধতা। তবে আরও নতুন ভাষা বৈশিষ্ট্যগুলি সরবরাহ করে যা আমাদের পাবলিস সদস্যদের সুন্দর বাক্য গঠন এবং এনক্যাপসুলেশনের সুবিধা দেয় the আপনি যদি এমএসভিসি ব্যবহার করেন তবে আপনি সি #, কোটলিনে, এমনকি সি ++ তেও বৈশিষ্ট্য পাবেন। এখানে কোটলিন একটি উদাহরণ।
শ্রেণীর উল্লম্ব তালিকা: ... pos var posX: int সেট (x) {ক্ষেত্র = x; ...} var posY: int সেট (y) {ক্ষেত্র = y; ...}}
এখানে আমরা জাভা উদাহরণের মতো একই জিনিস অর্জন করেছি, তবে আমরা পোস্টএক্সএক্স এবং পজওয়াই ব্যবহার করতে পারি যেন তারা জনসাধারণের ভেরিয়েবল হয়। আমি যদিও তাদের মান পরিবর্তন করার চেষ্টা করব, তখন সেটটার সেট () এর বডি কার্যকর করা হবে।
কোটলিনে উদাহরণস্বরূপ, এটি প্রয়োগকারী, সেটটার, হ্যাশকোড, সমান এবং টু স্ট্রিং প্রয়োগ করা জাভা বিনের সমতুল্য হবে:
data class DataClass(var data: Int)
লক্ষ্য করুন যে এই সিনট্যাক্সটি কীভাবে আমাদেরকে এক লাইনে জাভা বিন করতে দেয়। জাভা জাতীয় ভাষায় এনক্যাপসুলেশন বাস্তবায়নের ক্ষেত্রে আপনি যে সমস্যাটি পেয়েছেন তা সঠিকভাবে লক্ষ্য করেছেন, তবে এটি জাভা এর নিজের দোষ নিজেই নয় ap
আপনি বলেছিলেন যে আপনি গেমস এবং সেটার তৈরি করতে লম্বকের @ ডেটা ব্যবহার করেন। নামটি দেখুন, @ ডেটা। এটি বেশিরভাগ ডেটা ক্লাসে ব্যবহার করা হয় যা কেবলমাত্র ডেটা সঞ্চয় করে এবং এর অর্থ সিরিয়ালাইজড এবং ডিসরিয়ালাইজড। একটি গেম থেকে সেভ ফাইলের মতো কিছু ভাবেন। তবে অন্যান্য পরিস্থিতিতে যেমন কোনও ইউআই উপাদান হিসাবে, আপনি সর্বাধিক সংজ্ঞায়িতভাবে সেটারগুলি চান কারণ কেবলমাত্র একটি ভেরিয়েবলের মান পরিবর্তন করা প্রত্যাশিত আচরণ পেতে যথেষ্ট নাও হতে পারে।
"It will create getters, setters and setting constructors for all private fields."
- আপনি এই টুল বর্ণনা শোনাচ্ছে মত হয় এনক্যাপস্যুলেশন বজায় রাখার। (কমপক্ষে একটি শিথিল, স্বয়ংক্রিয়ভাবে, কিছুটা রক্তাল্পতা-মডেল অর্থে)) তাহলে সমস্যাটি আসলে কী?