এনপ্যাপুলেশন কি এখনও হাতিগুলির একটিতে ওওপি দাঁড়িয়ে আছে?


97

এনক্যাপসুলেশন আমাকে সমস্ত বা প্রায় সমস্ত ক্ষেত্রকে বেসরকারী করতে এবং গেটর / সেটারদের দ্বারা এগুলি প্রকাশ করতে বলে। তবে এখন লম্বোকের মতো লাইব্রেরিগুলি উপস্থিত হয় যা আমাদের সমস্ত ব্যক্তিগত ক্ষেত্রকে একটি স্বল্প টীকা দ্বারা প্রকাশ করতে দেয় @Data। এটি সমস্ত ব্যক্তিগত ক্ষেত্রের জন্য গেটার, সেটার এবং সেটিং কনস্ট্রাক্টর তৈরি করবে।

কেউ আমাকে কীভাবে ব্যাখ্যা করতে পারে যে সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করার কী অনুভূতি? কেন আমরা কেবল তখন সরকারী ক্ষেত্রগুলি ব্যবহার করি না? আমি অনুভব করি যে আমরা কেবল প্রারম্ভিক পর্যায়ে ফিরে যাওয়ার জন্য দীর্ঘ এবং শক্ত পথে হাঁটা করেছি।

হ্যাঁ, অন্যান্য প্রযুক্তি রয়েছে যা গেটর এবং সেটটারগুলির মাধ্যমে কাজ করে। এবং আমরা এগুলিকে সাধারণ সরকারী ক্ষেত্রগুলির মাধ্যমে ব্যবহার করতে পারি না। তবে এই প্রযুক্তিগুলি কেবলমাত্র উপস্থিত হয়েছিল কারণ আমাদের কাছে সেই অসংখ্য সম্পত্তি ছিল - পাবলিক গেটার / সেটটারের পিছনে ব্যক্তিগত ক্ষেত্র। আমাদের যদি সম্পত্তি না থাকত তবে এই প্রযুক্তিগুলি অন্যভাবে বিকাশ করতে পারে এবং পাবলিক ফিল্ডগুলিতে সহায়তা করবে। এবং সবকিছু সহজ হবে এবং এখন আমাদের লম্বোকের কোনও প্রয়োজন হবে না।

পুরো এই চক্রটির জ্ঞানটি কী? এবং বাস্তব জীবনের প্রোগ্রামিং এ এখন encapsulation সত্যিই কোন ধারণা আছে?


19
"It will create getters, setters and setting constructors for all private fields."- আপনি এই টুল বর্ণনা শোনাচ্ছে মত হয় এনক্যাপস্যুলেশন বজায় রাখার। (কমপক্ষে একটি শিথিল, স্বয়ংক্রিয়ভাবে, কিছুটা রক্তাল্পতা-মডেল অর্থে)) তাহলে সমস্যাটি আসলে কী?
ডেভিড

78
এনক্যাপসুলেশন তার প্রকাশ্য চুক্তির পিছনে (সাধারণত, একটি ইন্টারফেস) পিছনে অবজেক্টের বাস্তবায়ন ইন্টার্নালগুলি গোপন করে। গেটার্স এবং সেটটাররা ঠিক বিপরীত কাজটি করে - তারা বস্তুর অভ্যন্তরীণতা প্রকাশ করে, সুতরাং সমস্যাটি গ্র্যাটার্স / সেটারগুলিতে হয়, এনক্যাপসুলেশন নয়।

22
@ ভিনসেমিহ ডেটা ক্লাসগুলির কোনও এনক্যাপসুলেশন নেইসেগুলির উদাহরণগুলি
আদৌ

10
জাভাবিয়ান ব্যবহার করে @ ভিনসেমিও ওও নয় , এটি প্রক্রিয়াজাতীয় । যে সাহিত্য তাদের "অবজেক্টস" বলে ইতিহাসের একটি ভুল।
কালেথ

28
আমি কয়েক বছর ধরে এটিতে অনেক চিন্তাভাবনা করেছি; আমি মনে করি এটি এমন একটি ক্ষেত্রে যেখানে ওওপির অভিপ্রায় বাস্তবায়নের থেকে আলাদা। স্মলটক অধ্যয়ন করার পর এটা পরিষ্কার কি গলি এর এনক্যাপস্যুলেশন ছিল অভিপ্রেত হতে (অর্থাত, প্রতিটি বর্গ একটি স্বাধীন কম্পিউটার হচ্ছে, ভাগ প্রোটোকল হিসাবে পদ্ধতি সহ), যদিও কারণে এতদূর আমাকে অজানা, এটি স্পষ্টভাবে এ এটির জনপ্রিয়তার এই করতে ধরা হয়েছে গেটর / সেটার অবজেক্টস যা কোনও ধারণাগত এনক্যাপসুলেশন দেয় না (তারা কিছুই লুকায় না, কিছুই পরিচালনা করে না এবং ডেটা ব্যতীত অন্য কোনও দায়বদ্ধতা থাকে না) এবং তবুও তারা বৈশিষ্ট্যগুলি ব্যবহার করে।
জুন

উত্তর:


82

যদি আপনি গেটার্স / সেটারগুলির সাথে আপনার সমস্ত বৈশিষ্ট্য প্রকাশ করেন তবে আপনি কেবলমাত্র ডেটা স্ট্রাকচার অর্জন করছেন যা এখনও সি বা অন্য কোনও পদ্ধতিগত ভাষায় ব্যবহৃত হয়। এটি এনক্যাপসুলেশন নয় এবং লমবোক কেবল প্রসেসাল কোড সহ কম বেদনাদায়ক কাজ করে যাচ্ছেন। গ্রাহকরা / সেটটারগুলি সরল পাবলিক ফিল্ডের মতো খারাপ। আসলে কোন পার্থক্য নেই।

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

ওওপি-তে এনক্যাপসুলেশনটি সঠিক উপায়ে করা হলে একটি হাতি। আপনার স্টেট এবং প্রয়োগের বিশদগুলি এনক্যাপুলেট করতে হবে যাতে সেই বস্তুর উপর তার সম্পূর্ণ নিয়ন্ত্রণ থাকে। যুক্তিটি বস্তুর অভ্যন্তরে কেন্দ্রীভূত হবে এবং কোডবেজ জুড়ে ছড়িয়ে থাকবে না। এবং হ্যাঁ - কোডিংটি আরও রক্ষণাবেক্ষণযোগ্য হওয়ায় এনক্যাপসুলেশন প্রোগ্রামিংয়ে এখনও প্রয়োজনীয়।

সম্পাদনাগুলি

আলোচনা চলছে দেখে আমি বেশ কয়েকটি জিনিস যুক্ত করতে চাই:

  • আপনার কতগুলি গুণাবলী আপনি গিটার / সেটারগুলির মাধ্যমে প্রকাশ করেন এবং আপনি এটি কত যত্ন সহকারে করছেন তা বিবেচ্য নয়। আরও নির্বাচনী হওয়া আপনার এনক্যাপসুলেশন সহ কোড ওওপি তৈরি করবে না। আপনার প্রকাশিত প্রতিটি বৈশিষ্ট্য অপরিহার্য পদ্ধতিগত উপায়ে সেই নগ্ন ডেটা নিয়ে কাজ করার কিছু প্রক্রিয়া পরিচালিত করবে। আপনি আরও নির্বাচনী হওয়ার সাথে সাথে আপনার কোডটি কম ধীরে ধীরে ছড়িয়ে দেবেন। এটি মূল পরিবর্তন করে না।
  • হ্যাঁ, সিস্টেমের সীমানায় আপনি অন্যান্য সিস্টেম বা ডাটাবেস থেকে নগ্ন ডেটা পাবেন। তবে এই ডেটাটি কেবল অন্য একটি এনক্যাপসুলেশন পয়েন্ট।
  • অবজেক্টগুলি নির্ভরযোগ্য হওয়া উচিত । অবজেক্টগুলির পুরো ধারণাটি দায়ী হচ্ছে যাতে আপনার সোজা এবং জরুরী যে আদেশ দেওয়ার দরকার নেই । পরিবর্তে আপনি কোনও বিষয়টিকে চুক্তির মাধ্যমে যা ভাল করে তা করতে বলছেন। আপনি নিশ্চিন্তে অংশ অভিনয় প্রতিনিধি থেকে অবজেক্ট। অবজেক্টগুলি স্থিতিস্থাপক অবস্থা এবং প্রয়োগের বিবরণ।

সুতরাং আমরা যদি এই প্রশ্নটি করি তবে যদি আমরা ফিরে যাই। এই সহজ উদাহরণ বিবেচনা করুন:

public class Document {
    private String title;

    public String getTitle() {
        return title;
    }
}

public class SomeDocumentServiceOrHandler {

    public void printDocument(Document document) {
        System.out.println("Title is " + document.getTitle());
    }
}

এখানে আমাদের সাথে ডকুমেন্ট আছে অভ্যন্তরীণ বিশদটি গেটর দ্বারা প্রকাশ করা এবং ফাংশনে বাহ্যিক পদ্ধতিগত কোড রয়েছে printDocumentযা বস্তুর বাইরে এর সাথে কাজ করে । কেন এই খারাপ? কারণ এখন আপনার কাছে কেবল সি স্টাইল কোড রয়েছে। হ্যাঁ এটি কাঠামোগত তবে আসলে কী পার্থক্য? আপনি বিভিন্ন ফাইল এবং নাম সহ সি ফাংশন গঠন করতে পারেন। এবং তথাকথিত স্তরগুলি ঠিক সেগুলি করছে। সার্ভিস ক্লাসটি কেবলমাত্র ডেটা নিয়ে কাজ করার পদ্ধতিগুলির একটি গোছা। এই কোডটি কম রক্ষণাবেক্ষণযোগ্য এবং এর অনেকগুলি ত্রুটি রয়েছে।

public interface Printable {
    void print();
}

public final class PrintableDocument implements Printable {
    private final String title;

    public PrintableDocument(String title) {
        this.title = title;
    }

    @Override
    public void print() {
        System.out.println("Title is " + title);
    }
}

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

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

এহ, এখনও বিশ্বাস হয় না। আপনার উদাহরণটি ঠিক আছে তবে কোডিংয়ের আলাদা স্টাইলকে বোঝান, "সত্য সঠিক" নয় - যা বিদ্যমান নেই doesn't মনে রাখবেন বেশিরভাগ ভাষা আজকাল বহুবিধ এবং খুব কমই খাঁটি OO বা খাঁটি পদ্ধতিগত। নিজেকে "খাঁটি ওও ধারণাগুলি" এর কাছে এত শক্ত করে আটকে রাখা। উদাহরণ হিসাবে - আপনি উদাহরণটিতে ডিআই ব্যবহার করতে পারবেন না কারণ আপনি একটি সাবক্লাসে মুদ্রণ যুক্তি যুক্ত করেছেন। মুদ্রণ কোনও দস্তাবেজের অংশ হওয়া উচিত নয় - একটি মুদ্রণযোগ্য ডকুমেন্ট তার মুদ্রণযোগ্য অংশটি (একটি গিটারের মাধ্যমে) একটি প্রিন্টারসেবারে প্রকাশ করবে।
টি। সার

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

নীচের লাইন: গেটার্স এবং সেটারগুলি দুষ্ট বা ওওপি ভাঙা নয় - যে লোকেরা এগুলি কীভাবে ব্যবহার করতে হয় তা তা বোঝে না। আপনি উদাহরণস্বরূপ কেস হ'ল ডিআই কীভাবে কাজ করে তার পুরো পয়েন্টটি লোকেদের পাঠ্যপুস্তকের উদাহরণ। আপনি যে উদাহরণটি "সংশোধন" করেছেন তা ইতিমধ্যে ডিআই-সক্ষম হয়েছে, ডিকোপলড হয়েছিল, সহজেই ঠাট্টা-বিদ্রূপ করা যেতে পারে ... সত্যিই - পুরো "হিটারিট্যান্সের ওপরে রচনাটিকে পছন্দ করুন" জিনিসটি মনে রাখবেন? ওও স্তম্ভের একটি? আপনি কোডটি পুনরুদ্ধার করার মাধ্যমে আপনি কেবল এটি উইন্ডো দিয়ে ছুঁড়েছিলেন। এটি কোনও গুরুতর কোড পর্যালোচনায় উড়বে না।
টি। সার

76

কেউ আমাকে ব্যাখ্যা করতে পারেন, সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার কী অনুভূতি এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করতে পারে? কেন আমরা কেবলমাত্র সরকারী ক্ষেত্রগুলি ব্যবহার করি না?

অনুভূতিটি হ'ল আপনার এটি করার কথা নয়

এনক্যাপসুলেশন মানে আপনি কেবলমাত্র সেই ক্ষেত্রগুলিকেই এক্সপোজ করেন যা আপনার অ্যাক্সেস করার জন্য অন্যান্য ক্লাসের প্রয়োজন এবং আপনি এটি সম্পর্কে খুব নির্বাচনী এবং যত্নবান।

ডিফল্টরূপে সমস্ত ক্ষেত্রের গেটার এবং সেটটারগুলি দেবেন না !

এটি পুরোপুরি জাভাবিয়ান স্পেসিফিকেশনের স্পিরিটের বিপরীতে যা বিদ্রূপাত্মকভাবে যেখানে জনসাধারণের নিয়ামক এবং সেটেটরদের ধারণাটি এসেছে।

তবে যদি আপনি অনুমানটির দিকে লক্ষ্য করেন, আপনি দেখতে পাবেন যে এটি গেটর এবং সেটটার তৈরির পরিকল্পনাটি খুব বেছে বেছে বেছে নিয়েছিল এবং এটি "কেবল পঠনযোগ্য" বৈশিষ্ট্যগুলি (কোনও সেটর নেই) এবং "কেবল লেখার জন্য" বৈশিষ্ট্যগুলির বিষয়ে কথা বলে সংগ্রহকারী)।

আরেকটি কারণটি হ'ল গ্রাহকরা এবং সেটটারগুলি অগত্যা ব্যক্তিগত ক্ষেত্রে সহজে অ্যাক্সেস নয় । একজন প্রাপ্ত ব্যক্তি নির্বিচারে জটিল উপায়ে এটির মানটি গণনা করতে পারে, সম্ভবত এটি ক্যাশে করে। একটি সেটার শ্রোতাদের মানটি যাচাই বা অবহিত করতে পারে।

সুতরাং আপনি এখানে আছেন: এনক্যাপসুলেশন মানে আপনি কেবল সেই কার্যকারিতা প্রকাশ করেন যা আপনাকে প্রকৃতপক্ষে প্রকাশ করতে হবে। তবে আপনি যদি কিছুটা সিনট্যাক্টিকাল ট্রান্সফর্মেশন অনুসরণ করে আপনাকে কীভাবে প্রকাশ করতে এবং উইলি-নিলি সমস্ত প্রকাশ করতে হবে তা সম্পর্কে যদি আপনি ভাবেন না তবে অবশ্যই এটি সত্যই encapsulation নয়।


20
"[জি] এটার এবং সেটটারগুলি অগত্যা সহজ অ্যাক্সেস নয়" - আমি মনে করি এটি একটি মূল বিষয়। যদি আপনার কোড নাম দিয়ে কোনও ক্ষেত্র অ্যাক্সেস করে থাকে তবে আপনি পরে আচরণটি পরিবর্তন করতে পারবেন না। আপনি যদি ob.get () ব্যবহার করছেন তবে আপনি তা করতে পারেন।
ড্যান অ্যামব্রজিও

4
@ জিরহ: জাভাতে এটি খারাপ অভ্যাস বলে আমি কখনও শুনিনি এবং এটি খুব সাধারণ বিষয়।
মাইকেল বর্গওয়ার্ট

2
@MichaelBorgwardt জবর; কিছুটা বিষয় ছাড়াই তবে আমি সর্বদা ভাবছিলাম কেন মাইক্রোসফ্ট সি # এর জন্য এটি করার বিরুদ্ধে সুপারিশ করেছিল। আমার অনুমান যে এই নির্দেশিকাগুলি ইঙ্গিত করে যে সি # তে কেবলমাত্র সেটার ব্যবহার করা যেতে পারে যা অভ্যন্তরীণভাবে ব্যবহৃত অন্য কোনও মানকে দেওয়া মানকে রূপান্তর করা, যাতে ব্যর্থ হতে পারে না বা একটি অবৈধ মান থাকতে পারে না (যেমন, পজিশনআইঙ্কেস সম্পত্তি এবং পজিশন সেন্টিমিটার সম্পত্তি থাকা) যেখানে এটি স্বয়ংক্রিয়ভাবে অভ্যন্তরীণভাবে মিমি রূপান্তরিত হয়)? একটি দুর্দান্ত উদাহরণ নয় তবে এই মুহুর্তে আমি যেটি নিয়ে আসতে পারি এটি সেরা।
জুন 15

2
@jrh এই উত্সটি সেটটারদের বিপরীতে গেটারদের পক্ষে এটি না করার কথা বলেছে।
ক্যাপ্টেন ম্যান

3
@ গাংনাস এবং আপনি সত্যিই দেখেছেন যে কেউ গেটটার / সেটারের ভিতরে কিছু যুক্তি লুকিয়ে রাখছে? আমরা এটিতে getFieldName()অভ্যস্ত যে আমাদের জন্য একটি স্বয়ংক্রিয় চুক্তি হয়ে ওঠে। আমরা এর পিছনে কিছু জটিল আচরণ আশা করব না। বেশিরভাগ ক্ষেত্রে এটি কেবল সরাসরি এনক্যাপসুলেশনটি ভেঙে যায়।
ইজবাসার তোলেগেন

17

আমি মনে করি আপনার মন্তব্য দ্বারা বিষয়টিটির ব্যাখ্যাটি ব্যাখ্যা করা হয়েছে:

আমি আপনার চিন্তার সাথে সম্পূর্ণ একমত তবে কোথাও আমাদের ডেটা সহ বস্তুগুলি লোড করতে হবে। উদাহরণস্বরূপ, এক্সএমএল থেকে। এবং এটি সমর্থনকারী বর্তমান প্ল্যাটফর্মগুলি গিটার / সেটটারগুলির মাধ্যমে এটি করে, ফলে আমাদের কোডের মান এবং আমাদের চিন্তাভাবনার মান অবনমিত হয়। লম্বোক সত্যই নিজের দ্বারা খারাপ নয়, তবে এর অস্তিত্বই দেখায় যে আমাদের কিছু খারাপ আছে।

আপনার সমস্যাটি হ'ল আপনি অ্যাক্টিভ ডেটামোডেলের সাথে অধ্যবসায় ডেটামোডেলটি মিশ্রণ করছেন।

একটি অ্যাপ্লিকেশনটিতে সাধারণত একাধিক ডাটামোডেল থাকে:

  • ডাটাবেসের সাথে কথা বলার জন্য একটি ডেটামোডেল,
  • কনফিগারেশন ফাইলটি পড়ার জন্য একটি ডেটামোডেল,
  • অন্য অ্যাপ্লিকেশনের সাথে কথা বলার জন্য একটি ডেটামোডেল,
  • ...

ডেটামোডেলের উপরে এটি আসলে এর গণনা সম্পাদন করতে ব্যবহার করে।

সাধারণভাবে, বাহিরের সাথে যোগাযোগের জন্য ব্যবহৃত ডেটামোডেলগুলি অভ্যন্তরীণ ডেটামোডেল (বিজনেস অবজেক্ট মডেল, বিওএম) থেকে পৃথক এবং স্বতন্ত্র হওয়া উচিত যার উপর ভিত্তি করে গণনা করা হয়:

  • স্বতন্ত্র : যাতে আপনি সমস্ত ক্লায়েন্ট / সার্ভারগুলি পরিবর্তন না করেই আপনার প্রয়োজনীয়তা অনুসারে বিওএম-তে সম্পত্তি যুক্ত / সরিয়ে ফেলতে পারেন, ...
  • বিচ্ছিন্ন : যাতে বিওএম-তে সমস্ত গণনা সম্পাদন করা হয়, যেখানে আক্রমণকারীরা বাস করে এবং এক পরিষেবা থেকে অন্য পরিষেবায় পরিবর্তন করা, বা একটি পরিষেবা আপগ্রেড করা, কোডবেস জুড়ে একটি লড়াকড় সৃষ্টি না করে।

এই দৃশ্যে, যোগাযোগ স্তরগুলিতে ব্যবহৃত সামগ্রীর জন্য সমস্ত আইটেম সর্বজনীন বা গেটার্স / সেটটারদের দ্বারা প্রকাশ করা পুরোপুরি ঠিক। এগুলি হ'ল সরল বস্তু যার সাথে কোনও আক্রমণকারী নেই।

অন্যদিকে, আপনার বিওএম-এ আক্রমণকারী থাকতে হবে, যা সাধারণত প্রচুর সেটটার (গ্রাহকরা আক্রমণকারীদের প্রভাবিত করে না, যদিও তারা এনক্যাপসুলেশনকে একটি ডিগ্রি কমিয়ে দেয়) থাকতে পারে।


3
আমি যোগাযোগের বিষয়গুলির জন্য গিটার এবং সেটার তৈরি করব না। আমি কেবল ক্ষেত্রগুলি পাবলিক করব কাজের চেয়ে বেশি কাজ তৈরি করা কেন?
ইমিবিস

3
@ মিমিবিস: আমি সাধারণভাবে সম্মত হই, তবে ওপি দ্বারা উল্লিখিত হিসাবে কিছু ফ্রেমওয়ার্কের জন্য গেটার্স / সিটার প্রয়োজন হয়, সেক্ষেত্রে আপনাকে কেবল মেনে চলতে হবে। নোট করুন যে ওপি একটি লাইব্রেরি ব্যবহার করছে যা একটি একক বৈশিষ্ট্যের প্রয়োগের সাথে এগুলি স্বয়ংক্রিয়ভাবে তৈরি করে, তাই এটি তার পক্ষে খুব কম কাজ।
ম্যাথিউ এম।

1
@ গাংনাস: এখানে ধারণাটি হ'ল গেটার্স / সেটারগুলি সীমানা (আই / ও) স্তরে বিচ্ছিন্ন থাকে যেখানে নোংরা হওয়া স্বাভাবিক, তবে বাকি অ্যাপ্লিকেশন (খাঁটি কোড) দূষিত নয় এবং মার্জিত থাকে।
ম্যাথিউ এম।

2
@ কুবাঞ্জাইক: সরকারী সংজ্ঞাটি আমি জানি যতদূর বিজনেস অবজেক্ট মডেল। এটি এখানে যেটিকে আমি "অভ্যন্তরীণ ডেটামোডেল" বলেছিলাম তার সাথে মিলে যায়, আপনি যে অ্যাপ্লিকেশনটির "খাঁটি" কোরটিতে যুক্তি প্রয়োগ করেন সেই ডেটামোডেল।
ম্যাথিউ এম।

1
এটি ব্যবহারিক পদ্ধতি approach আমরা একটি হাইব্রিড বিশ্বে বাস করি। যদি বাহ্যিক গ্রন্থাগারগুলি জানতে পারে যে বিওএম নির্মাণকারীদের কাছে কোন ডেটা পাস করতে হয় তবে আমাদের কেবল বিওএম থাকত had
অ্যাড্রিয়ান ইফটোড

12

নিম্নোক্ত বিবেচনা কর..

আপনার Userএকটি সম্পত্তি সহ একটি শ্রেণি রয়েছে int age:

class User {
    int age;
}

আপনি এটিকে স্কেল করতে চান যাতে একটির Userজন্মের তারিখ থাকে কেবলমাত্র একটি বয়সের বিপরীতে। একটি গেটর ব্যবহার:

class User {
    private int age;

    public int getAge() {
        return age;
    }
}

আমরা int ageক্ষেত্রটি আরও জটিল করার জন্য পরিবর্তন করতে পারি LocalDate dateOfBirth:

class User {
    private LocalDate dateOfBirth;

    public int getAge() {
        LocalDate now = LocalDate.now();
        int year = ...; // calculate using dateOfBirth and now
        return year;
    }

    // other behaviors can now make use of dateOfBirth
}

কোনও চুক্তি লঙ্ঘন নেই, কোনও কোডের বিরতি নেই .. আরও জটিল আচরণের জন্য প্রস্তুতির জন্য অভ্যন্তরীণ প্রতিনিধিত্বকে স্কেলিং করা ছাড়া আর কিছুই নয়।

ক্ষেত্র নিজেই encapsulated হয়।


এখন, উদ্বেগগুলি মুছে ফেলার জন্য ..

লম্বোকের @Dataটীকাটি কোটলিনের ডেটা ক্লাসের মতো

সমস্ত শ্রেণি আচরণগত বস্তুর প্রতিনিধিত্ব করে না। এনক্যাপসুলেশন ভাঙার ক্ষেত্রে এটি আপনার বৈশিষ্ট্যটির ব্যবহারের উপর নির্ভর করে। আপনি গেটসগুলির মাধ্যমে আপনার সমস্ত ক্ষেত্র উন্মুক্ত করা উচিত নয় ।

এনক্যাপসুলেশন একটি শ্রেণীর ভিতরে কাঠামোগত ডেটা অবজেক্টের মান বা স্থিতি লুকানোর জন্য ব্যবহৃত হয়

আরও সাধারণ অর্থে, এনক্যাপসুলেশন হ'ল তথ্য আড়াল করার কাজ। যদি আপনি গালি দেন @Dataতবে সহজেই ধরে নেওয়া সহজ যে আপনি সম্ভবত এনকেপসুলেশনটি ভেঙেছেন। তবে এটির কোনও উদ্দেশ্য নেই তা বলার অপেক্ষা রাখে না। উদাহরণস্বরূপ জাভাবিনগুলি কিছু লোকের দ্বারা ভীত হয়। তবুও এটি এন্টারপ্রাইজ বিকাশে ব্যাপকভাবে ব্যবহৃত হয়েছে।

শিম ব্যবহারের কারণে আপনি কী এই সিদ্ধান্তে পৌঁছাতে পারবেন যে এন্টারপ্রাইজ বিকাশ খারাপ? অবশ্যই না! প্রয়োজনীয়তাগুলি স্ট্যান্ডার্ড বিকাশের চেয়ে পৃথক। মটরশুটি ব্যবহার করা যেতে পারে? অবশ্যই! তাদের সব সময় গালি দেওয়া হয়!

লম্বোকও সমর্থন করে @Getterএবং @Setterস্বতন্ত্রভাবে - আপনার প্রয়োজনীয়তাগুলির জন্য যা ডাকে তা ব্যবহার করুন।


2
এটি কোনও @Dataধরণের টীকাতে থাপ্পড় মারার সাথে সম্পর্কযুক্ত নয় , যা নকশার মাধ্যমে সমস্ত ক্ষেত্রকে
একত্রিত করে

1
না, ক্ষেত্রগুলি লুকানো নেই । কারণ যে কোনও কিছু আসতে পারে এবংsetAge(xyz)
কালেথ

9
ক্ষেত্র @Caleth হয় লুকানো। আপনি এমন অভিনয় করছেন যেন সেটটারদের প্রাক এবং পোস্টের শর্ত থাকতে পারে না, যা সেটার ব্যবহারের জন্য খুব সাধারণ ব্যবহারের ক্ষেত্রে। আপনি এমন অভিনয় করছেন যেন একটি ক্ষেত্র == সম্পত্তি, যা এমনকি সি # এর মতো ভাষায়ও ঠিক সত্য নয়, উভয়ই সমর্থিত হওয়ার প্রবণতা রয়েছে (সি # তে যেমন)। ক্ষেত্রটি অন্য শ্রেণিতে স্থানান্তরিত করা যেতে পারে, আরও জটিল প্রতিনিধিত্বের জন্য এটি রূপান্তর করা যেতে পারে ...
ভিন্স এমিগ

1
এবং আমি যা বলছি তা গুরুত্বপূর্ণ নয়
ক্যালাথ

2
@ ক্যালথ এটি কীভাবে গুরুত্বপূর্ণ নয়? এটা কোন মানে না। আপনি বলছেন এনক্যাপসুলেশন প্রযোজ্য নয় কারণ আপনি মনে করেন যে এই পরিস্থিতিতে এটি গুরুত্বপূর্ণ নয়, যদিও এটি সংজ্ঞা অনুসারে প্রয়োগ হয় এবং এর ব্যবহারের ক্ষেত্রে রয়েছে?
ভিন্স এমি

11

এনক্যাপসুলেশন আমাকে সমস্ত বা প্রায় সমস্ত ক্ষেত্রকে বেসরকারী করতে এবং গেটর / সেটারদের দ্বারা এগুলি প্রকাশ করতে বলে।

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

এনক্যাপসুলেশন হ'ল তথ্য গোপনের একটি বিশেষ কেস, যাতে প্রতিটি বস্তু তার অভ্যন্তরগুলি গোপন করে এবং তার আক্রমণকারীদের প্রয়োগ করে।

সমস্ত ক্ষেত্রের জন্য গিটার এবং সেটটার তৈরি করা এনক্যাপসুলেশনের একটি বেশ দুর্বল রূপ, কারণ অভ্যন্তরীণ ডেটার কাঠামোটি গোপন নয় এবং আক্রমণকারীদের প্রয়োগ করা যায় না। এটির সুবিধা রয়েছে যে আপনি কলকারীদের পরিবর্তন না করে (বা যতক্ষণ না আপনি পুরানো কাঠামোতে রূপান্তর করতে পারেন) যতক্ষণ না অভ্যন্তরীণভাবে ডেটা সংরক্ষণ করা যেতে পারে তেমন পরিবর্তন করতে পারে।

কেউ আমাকে কীভাবে ব্যাখ্যা করতে পারে যে সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করার কী অনুভূতি? কেন আমরা কেবল তখন সরকারী ক্ষেত্রগুলি ব্যবহার করি না? আমি অনুভব করি যে আমরা কেবল প্রারম্ভিক পর্যায়ে ফিরে যাওয়ার জন্য দীর্ঘ এবং শক্ত পথে হাঁটা করেছি।

আংশিকভাবে, এটি একটি historicতিহাসিক দুর্ঘটনার কারণে। স্ট্রাইকটি হ'ল, জাভাতে, পদ্ধতির প্রার্থনা এক্সপ্রেশন এবং ফিল্ড অ্যাক্সেস এক্সপ্রেশনগুলি কল সাইটটিতে সিনথেটিকভাবে আলাদা, অর্থাত্ কোনও গেটর বা সেটার কল দ্বারা কোনও ক্ষেত্রের অ্যাক্সেস প্রতিস্থাপন করা কোনও শ্রেণির API ভাঙে। অতএব, আপনার যদি কোনও অ্যাক্সেসরের প্রয়োজন হতে পারে তবে আপনাকে এখনই একটি লিখতে হবে, বা এপিআই ভাঙতে সক্ষম হতে হবে। ভাষা-স্তরের সম্পত্তি সহায়তার এই অনুপস্থিতি অন্যান্য আধুনিক ভাষাগুলির তুলনায় বিপরীত, বিশেষত সি # এবং ইকামাস্ক্রিপ্ট

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

তাই বলা হয়, Lombok এর @Datagetters / setters উৎপন্ন চেয়ে বেশি আছে: এটি উত্পন্ন toString(), hashCode()এবং equals(Object), যা বেশ মূল্যবান হতে পারে।

এবং বাস্তব জীবনের প্রোগ্রামিং এ এখন encapsulation সত্যিই কোন ধারণা আছে?

এনক্যাপসুলেশন অমূল্য বা একেবারে অকেজো হতে পারে, এটি বস্তুর এনক্যাপসুলেটেড হওয়ার উপর নির্ভর করে। সাধারণত, ক্লাসের মধ্যে যুক্তি যত জটিল হয় তত বেশি এনক্যাপসুলেশনের সুবিধা।

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

উইকিপিডিয়া এবং কমান্ড পদ্ধতিতে এনক্যাপসুলেশন অর্জন করা যায়। সেটটারগুলি সাধারণত উপযুক্ত হয় না, কারণ তারা কেবলমাত্র একটি একক ক্ষেত্র পরিবর্তন করতে পারে বলে আশা করা হয়, তবে আক্রমণকারীদের রক্ষণাবেক্ষণের জন্য এক সাথে একাধিক ক্ষেত্র পরিবর্তন হতে পারে।

সারাংশ

গেটার্স / সেটটাররা বরং খারাপ এনক্যাপসুলেশন অফার করে।

জাভাতে প্রাপ্তদের / সেটটারদের বিস্তৃতি সম্পত্তি সম্পর্কিত ভাষা স্তরের সহায়তার অভাব এবং এর historicতিহাসিক উপাদান মডেলটিতে প্রশ্নোত্তর নকশা পছন্দগুলি যা বহু শিক্ষণ উপকরণ এবং তাদের শেখানো প্রোগ্রামারগুলিতে অন্তর্ভুক্ত রয়েছে।

অন্যান্য অবজেক্ট ওরিয়েন্টেড ভাষাগুলি, যেমন ইকামাস্ক্রিপ্ট, ভাষা পর্যায়ে সমর্থন বৈশিষ্ট্যগুলি সরবরাহ করে, তাই এপিআই ভঙ্গ না করে গেটরস প্রবর্তন করা যেতে পারে। এই জাতীয় ভাষায়, আগেকারদের সময় প্রয়োজনের পরিবর্তে প্রকৃত পক্ষে যখন প্রয়োজন হয় তখন তাদের পরিচয় করানো যেতে পারে, কেবলমাত্র এক-দিনের-ক্ষেত্রে-আপনাকে-প্রয়োজন-এটি-এক-দিন, যা অনেক বেশি আনন্দদায়ক প্রোগ্রামিংয়ের অভিজ্ঞতা অর্জন করে।


1
তার আক্রমণকারীদের প্রয়োগ করে? এটা কি ইংরাজী? অনুগ্রহ করে আপনি কি একজন ইংরেজকে বোঝাতে পারবেন? খুব জটিল না - এখানকার কিছু লোক ইংরেজি যথেষ্ট পরিমাণে জানেন না।
গাঙ্গনাস

আমি আপনার ভিত্তিটি পছন্দ করি, আমি আপনার চিন্তা পছন্দ করি (+1), তবে ব্যবহারিক ফলাফল নয়। আমি বরং প্রতিবিম্ব দ্বারা তাদের জন্য ডেটা লোড করার জন্য ব্যক্তিগত ক্ষেত্র এবং কিছু বিশেষ গ্রন্থাগার ব্যবহার করব। আমি কেবল বুঝতে পারি না কেন আপনি আমার উত্তরকে আমার বিরুদ্ধে যুক্তি হিসাবে সেট করছেন?
গাংনাস

একটি @Gangnus পরিবর্তিত একটি লজিক্যাল শর্তে যে পরিবর্তন করে না আছে (ইন অর্থ এবং -variant অর্থ পরিবর্তিত হয় / পরিবর্তন)। অনেক ফাংশনের নিয়ম রয়েছে যা কার্যকর করার আগে এবং পরে অবশ্যই সত্য হওয়া উচিত (প্রি-কন্ডিশন এবং পোস্ট-শর্তাদি বলা হয়) অন্যথায় কোডটিতে একটি ত্রুটি রয়েছে। উদাহরণস্বরূপ কোনও ফাংশনটির প্রয়োজন হতে পারে তার যুক্তিটি শূন্য না হওয়া (একটি পূর্ব শর্ত) এবং তার যুক্তিটি বাতিল হলে ব্যতিক্রম নিক্ষেপ করতে পারে কারণ সেই ক্ষেত্রে কোডটিতে একটি ত্রুটি হবে (যেমন কম্পিউটার বিজ্ঞানের ভাষায়, কোডটি একটি ভেঙেছে পরিবর্তিত)।
ফারাপ

@ গাঙ্গাস: এই আলোচনায় প্রতিচ্ছবি কোথায় প্রবেশ করবে তা পুরোপুরি নিশ্চিত নয়; লম্বোক একটি এনোটেশন প্রসেসর, অর্থাৎ জাভা সংকলকটির একটি প্লাগইন যা সংকলনের সময় অতিরিক্ত কোড নির্গত করে। তবে নিশ্চিত, আপনি লম্বোক ব্যবহার করতে পারেন। আমি কেবল এটিই বলছি যে বেশিরভাগ ক্ষেত্রে, সর্বজনীন ক্ষেত্রগুলি ঠিক পাশাপাশি কাজ করে এবং সেট আপ করা আরও সহজ (সমস্ত সংকলক স্বয়ংক্রিয়ভাবে টীকা প্রসেসরগুলি স্বয়ংক্রিয়ভাবে সনাক্ত করে না ...)।
মেরিটন

1
@ গাঙ্গনাস: গণিত এবং সিএসে আক্রমণকারীরা একই রকম, তবে সিএসে একটি অতিরিক্ত দৃষ্টিভঙ্গি রয়েছে: কোনও বস্তুর দৃষ্টিকোণ থেকে, আক্রমণকারীদের অবশ্যই প্রয়োগ ও প্রতিষ্ঠিত করতে হবে। Object বস্তুর কলারের দৃষ্টিকোণ থেকে, আক্রমণকারীরা সর্বদা সত্য।
মেরিটন

7

আমি সত্যিই নিজেকে এই প্রশ্ন জিজ্ঞাসা করেছি।

যদিও এটি সম্পূর্ণ সত্য নয়। গেটার / সেটার আইএমওর প্রসার জাভা বিন স্পেসিফিকেশনের কারণে হয়, যার এটি প্রয়োজন; সুতরাং এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং নয় তবে বিন-ওরিয়েন্টেড প্রোগ্রামিংয়ের বৈশিষ্ট্য, যদি আপনি করেন তবে। উভয়ের মধ্যে পার্থক্য হ'ল বিমূর্ত স্তরটির মধ্যে তারা বিদ্যমান; মটরশুটিগুলি একটি সিস্টেম ইন্টারফেসের বেশি, অর্থাত্ উচ্চতর স্তরে থাকে। এগুলি ওও ভিত্তিগত কাজ থেকে বিমূর্ত করে বা কমপক্ষে বোঝানো হয় - সর্বদা হিসাবে, জিনিসগুলি প্রায়শই যথেষ্ট চালিত হয়।

আমি বলতে চাই যে এটি কিছুটা দুর্ভাগ্যজনক যে জাভা প্রোগ্রামিংয়ে সর্বব্যাপী এই বিনের জিনিসটি একই জাভা ভাষার বৈশিষ্ট্য যুক্ত করার সাথে নয় - আমি সি # তে সম্পত্তি সম্পর্কিত ধারণাটির মতো কিছু ভাবছি। যারা এটি সম্পর্কে অবগত নন তাদের পক্ষে এটি এমন ভাষা রচনা যা দেখতে এই রকম দেখাচ্ছে:

class MyClass {
    string MyProperty { get; set; }
}

যাইহোক, প্রকৃত বাস্তবায়নের কৌতূহল এখনও এনক্যাপসুলেশন থেকে খুব বেশি উপকার করে।


পাইথনের অনুরূপ বৈশিষ্ট্য রয়েছে যেখানে বৈশিষ্ট্যগুলিতে স্বচ্ছ গেটার / সেটার থাকতে পারে। আমি নিশ্চিত যে আরও অনেক ভাষারও একই বৈশিষ্ট্য রয়েছে।
জ্যাব

1
"জাটার / সেটার আইএমওর প্রসার জাভা বিন স্পেসিফিকেশন দ্বারা সৃষ্ট, যার এটির প্রয়োজন" হ্যাঁ, আপনি ঠিক বলেছেন। এবং কে বলেছে এটি অবশ্যই প্রয়োজন? কারণ, দয়া করে?
গাংনাস

2
সি # উপায় একেবারে লম্বোকের মতো। আমি কোন বাস্তব পার্থক্য দেখতে পাচ্ছি না। আরও ব্যবহারিক সুবিধা, তবে ধারণার মধ্যে অবশ্যই খারাপ।
গাংনাস

1
@ গাঙ্গনিস স্পেসিফিকেশনটির এটির প্রয়োজন। কেন? কেন গেটারগুলি এক্সপোজিং ফিল্ডগুলির সমান নয় - এর একটি কংক্রিট উদাহরণের জন্য আমার উত্তরটি পরীক্ষা করে দেখুন - গেটর ছাড়াই একই অর্জনের চেষ্টা করুন।
ভিন্স এমি

@ ভিনসেমি গ্যাঙ্গনু, দয়া করে :-)। (গ্যাং-ওয়াকিং, নাস - বাদাম) এবং কেবলমাত্র যেখানে আমাদের বিশেষভাবে এটি প্রয়োজন সেখানে গেট / সেট ব্যবহার এবং অন্যান্য ক্ষেত্রে প্রতিচ্ছবি দ্বারা ব্যক্তিগত ক্ষেত্রগুলিতে ভর লোড সম্পর্কে কী?
গাংনাস

6

কেউ আমাকে ব্যাখ্যা করতে পারেন, সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার কী অনুভূতি এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করতে পারে? কেন আমরা কেবলমাত্র সরকারী ক্ষেত্রগুলি ব্যবহার করি না? আমি অনুভব করি যে আমরা কেবল সূচনালগ্নে ফিরে আসতে দীর্ঘ এবং কঠোর পথে হাঁটা করেছি।

এখানে সহজ উত্তর: আপনি একেবারে ঠিক। গ্রাহকরা এবং সেটটারগুলি এনক্যাপসুলেশনের মান সর্বাধিক (তবে সমস্ত নয়) অপসারণ করে। এটি বলার অপেক্ষা রাখে না যে আপনি যখন কোনও এনক্র্যাপসুলেশন ভঙ্গ করছেন এমন কোনও গেট এবং / অথবা কোনও সেট পদ্ধতি রয়েছে তবে আপনি যদি নিজের শ্রেণীর সমস্ত প্রাইভেট সদস্যদের অন্ধভাবে অ্যাক্সেসর যুক্ত করে থাকেন তবে আপনি এটি ভুল করছেন।

হ্যাঁ, অন্যান্য প্রযুক্তি রয়েছে যা গেটর এবং সেটটারগুলির মাধ্যমে কাজ করে। এবং আমরা এগুলিকে সাধারণ সরকারী ক্ষেত্রগুলির মাধ্যমে ব্যবহার করতে পারি না। তবে এই প্রযুক্তিগুলি কেবলমাত্র উপস্থিত হয়েছিল কারণ আমাদের কাছে সেই অসংখ্য সম্পত্তি ছিল - পাবলিক গেটার / সেটটারের পিছনে ব্যক্তিগত ক্ষেত্র। আমাদের যদি সম্পত্তি না থাকত তবে এই প্রযুক্তিগুলি অন্যভাবে বিকাশ করতে পারে এবং পাবলিক ফিল্ডগুলিতে সহায়তা করবে। এবং সবকিছু সহজ হবে এবং এখন আমাদের লম্বোকের কোনও প্রয়োজন হবে না। পুরো এই চক্রটির জ্ঞানটি কী? এবং বাস্তব জীবনের প্রোগ্রামিং এ এখন encapsulation সত্যিই কোন ধারণা আছে?

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

এখানে চিত্র বর্ণনা লিখুন

সিমের উদাহরণ ব্যবহার করে

এটি প্রতি প্রতি এক ভয়ঙ্কর ধারণা নয় তবে জাভাতে আমি কখনও বড় ভক্ত হতে পারিনি। এটা ঠিক দানার বিরুদ্ধে যাচ্ছে। পাইথন, গ্রোভি ইত্যাদি ব্যবহার করুন এমন কিছু যা প্রাকৃতিকভাবে এই ধরণের পদ্ধতির সমর্থন করে।

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

এক্সএমএল বাইন্ডিং জিনিসটি একটি শক্ত বাদাম। জাভাবিনের বিরুদ্ধে অবস্থান নিতে এটি সম্ভবত কোনও ভাল যুদ্ধক্ষেত্র নয়। আপনার যদি এই জাভাবিয়ানগুলি বানাতে হয় তবে এগুলিকে আসল কোড থেকে দূরে রাখার চেষ্টা করুন। সিরিয়ালাইজেশন স্তর হিসাবে তাদের আচরণ করুন।


2
সবচেয়ে দৃ .় এবং জ্ঞানী চিন্তা। +1 টি। তবে কেন ক্লাসের একটি গ্রুপ লিখবেন না, যার মধ্যে প্রত্যেকেই কোনও কোনও বাহ্যিক কাঠামোতে / থেকে ব্যক্তিগত ক্ষেত্রগুলিকে প্রচুর পরিমাণে লোড / সংরক্ষণ করবে? জেএসএন, এক্সএমএল, অন্যান্য অবজেক্ট। এটি POJOs বা সম্ভবত ক্ষেত্রগুলির সাথে কাজ করতে পারে, এটির জন্য কোনও টীকা দ্বারা চিহ্নিত। এখন আমি সেই বিকল্পটি নিয়ে ভাবছি।
গাংনাস

@ গাংনাস একটি অনুমান হিসাবে কারণ এর অর্থ প্রচুর অতিরিক্ত কোড লেখা। যদি প্রতিবিম্ব ব্যবহার করা হয় তবে কেবলমাত্র সিরিয়ালাইজেশন কোডের একগুচ্ছ রচনাটি লিখতে হবে এবং এটি নির্দিষ্ট প্যাটার্ন অনুসরণ করে যে কোনও শ্রেণিকে সিরিয়ালাইজ করতে পারে। সি # [Serializable]বৈশিষ্ট্য এবং এর আত্মীয়দের মাধ্যমে এটি সমর্থন করে । প্রতিফলন কাজে লাগিয়ে আপনি যখন কেবল একটি লিখতে পারেন তবে কেন 101 নির্দিষ্ট সিরিয়ালাইজেশন পদ্ধতি / ক্লাস লিখবেন?
ফারাপ

@ ফারাপ আমি ভীষণ দুঃখিত, তবে আপনার মন্তব্যটি আমার পক্ষে খুব ছোট। "লাভবান প্রতিবিম্ব"? এবং এত আলাদা জিনিস এক শ্রেণিতে লুকিয়ে রাখার কী বোধ হয়? তুমি কি বলতে চাচ্ছো?
গাংনাস

@ গাঙ্গনাস আমার অর্থ প্রতিবিম্ব , কোডটির নিজস্ব কাঠামো পরিদর্শন করার ক্ষমতা। জাভাতে (এবং অন্যান্য ভাষাগুলি) আপনি শ্রেণীর দ্বারা প্রকাশিত সমস্ত ফাংশনগুলির একটি তালিকা পেতে পারেন এবং তারপরে এটি XML / JSON হিসাবে সিরিয়াল করার জন্য প্রয়োজনীয় ক্লাস থেকে ডেটা বের করার উপায় হিসাবে ব্যবহার করতে পারেন। প্রতি-শ্রেণীর ভিত্তিতে কাঠামো সংরক্ষণের জন্য নিয়মিত নতুন পদ্ধতি তৈরি করার পরিবর্তে প্রতিবিম্বের কাজ হবে যা এককালের কাজ হবে। এখানে একটি সাধারণ জাভা উদাহরণ
ফারাপ

@ ফারাপ এটাই যে আমি কথা বলছিলাম। তবে কেন আপনি এটিকে "লিভারেজিং" বলছেন? এবং আমি এখানে প্রথম মন্তব্যে যে বিকল্পটির কথা উল্লেখ করেছি তা রয়ে গেছে - (আন) প্যাক করা ক্ষেত্রগুলিতে বিশেষ টীকাগুলি থাকা উচিত কি না?
গাংনাস

5

গেটার্স ছাড়া আমরা কীভাবে কাজ করতে পারি? এগুলি কি সম্পূর্ণরূপে অপসারণ করা সম্ভব? এটি কোন সমস্যা সৃষ্টি করে? আমরা returnকীওয়ার্ডটি নিষিদ্ধ করতে পারি ?

দেখা যাচ্ছে আপনি কাজটি করতে ইচ্ছুক হলে আপনি অনেক কিছু করতে পারেন। তারপরে কীভাবে তথ্য পুরোপুরি এনক্যাপসুলেটেড অবজেক্ট থেকে বেরিয়ে যায়? একজন সহযোগীর মাধ্যমে।

কোড আপনাকে প্রশ্ন জিজ্ঞাসা করার পরিবর্তে আপনি জিনিসগুলি করতে বলুন। যদি এই জিনিসগুলি জিনিসগুলি ফেরত না দেয় তবে সেগুলি কী ফিরে আসে সে সম্পর্কে আপনাকে কিছু করতে হবে না। সুতরাং যখন আপনি returnপরিবর্তে পৌঁছানোর কথা ভাবছেন তখন কিছু আউটপুট পোর্ট সহযোগীর কাছে পৌঁছানোর চেষ্টা করুন যা করা বাকি রয়েছে তা করবে।

এভাবে কাজগুলি করার সুবিধা এবং পরিণতি রয়েছে। আপনি কী ফিরে এসেছেন তার চেয়ে বেশি আপনাকে ভাবতে হবে। আপনি কীভাবে এমন কোনও বস্তুর কাছে বার্তা হিসাবে প্রেরণ করতে যাচ্ছেন যা সম্পর্কে জিজ্ঞাসা করা হয়নি সে সম্পর্কে আপনাকে ভাবতে হবে। এটি হতে পারে আপনি যে একই জিনিসটি ফিরে এসেছেন তা শেষ করে দিতে পারেন, বা এটি কেবল কোনও পদ্ধতিতে কল করা যথেষ্ট। সেই ভাবনাটি করতে করতে ব্যয় হয়।

সুবিধাটি হ'ল এখন আপনি ইন্টারফেসের মুখোমুখি হয়ে কথা বলছেন। এর অর্থ আপনি বিমূর্তির পুরো সুবিধা পাবেন।

এটি আপনাকে বহুমুখী প্রেরণও দেয়, কারণ আপনি যা বলছেন তা জানার পরে আপনাকে ঠিক কী বলছেন তা আপনাকে জানতে হবে না।

আপনি হয়ত ভাবেন এর অর্থ এই যে আপনাকে স্তরগুলির একটি স্তুপ দিয়ে কেবলমাত্র এক পথ যেতে হবে, তবে এটি প্রমাণিত হয়েছে যে আপনি বহুবৈচিত্র্য ব্যবহার করে পাগলীয় চক্রীয় নির্ভরতা তৈরি না করে পিছনে যেতে পারেন।

এটি দেখতে এটির মতো দেখাবে:

এখানে চিত্র বিবরণ লিখুন

class Interactor implements InputPort {
    OutputPort out;
    int y = 0;

    Interactor(OutputPort out){
        this.out = out;
    }

    void accumulate(int x) {
        y = y + x;
        out.showAsImage(y);
    }
}

আপনি যদি এর মতো কোড করতে পারেন তবে গেটরস ব্যবহার করা পছন্দ। প্রয়োজনীয় মন্দ নয়।


হ্যাঁ, এই জাতীয় গ্রাহকরা / সেটারদের দুর্দান্ত জ্ঞান রয়েছে। কিন্তু আপনি কি বুঝতে পারছেন যে এটি অন্য কিছু সম্পর্কে? :-) যাইহোক +1।
গাংনাস

1
@ গাংনাস আপনাকে ধন্যবাদ এমন অনেকগুলি জিনিস রয়েছে যা সম্পর্কে আপনি কথা বলতে পারেন। আপনি যদি কমপক্ষে তাদের নাম রাখতেন তবে আমি তাদের মধ্যে যেতে পারতাম।
candied_orange

5

এটি একটি বিতর্কিত ইস্যু (যেমন আপনি দেখতে পাচ্ছেন) কারণ গোষ্ঠী এবং সেটটারদের ইস্যুতে যুক্তিসঙ্গত উদ্বেগের সাথে একগুচ্ছ গোপনীয়তা এবং ভুল বোঝাবুঝির মিশ্রণ রয়েছে। তবে সংক্ষেপে, এখানে কোনও ভুল নেই @Dataএবং এটি এনক্যাপসুলেশনটি ভেঙে দেয় না।

কেন পাবলিক ফিল্ডের চেয়ে গেটস এবং সেটার ব্যবহার করবেন?

কারণ গ্রাহকরা / সেটটারগুলি এনক্যাপসুলেশন সরবরাহ করে। আপনি যদি সর্বজনীন ক্ষেত্র হিসাবে কোনও মান প্রকাশ করেন এবং তারপরে পরবর্তী সময়ে ফ্লাইয়ের মান গণনা করতে পরিবর্তন করেন তবে আপনাকে ক্ষেত্রটি অ্যাক্সেস করা সমস্ত ক্লায়েন্টকে সংশোধন করতে হবে। স্পষ্টতই এটি খারাপ। এটি কোনও বাস্তবায়নের বিশদ যা কোনও জিনিসের কিছু সম্পত্তি কোনও জমিতে সংরক্ষণ করা হয়, ফ্লাইয়ে উত্পন্ন হয় বা অন্য কোথাও থেকে আনা হয়, তাই পার্থক্য ক্লায়েন্টদের কাছে প্রকাশ করা উচিত নয়। গিটার / সেটটার সেটটারগুলি এটি সমাধান করে, যেহেতু তারা প্রয়োগটি আড়াল করে।

তবে যদি গেটার / সেটটারটি কেবল একটি অন্তর্নিহিত ব্যক্তিগত ক্ষেত্রকে প্রতিফলিত করে তবে এটি ঠিক ততটা খারাপ নয়?

না! পয়েন্টটি হ'ল এনক্যাপসুলেশন আপনাকে ক্লায়েন্টকে প্রভাবিত না করে বাস্তবায়ন পরিবর্তন করতে দেয় । ক্ষেত্রটি এখনও মান সঞ্চয় করার জন্য একটি দুর্দান্ত উপায় হতে পারে, যতক্ষণ না ক্লায়েন্টদের জানতে বা যত্নের প্রয়োজন নেই know

কিন্তু ক্ষেত্রগুলি থেকে এনক্যাপসুলেশন ভেঙে গেটার / সেটটারগুলি অটোজেনারেটিং হচ্ছে না?

কোনও এনক্যাপসুলেশন এখনও নেই! @Dataটীকাগুলি কেবল অন্তর্নিহিত ক্ষেত্রটি ব্যবহার করে গেটর / সেটার-জুটি লেখার একটি সুবিধাজনক উপায়। কোনও ক্লায়েন্টের দৃষ্টিকোণের জন্য এটি ঠিক নিয়মিত গেটার / সেটার জুটির মতো। আপনি যদি প্রয়োগটি পুনরায় লেখার সিদ্ধান্ত নেন তবে ক্লায়েন্টকে প্রভাবিত না করে আপনি এটি এখনও করতে পারেন। সুতরাং আপনি উভয় বিশ্বের সেরা পাবেন: এনক্যাপসুলেশন এবং সংক্ষিপ্ত বাক্য গঠন।

তবে কেউ কেউ বলে গেটার / সেটাররা সবসময়ই খারাপ থাকে!

একটি পৃথক বিতর্ক আছে, যেখানে কেউ কেউ অন্তর্নিহিত বাস্তবায়ন নির্বিশেষে গিটার / সেটার প্যাটার্নটি সর্বদা খারাপ বলে বিশ্বাস করে । ধারণা আপনি সেট করা উচিত নয় যে বা, বস্তু থেকে মান পেতে বরং বস্তুর মধ্যে কোনো মিথষ্ক্রিয়া বার্তা যেখানে এক বস্তু হিসাবে স্থাপিত হতে হবে জিজ্ঞেস অন্য বস্তুর কিছু করতে। এটি বেশিরভাগ অবজেক্ট-ভিত্তিক চিন্তাভাবনার প্রাথমিক দিনগুলি থেকে একগাদা piece এখন চিন্তাভাবনাটি হ'ল নির্দিষ্ট নিদর্শনগুলির জন্য (যেমন মান বস্তু, ডেটা ট্রান্সফার অবজেক্ট) গ্রাহকরা / সেটটারগুলি পুরোপুরি উপযুক্ত হতে পারে।


এনক্যাপসুলেশন আমাদের পলিমারফিজম এবং সুরক্ষার অনুমতি দেয়। গেটস / সেটগুলি ফার্সকে অনুমতি দেয় তবে দ্বিতীয়টির বিপরীতে দৃ against় হয়।
গাংনাস

যদি আপনি বলেন আমি কোথাও একটি ডগমা ব্যবহার করি, তবে দয়া করে বলুন, আমার পাঠ্যটি কোন মতবাদ। এবং ভুলে যাবেন না যে আমি যে কিছু চিন্তাভাবনাগুলি ব্যবহার করছি তা আমি পছন্দ করি না বা এর সাথে একমত নই। আমি এগুলিকে একটি দ্বন্দ্ব প্রদর্শনের জন্য ব্যবহার করছি।
গাংনাস

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

2
@ জেআরহ: এর মতো আনুষ্ঠানিক ব্যাখ্যা আছে কিনা তা আমি জানি না, তবে সি # এর বৈশিষ্ট্যগুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে (একটি ভাল সিনট্যাক্স সহ গ্রাহকরা / সেটটার) এবং বেনামি ধরণের জন্য যা কেবলমাত্র বৈশিষ্ট্যযুক্ত এবং কোনও আচরণ নয় types সুতরাং সি # এর ডিজাইনাররা ইচ্ছাকৃতভাবে মেসেজিং রূপক থেকে সরিয়ে নিয়েছেন এবং নীতিটি "বলুন, জিজ্ঞাসা করবেন না" নীতিটি রেখেছেন। সংস্করণ ২.০ থেকে সি # এর বিকাশ প্রথাগত ওও বিশুদ্ধতার চেয়ে কার্যকরী ভাষা দ্বারা আরও অনুপ্রাণিত বলে মনে হয়েছে।
জ্যাকবিবি

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

3

এনক্যাপসুলেশনের একটি উদ্দেশ্য রয়েছে তবে এটির অপব্যবহার বা অপব্যবহারও করা যেতে পারে।

অ্যান্ড্রয়েড এপিআইয়ের মতো এমন কিছু বিবেচনা করুন যার কয়েক সহস্র ক্ষেত্র (শত শত না হলে) সহ ক্লাস রয়েছে। এপিআই-র গ্রাহক 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

আপনি বলেছিলেন যে আপনি গেমস এবং সেটার তৈরি করতে লম্বকের @ ডেটা ব্যবহার করেন। নামটি দেখুন, @ ডেটা। এটি বেশিরভাগ ডেটা ক্লাসে ব্যবহার করা হয় যা কেবলমাত্র ডেটা সঞ্চয় করে এবং এর অর্থ সিরিয়ালাইজড এবং ডিসরিয়ালাইজড। একটি গেম থেকে সেভ ফাইলের মতো কিছু ভাবেন। তবে অন্যান্য পরিস্থিতিতে যেমন কোনও ইউআই উপাদান হিসাবে, আপনি সর্বাধিক সংজ্ঞায়িতভাবে সেটারগুলি চান কারণ কেবলমাত্র একটি ভেরিয়েবলের মান পরিবর্তন করা প্রত্যাশিত আচরণ পেতে যথেষ্ট নাও হতে পারে।


আপনি এখানে encapsulation অপব্যবহার সম্পর্কে একটি উদাহরণ রাখতে পারেন? এটি আকর্ষণীয় হতে পারে। আপনার উদাহরণটি বরং এনক্যাপসুলেশনের অভাবের বিরুদ্ধে।
গাংনাস

1
@ গাংনাস আমি কয়েকটি উদাহরণ যুক্ত করেছি। অকেজো এনক্যাপসুলেশন সাধারণত অপব্যবহার হয় এবং আমার অভিজ্ঞতা থেকেও API বিকাশকারীরা আপনাকে একটি নির্দিষ্ট উপায়ে একটি API ব্যবহার করতে বাধ্য করার জন্য খুব চেষ্টা করে। আমি এর জন্য উদাহরণ রাখিনি কারণ আমার কাছে উপস্থাপনের সহজ কোনও সুযোগ নেই। যদি আমি একটি পাই তবে আমি অবশ্যই এটি যুক্ত করব। আমি মনে করি এনক্যাপসুলেশনের বিরুদ্ধে বেশিরভাগ মন্তব্যগুলি আসলে নিজেরাই এনক্যাপসুলেশন না করে এনক্যাপসুলেশনের সিনট্যাক্সের বিরুদ্ধে।
বনান্যদেব

সম্পাদনার জন্য ধন্যবাদ। যদিও আমি একটি ছোটখাটো টাইপো পেয়েছি: "পাবলিক" এর পরিবর্তে "পাবলিস"।
জুন 28 ই

2

এনক্যাপসুলেশন আপনাকে নমনীয়তা দেয় । কাঠামো এবং ইন্টারফেস পৃথক করে, এটি আপনাকে ইন্টারফেস পরিবর্তন না করে কাঠামো পরিবর্তন করতে দেয়।

উদাহরণস্বরূপ যদি আপনি দেখতে পান যে আপনার নির্মাণের ভিত্তিতে অন্তর্নিহিত ক্ষেত্রটি আরম্ভ করার পরিবর্তে অন্যান্য ক্ষেত্রের উপর ভিত্তি করে কোনও সম্পত্তি গণনা করা দরকার, আপনি কেবল গিটারটি পরিবর্তন করতে পারেন। আপনি যদি ক্ষেত্রটি সরাসরি উন্মুক্ত করে থাকেন তবে পরিবর্তে আপনাকে ইন্টারফেসটি পরিবর্তন করতে হবে এবং প্রতিটি ব্যবহারের সাইটে পরিবর্তন করতে হবে।


তত্ত্বের ক্ষেত্রে একটি ভাল ধারণা থাকার পরে, মনে রাখবেন যে কোনও এআইপিআইয়ের 2 সংস্করণ ব্যতিক্রম ঘটায় যে কারণে সংস্করণ 1 আপনার গ্রন্থাগার বা শ্রেণীর ব্যবহারকারীদের ভয়াবহভাবে (এবং সম্ভবত নিঃশব্দে!) ভাঙবে না; আমি কিছুটা সন্দেহবাদী যে এই বেশিরভাগ ডেটা ক্লাসে "পর্দার আড়ালে" কোনও বড় পরিবর্তন করা যেতে পারে।
জুন

দুঃখিত, এটি কোনও ব্যাখ্যা নয়। ইন্টারফেসে ক্ষেত্রগুলি ব্যবহার করা নিষিদ্ধ হওয়ার বিষয়টি এনক্যাপসুলেশন ধারণা থেকে আসে। এবং এখন আমরা এটি সম্পর্কে কথা বলছি। আপনি যে বিষয়গুলি আলোচনা করছেন তা ভিত্তি করে দেখছেন। (লক্ষ্য করুন, আমি আপনার ভাবনাগুলির পক্ষে বা বিপরীতে কথা বলছি না, কেবল সেগুলি সম্পর্কে এখানে যুক্তি হিসাবে ব্যবহার করা যাবে না)
গাঙ্গনাস

@ গাঙ্গনাস "ইন্টারফেস" শব্দের অর্থ জাভা
মূলশব্দের বাইরেও রয়েছে

@jrh এটি সম্পূর্ণ ভিন্ন বিষয়। আপনি এটিকে কিছু নির্দিষ্ট প্রসঙ্গে এনপ্যাপুলেশনের বিরুদ্ধে তর্ক করতে ব্যবহার করতে পারেন তবে এটি কোনওভাবেই এর পক্ষে যুক্তিগুলিকে অকার্যকর করে না।
glennsl

1
পুরানো এনক্যাপসুলেশন, ভর না পেয়ে / সেট না করে আমাদের কেবল পলিমারফিজমই দেয় না, সুরক্ষাও দেয়। এবং ভর সেট / খারাপ অভ্যাসের দিকে আমাদের শেখায়।
গাংনাস

2

আমি এনকেপসুলেশন এবং শ্রেণি নকশার সমস্যার জায়গাটি চিত্রিত করার চেষ্টা করব এবং আপনার প্রশ্নের উত্তরটি শেষে দেব।

অন্যান্য উত্তরে উল্লিখিত হিসাবে, এনক্যাপসুলেশনের উদ্দেশ্য হ'ল কোনও পাবলিক এপিআই এর পিছনে থাকা কোনও সামগ্রীর অভ্যন্তরীণ বিবরণ লুকানো, যা চুক্তি হিসাবে কাজ করে। অবজেক্টটি এর অভ্যন্তরীণ পরিবর্তনগুলি নিরাপদ কারণ এটি জানে যে এটি কেবল সর্বজনীন এপিআইয়ের মাধ্যমে ডাকা হয়েছিল।

জনসাধারণের ক্ষেত্রগুলি, বা গিটারগুলি / সেটটারগুলি, বা উচ্চ-স্তরের লেনদেনের পদ্ধতিগুলি বা বার্তাগুলি পাস করার বিষয়টি মডেল করা হচ্ছে এমন ডোমেনের প্রকৃতির উপর নির্ভর করে Whether আক্কা কনকুরেন্সি বইটিতে (যা আমি এটির কিছুটা পুরানো হলেও প্রস্তাব দিতে পারি) আপনি একটি উদাহরণ পেয়েছেন যা এটি চিত্রিত করে, যা আমি এখানে সংক্ষেপে সংক্ষেপ করব।

ব্যবহারকারীর শ্রেণি বিবেচনা করুন:

public class User {
  private String first = "";
  private String last = "";

  public String getFirstName() {
    return this.first;
  }
  public void setFirstName(String s) {
    this.first = s;
  }

  public String getLastName() {
    return this.last;
  }
  public void setLastName(String s) {
    this.last = s;
  }
}

এটি একক থ্রেডযুক্ত প্রসঙ্গে সূক্ষ্মভাবে কাজ করে। ডোমেনটি মডেল করা হচ্ছে কোনও ব্যক্তির নাম এবং সেই নামটি কীভাবে সংরক্ষণ করা হয় তার যান্ত্রিকগুলি সেটারদের দ্বারা নিখুঁতভাবে আবদ্ধ হতে পারে।

তবে, কল্পনা করুন এটি অবশ্যই একটি বহু-থ্রেড প্রসঙ্গে সরবরাহ করা উচিত। ধরুন একটি থ্রেড পর্যায়ক্রমে নামটি পড়ছে:

System.out.println(user.getFirstName() + " " + user.getLastName());

এবং আরও দুটি থ্রেড যুদ্ধের লড়াইয়ে লড়াই করছে, এটি হিলারি ক্লিনটন এবং ডোনাল্ড ট্রাম্পকে ঘুরে দেখছে । তাদের প্রত্যেককে দুটি পদ্ধতি কল করা প্রয়োজন। বেশিরভাগ ক্ষেত্রে এটি ঠিকঠাক কাজ করে তবে একবারে একবারে আপনি হিলারি ট্রাম্প বা ডোনাল্ড ক্লিনটনকে পাশ কাটিয়ে দেখতে যাচ্ছেন ।

সেটটারগুলির ভিতরে কোনও লক যুক্ত করে আপনি এই সমস্যাটি সমাধান করতে পারবেন না, কারণ লকটি কেবলমাত্র প্রথম নাম বা শেষ নামটি সেট করার সময়কালের জন্য রাখা হয়। লকিংয়ের মাধ্যমে একমাত্র সমাধান হ'ল পুরো অবজেক্টের চারপাশে একটি লক যুক্ত করা, তবে কলিং কোডটি লকটি পরিচালনা করতে হবে (এবং ডেডলকের কারণ হতে পারে) এটি এনক্যাপসুলেশনটি ভেঙে দেয়।

এটি দেখা যাচ্ছে যে, লকিংয়ের মাধ্যমে কোনও পরিষ্কার সমাধান নেই। পরিষ্কার সমাধান হ'ল অভ্যন্তরগুলিকে আরও মোটা করে পুনরায় সজ্জিত করা:

public class UserName {
   public final String first;
   public final String last;
   public UserName(String first, String last) { ... }
}

public class User
   private UserName name;
   public UserName getName() { return this.name; }
   public setName(UserName n) { this.name = n; }
}

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

পুরো এই চক্রটির জ্ঞানটি কী? এবং বাস্তব জীবনের প্রোগ্রামিং এ এখন encapsulation সত্যিই কোন ধারণা আছে?

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


ফ্যান্টাস্টিক। আমি বলব যে আপনি আলোচনাকে একটি উচ্চতর স্তর বাড়িয়েছেন। হয়তো দুজন। সত্যই, আমি ভেবেছিলাম যে আমি এনক্যাপসুলেশনটি বুঝতে পারি এবং কখনও কখনও সেই মানক বইগুলি আরও ভাল বুঝি এবং সত্যই বরং ভয় পেয়েছিল যে আমরা কিছু স্বীকৃত রীতিনীতি এবং প্রযুক্তির কারণে এটি ব্যবহারিকভাবে হারাচ্ছি এবং এটিই আমার প্রশ্নের আসল বিষয় ছিল (সম্ভবত, এটি কোনওটি তৈরি করা হয়নি) ভাল উপায়), তবে আপনি আমাকে encapsulation এর নতুন দিকগুলি দেখিয়েছেন। আমি অবশ্যই মাল্টিটাস্কিংয়ে ভাল নই এবং অন্যান্য মৌলিক নীতিগুলি বোঝার জন্য এটি কতটা ক্ষতিকর হতে পারে তা আপনি আমাকে দেখিয়েছেন।
গাংনাস

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

আমি লম্বোক ব্যবহার করি নি, তবে আমি যেমন বুঝতে পারি এটি হ'ল কম টাইপিং সহ একটি নির্দিষ্ট স্তরের এনক্যাপসুলেশন (প্রতিটি ক্ষেত্রের গেটার / সেটটার) প্রয়োগ করার একটি উপায়। এটি আপনার সমস্যার ডোমেনের জন্য API এর আদর্শ আকার পরিবর্তন করে না, এটি আরও দ্রুত এটি লেখার কেবল একটি সরঞ্জাম।
জোয়েরি সেব্রেচটস

1

আমি এমন একটি ব্যবহারের ক্ষেত্রে ভাবতে পারি যেখানে এটি উপলব্ধি করে। আপনার কাছে এমন একটি শ্রেণি থাকতে পারে যা মূলত আপনি একটি সাধারণ গিটার / সেটার এপিআইয়ের মাধ্যমে অ্যাক্সেস করেন। আপনি পরে প্রসারিত বা সংশোধন করুন যাতে এটি আর একই ক্ষেত্রগুলি আর ব্যবহার করে না, তবে এখনও একই API টি সমর্থন করে

একটি কিছুটা কল্পিত উদাহরণ: একটি পয়েন্ট যে একটি কার্টিজিয়ান জুড়ি হিসাবে আরম্ভ আউট p.x()এবং p.y()। আপনি পরে একটি নতুন বাস্তবায়ন বা সাবক্লাস তৈরি করেন যা পোলার স্থানাঙ্ক ব্যবহার করে, যাতে আপনি কল করতে পারেন p.r()এবং p.theta(), কিন্তু আপনার ক্লায়েন্ট কোড যা কল করে p.x()এবং p.y()কার্যকর থাকে remains শ্রেণি নিজেই স্বচ্ছভাবে অভ্যন্তরীণ মেরু ফর্ম থেকে রূপান্তরিত করে, y()এটি এখন return r * sin(theta);। (এই উদাহরণে, কেবল সেট করা x()বা y()ততটা অর্থবোধ করে না, তবে এখনও সম্ভব))

এই ক্ষেত্রে, আপনি নিজেকে বলতে পারেন যে, "খুশী আমি ক্ষেত্রগুলি জনসাধারণের পরিবর্তে স্বয়ংক্রিয়ভাবে গেটার এবং সেটটারগুলি ঘোষণার বিরক্ত করেছিলাম, বা আমার সেখানে আমার API টি ভেঙে ফেলতে হবে” "


2
আপনি এটি দেখতে এত সুন্দর না। অভ্যন্তরীণ শারীরিক উপস্থাপনা পরিবর্তন করা বস্তুটিকে সত্যই আলাদা করে তোলে। এবং এটি একই রকম যে তারা দেখতে একইভাবে খারাপ , কারণ তাদের বিভিন্ন গুণ রয়েছে। ডেসকার্টস সিস্টেমের কোনও বিশেষ পয়েন্ট নেই, মেরু সিস্টেমের একটি রয়েছে।
গাঙ্গনাস

1
যদি আপনি এই নির্দিষ্ট উদাহরণটি পছন্দ না করেন তবে অবশ্যই আপনি অন্যদের সম্পর্কে ভাবতে পারেন যাঁর সত্যিকারের একাধিক সমতুল্য উপস্থাপনা রয়েছে, বা একটি নতুন উপস্থাপনা যা কোনও পুরানোটির থেকে এবং রূপান্তরিত হতে পারে।
ডেভিস্লোর

হ্যাঁ, আপনি উপস্থাপনের জন্য এগুলি খুব উত্পাদনশীলভাবে ব্যবহার করতে পারেন। ইউআইতে এটি ব্যাপকভাবে ব্যবহার করা যেতে পারে। কিন্তু আপনি কি আমাকে আমার নিজের প্রশ্নের উত্তর দিতে পারবেন না? :-)
গাংনাস

যেভাবে আরও দক্ষ, তাই না? :)
ডেভিস্লোর

0

কেউ আমাকে ব্যাখ্যা করতে পারেন, সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার কী অনুভূতি এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করতে পারে?

একেবারেই কোন লাভ নেই। যাইহোক, আপনি যে প্রশ্নটি জিজ্ঞাসা করেছেন তা প্রমাণ করে যে লোমবক কী করবে আপনি তা বুঝতে পারেন নি এবং কীভাবে এনক্যাপসুলেশন সহ ওও কোড লিখবেন তা আপনি বুঝতে পারেন না। আসুন কিছুটা রিওয়াইন্ড করি ...

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

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

কখনও কখনও ডেটাটির জন্য পরিসীমা চেক, অখণ্ডতা যাচাই বা তার মতো স্টাফের প্রয়োজন হয়। এই ফাংশনগুলি নিজেরাই লিখতে আমাদের সমস্ত কিছু করতে দেয়। এক্ষেত্রে আমরা লম্বোককে চাই না বা তার দরকার নেই, কারণ আমরা নিজেরাই এটি করছি।

প্রায়শই যদিও, আপনি দেখতে পান যে একটি বহিরাগত সেট পরামিতি একটি একক ভেরিয়েবলে সঞ্চিত। এক্ষেত্রে আপনার এই ভেরিয়েবলের বিষয়বস্তুগুলি / সেট / সিরিয়ালাইজ / ডিসরিয়ালাইজ করার জন্য চারটি ফাংশন প্রয়োজন। প্রতিবার এই চারটি ক্রিয়াকলাপটি নিজেকে লেখালেখি আপনাকে ধীর করে দেয় এবং ত্রুটির ঝুঁকিতে থাকে। লোমবকের সাথে প্রক্রিয়াটি স্বয়ংক্রিয় করা আপনার বিকাশের গতি বাড়ায় এবং ত্রুটির সম্ভাবনা সরিয়ে দেয়।

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

এটি কি আরও পরিষ্কার করে দেয়?


আপনি প্রথম বর্ষের শিক্ষার্থী প্রশ্নগুলির কথা বলছেন। আমরা ইতিমধ্যে অন্য কোথাও আছে। আমি কখনই এটি বলব না এবং এমনকি চৌকস জবাবের জন্য আপনাকে একটি প্লাসও দেব, যদি আপনি নিজের উত্তর আকারে এতটা অসম্পূর্ণ না হন।
গাংনাস

0

আমি আসলে জাভা বিকাশকারী নই; কিন্তু নিম্নলিখিতটি বেশ প্ল্যাটফর্মের অজগনীয়।

আমরা যা কিছু লিখি তার প্রায়শই পাবলিক গেটর এবং সেটারগুলি ব্যবহার করে যা ব্যক্তিগত ভেরিয়েবলগুলি অ্যাক্সেস করে। বেশিরভাগ গেটার এবং সিটারগুলি তুচ্ছ। তবে যখন আমরা সিদ্ধান্ত নিই যে সেটারকে কিছু গণনা করা দরকার বা সেটার কিছু বৈধতা অর্জন করে বা আমাদের এই শ্রেণীর সদস্য ভেরিয়েবলের কোনও সম্পত্তিতে সম্পত্তিটি ফরোয়ার্ড করা দরকার এটি সম্পূর্ণ কোডে সম্পূর্ণ অ-ব্রেকিং এবং বাইনারি সুসংগত তাই আমরা আমাদের যে একটি মডিউল আউট বদল করতে পারেন।

যখন আমরা এই সম্পত্তিটি স্থির করে ঠিক করি তখন উড়তে সমস্ত কোড যা এটি দেখায় তা পরিবর্তন করতে হবে না এবং কেবল এটি কোড লিখলে যে কোডটি পরিবর্তন করা দরকার এবং আইডিই আমাদের এটি সন্ধান করতে পারে। যখন আমরা স্থির করি যে এটি একটি লিখিতযোগ্য গণিত ক্ষেত্র (কেবল কখনও কয়েকবার এটি করতে হয়েছিল) আমরাও এটি করতে পারি। সুন্দর জিনিস হ'ল এই পরিবর্তনগুলির মধ্যে কয়েকটি বাইনারি সামঞ্জস্যপূর্ণ (কেবলমাত্র পঠনযোগ্য গণনামূলক ক্ষেত্রে পরিবর্তিত হওয়া তাত্ত্বিকভাবে নয় তবে যাইহোক বাস্তবে অনুশীলন হতে পারে)।

আমরা জটিল সেটারগুলি সহ প্রচুর এবং প্রচুর তুচ্ছ জিনিসগুলি দিয়ে শেষ করেছি। আমরা বেশ কয়েকটি ক্যাশিং গেটার দিয়ে শেষ করেছি। শেষ ফলাফলটি আপনাকে ধরেই নেওয়ার অনুমতি দেওয়া হয়েছে যে গেটারগুলি যুক্তিসঙ্গতভাবে সস্তা তবে সেটারগুলি সেগুলি নাও হতে পারে। অন্যদিকে, আমরা সিদ্ধান্ত নিতে যথেষ্ট বুদ্ধিমান যে সেটটাররা ডিস্ক অবিরত থাকে না।

তবে আমাকে সেই লোকটিকে খুঁজে বের করতে হয়েছিল যিনি অন্ধভাবে সমস্ত সদস্যের ভেরিয়েবলগুলিকে সম্পত্তিগুলিতে পরিবর্তন করেছিলেন। তিনি জানেন না কী পারমাণবিক সংযোজন ছিল তাই তিনি এমন জিনিসটি বদলেছিলেন যা সত্যিই কোনও সম্পত্তিতে সর্বজনীন পরিবর্তনশীল হওয়ার দরকার ছিল এবং একটি সূক্ষ্মভাবে কোডটি ভেঙেছে।


জাভা বিশ্বে আপনাকে স্বাগতম। (সি # ,ও)। *দীর্ঘশ্বাস*. তবে অভ্যন্তরীণ উপস্থাপনাকে আড়াল করার জন্য গেট / সেট ব্যবহার করার ক্ষেত্রে সতর্কতা অবলম্বন করুন। এটি কেবল বাহ্যিক ফর্ম্যাট সম্পর্কে, এটি ঠিক আছে। তবে যদি এটি গণিত, বা আরও খারাপ, পদার্থবিজ্ঞান বা অন্যান্য বাস্তব বিষয় সম্পর্কে হয় তবে বিভিন্ন অভ্যন্তরের উপস্থাপনার বিভিন্ন গুণ রয়েছে। আমার মন্তব্যটি যেমন সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেক্সঞ্জ.
com

@ গাংনাস: এই দৃষ্টান্তের উদাহরণটি সবচেয়ে দুর্ভাগ্যজনক। আমাদের এর মধ্যে বেশ কয়েকটি ছিল তবে গণনা সর্বদা সঠিক ছিল।
জোশুয়া

-1

অভ্যন্তরীণ কাঠামো বা অ্যাক্সেসের প্রয়োজনীয়তাগুলি যদি উন্নয়ন প্রক্রিয়া চলাকালীন পরিবর্তিত হয় তবে ভবিষ্যতে রিফ্যাক্টরিং এড়ানোর স্বার্থে গেটার্স এবং সেটটারগুলি "জাস্ট ইন কেস" ব্যবস্থা হিসাবে যুক্ত হয়।

বলুন, মুক্তির কয়েক মাস পরে, আপনার ক্লায়েন্ট আপনাকে অবহিত করে যে কোনও শ্রেণীর ক্ষেত্রের মধ্যে একটি কখনও কখনও নেতিবাচক মানগুলিতে সেট হয় যদিও এটি সর্বাধিক 0 থেকে বাড়ে। সর্বজনীন ক্ষেত্রগুলি ব্যবহার করে, আপনি যে মানটি সেট করতে যাচ্ছেন তাতে ক্ল্যাম্পিং ফাংশন প্রয়োগ করতে আপনার পুরো কোডবেজে এই ক্ষেত্রের প্রতিটি অ্যাসাইনমেন্ট সন্ধান করতে হবে এবং মনে রাখতে হবে যে এই ক্ষেত্রটি সংশোধন করার সময় আপনাকে সর্বদা এটি করতে হবে, কিন্তু যে স্তন্যপান। পরিবর্তে, যদি আপনি ইতিমধ্যে গেটারস এবং সেটার ব্যবহার করছেন বলে মনে হয় তবে এই ক্ল্যাম্পিং সর্বদা প্রয়োগ করা হয় তা নিশ্চিত করার জন্য আপনি কেবল আপনার সেটফিল্ড () পদ্ধতিটি পরিবর্তন করতে পারবেন।

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

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

মূলত, আপনার পদ্ধতিটি কোনও ক্ষেত্রটিতে যেভাবে প্রবেশ করে তা স্বচ্ছ এবং অভিন্ন হওয়া উচিত। আধুনিক ভাষা আপনাকে কোনও ক্ষেত্রের একই অ্যাক্সেস / কল সিনট্যাক্স সহ "পদ্ধতিগুলি" সংজ্ঞায়িত করতে দেয়, সুতরাং প্রাথমিক পরিবর্তনগুলির সময় এগুলি সম্পর্কে খুব বেশি চিন্তাভাবনা না করে চাহিদা অনুযায়ী এই পরিবর্তনগুলি করা যেতে পারে তবে জাভা আপনাকে এই কাজটি সময়ের আগে করতে বাধ্য করে কারণ এটি করে এই বৈশিষ্ট্য না। সমস্ত লোমবোক আপনাকে কিছুটা সময় সাশ্রয় করছে কারণ আপনি যে ভাষাটি ব্যবহার করছেন সেটি আপনাকে "কেবলমাত্র ক্ষেত্রে" পদ্ধতির জন্য সময় বাঁচাতে দেয় না।


এই "আধুনিক" ভাষাগুলিতে, API গুলি ফিল্ড অ্যাক্সেসের মতো দেখায়foo.bar তবে এটি কোনও পদ্ধতি কল দ্বারা পরিচালিত হতে পারে । আপনি দাবি করেন যে পদ্ধতির কলগুলির মতো এপিআই চেহারা পাওয়ার "অ্যান্টিচেক্টেড" পদ্ধতির চেয়ে এটি সর্বোত্তম foo.getBar()। আমরা সম্মত বলে মনে করি যে পাবলিক ক্ষেত্রগুলি সমস্যাযুক্ত, তবে আমি দাবি করি যে "পুরানো" বিকল্পটি "আধুনিক" এর চেয়ে উচ্চতর, কারণ আমাদের পুরো এপিআই সমান্তরিত (এটি সমস্ত পদ্ধতি কল)। "আধুনিক" পদ্ধতির মধ্যে, আমাদের সিদ্ধান্ত নিতে হবে কোন জিনিসগুলির বৈশিষ্ট্য হওয়া উচিত এবং কোনটি পদ্ধতি হওয়া উচিত, যা সমস্ত কিছুর উপায়ে জটিল হয় (বিশেষত যদি আমরা প্রতিবিম্ব ব্যবহার করি তবে)।
ওয়ারবো

1
1. পদার্থবিজ্ঞান লুকানো সবসময় খুব ভাল হয় না। আমার মন্তব্যটি সফ্টওয়্যারেনজেনারিং.স্ট্যাকেকেক্সচেঞ্জ / এ / 358662/44104 এ দেখুন । ২. গেটর / সেটার তৈরির বিষয়টি কতটা সহজ বা সহজ about সে সম্পর্কে আমি বলছি না। সি # এর একেবারে একই সমস্যাটি আমরা বলছি। ভর তথ্য লোডিংয়ের খারাপ সমাধানের কারণে ইনক্যাপসুলেশনের অভাব। ৩. হ্যাঁ, সমাধানটি সিনট্যাক্সের ভিত্তিতে তৈরি হতে পারে তবে আপনি যে উল্লেখ করছেন তার থেকে আলাদাভাবে কিছু করুন। সেগুলি খারাপ, আমাদের এখানে ব্যাখ্যা দিয়ে পূর্ণ একটি বড় পৃষ্ঠা রয়েছে। ৪) সমাধানটি সিনট্যাক্সের উপর ভিত্তি করে তৈরি করা উচিত নয়। এটি জাভা সীমাতে করা যেতে পারে।
গাংনাস

-1

কেউ আমাকে কীভাবে ব্যাখ্যা করতে পারে যে সমস্ত ক্ষেত্রকে ব্যক্তিগত হিসাবে লুকিয়ে রাখার এবং তার পরে কিছু অতিরিক্ত প্রযুক্তির মাধ্যমে সেগুলি সমস্ত প্রকাশ করার কী অনুভূতি? কেন আমরা কেবল তখন সরকারী ক্ষেত্রগুলি ব্যবহার করি না? আমি অনুভব করি যে আমরা কেবল প্রারম্ভিক পর্যায়ে ফিরে যাওয়ার জন্য দীর্ঘ এবং শক্ত পথে হাঁটা করেছি।

হ্যাঁ, এটি পরস্পরবিরোধী। আমি প্রথমে ভিজ্যুয়াল বেসিকের বৈশিষ্ট্যগুলিতে চলেছি। ততক্ষণে, অন্য ভাষায়, আমার অভিজ্ঞতা, ক্ষেত্রগুলির চারপাশে কোনও সম্পত্তি মোড়ানো ছিল না। শুধু সরকারী, ব্যক্তিগত এবং সুরক্ষিত ক্ষেত্র

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

তবে সম্পত্তি পৃথক সম্পত্তি গেটার এবং সেটটারগুলির কারণে তাদের ন্যায্যতা দেয়। সম্পত্তি ব্যতীত ক্ষেত্রটি উন্মোচন করা বা কিছুই ছিল না - আপনি যদি এটি পড়তে পারেন তবে আপনি এটি পরিবর্তন করতে পারেন। সুতরাং এখন কেউ সুরক্ষিত সেটারগুলির সাথে দুর্বল শ্রেণির নকশাকে ন্যায়সঙ্গত করতে পারে।

সুতরাং কেন আমরা / তারা কেবল প্রকৃত পদ্ধতি ব্যবহার করিনি? কারণ এটি ছিল ভিজ্যুয়াল বেসিক (এবং ভিবিএস স্ক্রিপ্ট ) (ওহ! আআআহ!), জনসাধারণের জন্য কোডিং (!), এবং এটি ছিল সমস্ত ক্রোধ। এবং এইভাবে একটি বোকামি শেষ পর্যন্ত আধিপত্য।


হ্যাঁ, ইউআইয়ের বৈশিষ্ট্যগুলির বিশেষ বোধ রয়েছে, তারা সর্বজনীন এবং ক্ষেত্রগুলির দুর্দান্ত উপস্থাপনা। ভাল যুক্তি.
গাংনাস

"তাহলে কেন আমরা / তারা কেবল প্রকৃত পদ্ধতি ব্যবহার করিনি?" প্রযুক্তিগতভাবে তারা। নেট সংস্করণে করেছে। বৈশিষ্ট্যগুলি পেতে এবং সেট ফাংশনগুলির জন্য সিনট্যাকটিক চিনি
ফারাপ

"বোকামি" ? আপনি কি " আইডিসিএনক্রসি " বলতে চাইছেন না ?
পিটার মর্টেনসেন

আমি বোঝানো idiocracy
radarbob
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.