স্থির পদ্ধতিতে কোনও ব্যক্তিগত সদস্য কেন অ্যাক্সেসযোগ্য?


25

নিম্নলিখিতটি সিউডো কোড, আমি এটি জাভা এবং পিএইচপিতে চেষ্টা করেছিলাম এবং উভয়েই কাজ করেছেন:

class Test { 

    private int a = 5;

    public static function do_test(){
        var t = new Test();
        t.a = 1;
        print t.a // 1
    }

}

Test::do_test();

আপনি কেন ওওপি দৃষ্টান্তে এটি করতে পারেন এবং এর ব্যবহার কী?


6
কেন হবে না? জাভা ব্যক্তিগত সদস্যদের ক্ষেত্রটিকেই ব্যক্তিগত নয়, বরং কাছে ব্যক্তিগত সোর্স ফাইল । মাথায় আসার প্রথম ব্যবহারটি হ'ল equalsঅন্য উদাহরণের ব্যক্তিগত ক্ষেত্রগুলি পরীক্ষা করতে হবে। (মন্তব্য হিসাবে পোস্ট করা, এটি সংক্ষিপ্ত, এবং এই পদ্ধতির
ওওপি

2
নোট করুন যে স্ট্যাটিক পদ্ধতিগুলির একটি নেই this, তাই তারা নিজের ক্লাসের কেবলমাত্র সেগুলি পেতে পারে যা সেগুলি নিজেরাই তৈরি করে (বা এটি প্যারামিটার হিসাবে পাস হয়েছে)। সুতরাং আপনি যদি এটিকে এনক্যাপসুলেশন বা সুরক্ষা গর্তের লঙ্ঘন হিসাবে বিবেচনা করেন তবে এটি খুব বড় আকারের নয় এবং এটি প্লাগিংয়ের পক্ষে উপযুক্ত নাও হতে পারে।
কিলিয়ান পাথ

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

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

1
আসলে, যখন আমি আমার কলেজগুলিকে জিজ্ঞাসা করেছি তারা সবাই বলেছিল এটি অসম্ভব। সে কারণেই আমি এটি তুচ্ছ মনে করি নি
বেন

উত্তর:


17

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

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

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

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

interface ITest {
     public int getA();
}

class Test implements ITest { 

    private int a = 5;

    public int getA() { return a; } // implementation of method declared in interface

    public static void main(){
        ITest t = new Test();
        t.a = 1; // syntax error: Interface ITest has no "a"
        System.out.println(t.getA()); // calls Test.getA, visible because ITest declares it
    }

}

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

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

3

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

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

মাইক্রোসফ্ট কমন অবজেক্ট মডেল (সিওএম) এর মতো অ্যাক্সেসটিকে অস্বীকার করার সুবিধা হ'ল এটি বাইরের কোডটিকে ক্লাসগুলি ইন্টারফেস হিসাবে বিবেচনা করার অনুমতি দেয়। একটি বর্গ তাহলে ImmutableMatrixএকটি প্রাইভেট বা সংরক্ষিত রয়েছে double[][]ব্যাকিং ক্ষেত্র, এবং যদি বর্গ মধ্যে কোড অন্যান্য দৃষ্টান্ত ব্যাকিং অ্যারে পরীক্ষা, তারপর এটি সম্ভব একটি অ-বিন্যাস সমর্থিত বর্গ সংজ্ঞায়িত করতে হবে (যেমন ZeroMatrix, IdentityMatrix) যা বাহিরে কোড হিসেবে ব্যবহার করতে পারে একটি Immutable2dMatrix, ক্লাস ব্যাকিং ক্ষেত্র অন্তর্ভুক্ত ছাড়া। যদি এর অভ্যন্তরীণ কোনও কিছুই Immutable2dMatrixব্যক্তিগত ব্যতীত অন্য কোনও ঘটনার ব্যক্তিগত সদস্যদের ব্যবহার না করে thisতবে ক্লাসটির ImmutableArrayBackedMatrixনতুন নামকরণ এবং একটি নতুন বিমূর্ত ImmutableMatrixশ্রেণীর সংজ্ঞা দেওয়া সম্ভব হবে যা ImmutableArrayBackedMatrixউল্লিখিত নন-অ্যারে-ব্যাক ক্লাসের পাশাপাশি উপ-টাইপ হিসাবে থাকতে পারে।

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


2

জাভা কঠোরভাবে কোনও অবজেক্ট-ভিত্তিক ভাষা নয়, তবে শ্রেণিভিত্তিক ভাষা - শ্রেণি উদাহরণের চেয়ে ক্রিয়াকলাপ এবং আচরণের অ্যাক্সেস নির্ধারণ করে।

সুতরাং অত্যধিক অবাক হবেন না যে এটি আপনাকে এমন কাজ করতে দেয় যা কঠোরভাবে উদ্দেশ্য-উদ্দেশ্য নয়।

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

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

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