কেন জাভা প্যাকেজ অ্যাক্সেস ডিফল্ট করে?


26

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

আমি বিশ্বাস করি যে যদি ডিফল্ট অ্যাক্সেসটি সঠিকভাবে ব্যবহার করা হয় তবে এটি এনক্যাপসুলেশন বজায় রাখার সময় বর্ধিত টেস্টাবিলিটি সরবরাহ করে। এবং এটি ব্যক্তিগত অ্যাক্সেস মডিফায়ারকে রিন্ডন্ড্যান্টও সরবরাহ করে।

ডিফল্ট অ্যাক্সেস মডিফায়ারটিকে বিশ্বের অন্যান্য অংশ থেকে আড়াল করা দরকার এমন পদ্ধতির জন্য একটি অনন্য প্যাকেজ ব্যবহার করে একই প্রভাব সরবরাহ করতে ব্যবহার করা যেতে পারে এবং এটি টেস্ট ফোল্ডারের প্যাকেজ হিসাবে একই সাথে টেস্টিবিলিটির সাথে আপস না করেই এটি করে উত্স ফোল্ডারে ঘোষিত সমস্ত ডিফল্ট পদ্ধতি অ্যাক্সেস করতে সক্ষম।

আমি বিশ্বাস করি এই কারণেই জাভা প্যাকেজ অ্যাক্সেসটিকে 'ডিফল্ট' হিসাবে ব্যবহার করে। তবে আমি নিশ্চিত নই যে তারা কেন ব্যক্তিগত অ্যাক্সেসকে অন্তর্ভুক্ত করেছিল, আমি নিশ্চিত যে এখানে একটি বৈধ ব্যবহারের কেস রয়েছে ...



পূর্বে আলোচিত ইউনিটটি ব্যক্তিগত পদ্ধতি পরীক্ষার বিষয়ে প্রাসঙ্গিক; কীভাবে আপনি-ইউনিট-পরীক্ষা-ব্যক্তিগত-পদ্ধতি । উত্তর; আপনার করা উচিত নয়
রিচার্ড টিঙ্গলে

উত্তর:


25

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

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

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

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

সম্ভবত অন্যান্য কারণও রয়েছে, তবে আমি এটিকে অবমূল্যায়ন করব না।


14

ডিফল্ট অ্যাক্সেস ব্যক্তিগত অ্যাক্সেস সংশোধককে রিন্ডন্ড্যান্ট সরবরাহ করে না।

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

অ্যাক্সেস স্তর চয়ন করার বিষয়ে টিপস:

অন্যান্য প্রোগ্রামাররা যদি আপনার ক্লাস ব্যবহার করে তবে আপনি নিশ্চিত করতে চান যে অপব্যবহারের ফলে ত্রুটিগুলি ঘটতে পারে না। অ্যাক্সেস স্তরগুলি আপনাকে এটি করতে সহায়তা করতে পারে।

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

সম্পূর্ণরূপে প্রাইভেট মডিফায়ার বাদ দেওয়ার জন্য যুক্তিসঙ্গত হওয়ার হিসাবে টেস্টাবিলিটির কাছে আপনার আবেদনটি ভুল D আমার এখন ব্যক্তিগত পদ্ধতি এড়ানো উচিত?

অবশ্যই আপনার ব্যক্তিগত পদ্ধতি থাকতে পারে এবং অবশ্যই আপনি সেগুলি পরীক্ষা করতে পারেন।

হয় প্রাইভেট পদ্ধতিটি চালানোর জন্য কিছু উপায় রয়েছে, সেক্ষেত্রে আপনি সেভাবে এটি পরীক্ষা করতে পারেন, বা প্রাইভেটটি চালানোর কোনও উপায় নেই , এক্ষেত্রে: হেক কেন আপনি এটি পরীক্ষা করার চেষ্টা করছেন, ঠিক জঘন্য জিনিস মুছুন ...


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

নিম্নলিখিত সহ কয়েকটি কারণে আপনার এই ক্লাসগুলি এবং ইন্টারফেসটি একটি প্যাকেজে বান্ডিল করা উচিত:

  • আপনি এবং অন্যান্য প্রোগ্রামাররা সহজেই নির্ধারণ করতে পারবেন যে এই ধরণেরগুলি সম্পর্কিত ...
  • আপনি প্যাকেজটির মধ্যে থাকা প্রকারগুলিকে একে অপরের সীমিত অ্যাক্সেসের অনুমতি দিতে পারেন তবুও প্যাকেজের বাইরের ধরণের জন্য অ্যাক্সেসকে সীমাবদ্ধ রেখেছেন ...

<কৌতুক "আমি মনে করি আমি যথেষ্ট হাহাকার শুনেছি Gu জোরে এবং পরিষ্কার করার সময়টি প্রায় অনুমান করুন ...">

ইউনিট পরীক্ষার জন্য ব্যক্তিগত পদ্ধতিগুলি উপকারী।

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

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

এটিকে ব্যক্তিগত রেখে কী লাভ করব gain

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

    void nonPrivateMethod(boolean condition) {
        if (condition) {
            privateMethod();
        }
        // other code...
    }

    // unit tests don't invoke nonPrivateMethod(true)
    //   => privateMethod isn't covered.

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

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

  1. নতুন পরীক্ষা নিশ্চিত করে যে এই ব্যবহারের জন্য প্রত্যাশিত আচরণ কোনও বিজ্ঞপ্তি ছাড়াই পরিবর্তিত হবে না কারণ এটি পরিবর্তন হলে, পরীক্ষা ব্যর্থ হবে।

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

  3. নতুন পরীক্ষাটি রিফ্যাক্টরিংয়ের ক্ষেত্রে সহনশীল (আমি কি ব্যক্তিগত পদ্ধতিগুলির রিফ্যাক্টর করব? আপনি বাজি ধরুন!) আমি যা কিছু করি না কেন privateMethod, আমি সর্বদা পরীক্ষা করতে চাই nonPrivateMethod(true)। আমি যাই করুক না কেন privateMethod, পরীক্ষাটি পরিবর্তন করার দরকার হবে না কারণ পদ্ধতিটি সরাসরি চালু করা হয়নি।

খারাপ না? আপনি বাজি ধরুন।

অ্যাক্সেস সীমাবদ্ধতা দুর্বল করা থেকে আমি কী শিথিল করব

এখন কল্পনা করুন যে উপরের পরিবর্তে, আমি কেবল অ্যাক্সেসের সীমাবদ্ধতা দুর্বল করি। আমি পদ্ধতিটি ব্যবহার করে এমন কোডের অধ্যয়ন এড়িয়ে চলেছি এবং পরীক্ষার সাথে সরাসরি এগিয়ে চলেছি যা আমার অনুরোধ করে exPrivateMethod। গ্রেট? না!

  1. উপরে বর্ণিত বেসরকারী এপিআইয়ের নির্দিষ্ট ব্যবহারের জন্য আমি কি পরীক্ষা অর্জন করতে পারি? না: nonPrivateMethod(true)আগে কোনও পরীক্ষা ছিল না , এখন আর তেমন কোনও পরীক্ষা নেই।

  2. বাইরের পাঠকরা কি ক্লাসের ব্যবহার আরও ভালভাবে বোঝার সুযোগ পাবেন? না "- আরে এখানে পরীক্ষিত পদ্ধতির উদ্দেশ্য কী? - এটি ভুলে যান, এটি কঠোরভাবে অভ্যন্তরীণ ব্যবহারের জন্য - - ওফস।"

  3. রিফ্যাক্টরিং করা কি সহনীয়? কোনও উপায় নয়: আমি যা কিছু পরিবর্তন করি exPrivateMethod, সম্ভবত এটি পরীক্ষাটি ভেঙে দেয়। নতুন নামকরণ করুন, অন্য কোনও পদ্ধতিতে মার্জ করুন, যুক্তিগুলি পরিবর্তন করুন এবং পরীক্ষাটি কেবল সংকলন বন্ধ করবে। মাথা ব্যাথা? আপনি বাজি!

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

</ গলাবাজি>


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

@ রবার্টহারভে উত্তরটি প্ররোচিত করার সাথে সাথে উত্তরটি প্রসারিত করল। "ইউনিট পরীক্ষার জন্য ব্যক্তিগত পদ্ধতিগুলি উপকারী ..."
gnat

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

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

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

9

সাদামাটা কারণ: এটি ইতিহাসের সাথে সম্পর্কিত। জাভার পূর্বপুরুষ ওকের কাছে কেবল তিনটি অ্যাক্সেস স্তর ছিল: ব্যক্তিগত, সুরক্ষিত, পাবলিক।

ওকের ব্যক্তিগত ব্যতীত জাভাতে প্যাকেজ প্রাইভেটের সমতুল্য। আপনি ওকের ভাষা নির্দিষ্টকরণের (জোর খনি) বিভাগের 4.10 বিভাগটি পড়তে পারেন :

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

সুতরাং আপনার বক্তব্য পর্যন্ত, ব্যক্তিগতভাবে অ্যাক্সেস, জাভা হিসাবে পরিচিত, মূলত সেখানে ছিল না। তবে যখন আপনার কোনও প্যাকেজে কয়েকটি ক্লাসের বেশি রয়েছে, তখন ব্যক্তিগত না থাকায় আমরা জানি যে এটি এখন নামের সংঘর্ষের একটি দুঃস্বপ্নের দিকে নিয়ে যাবে (উদাহরণস্বরূপ, java.until.concurrent এর প্রায় 60 টি ক্লাস রয়েছে), সম্ভবত এ কারণেই তারা এটি চালু।

তবে ওক এবং জাওয়ার মধ্যে ডিফল্ট প্যাকেজ অ্যাক্সেস (মূলত বেসরকারী নামে পরিচিত) শব্দার্থকগুলি পরিবর্তন করা হয়নি।


5

আমি বিশ্বাস করি যে যদি ডিফল্ট অ্যাক্সেসটি সঠিকভাবে ব্যবহার করা হয় তবে এটি এনক্যাপসুলেশন বজায় রাখার সময় বর্ধিত টেস্টাবিলিটি সরবরাহ করে। এবং এটি ব্যক্তিগত অ্যাক্সেস মডিফায়ারকে রিন্ডন্ড্যান্টও সরবরাহ করে।

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

আপনি যদি BigInteger এর মতো ক্লাসের অন্তর্গত দিকে সন্ধান করেন তবে আপনি ক্ষেত্র এবং পদ্ধতিতে তালিকার বেশ কয়েকটি প্যাকেজ ডিফল্ট সুরক্ষা পাবেন (তালিকায় নীল ত্রিভুজ এমন সবকিছু)। এটি java.math প্যাকেজের অন্যান্য ক্লাসগুলিকে সুনির্দিষ্ট ক্রিয়াকলাপের জন্য তাদের অভ্যন্তরে আরও সর্বোত্তম অ্যাক্সেসের অনুমতি দেয় (আপনি বিগডিসিমাল নামে পরিচিত এই পদ্ধতিগুলি খুঁজে পেতে পারেন - বিগডিসিমাল একটি বিগইন্টিজার দ্বারা সমর্থিত এবং আবার বিগইন্টিজারকে পুনরায় প্রয়োগ করে সংরক্ষণ করে That এগুলি প্যাকেজ স্তর নয়) ' সুরক্ষার জন্য কোনও সমস্যা নেই কারণ java.math একটি সিলড প্যাকেজ এবং এটিতে অন্য কোনও শ্রেণি যুক্ত করা যায় না।

অন্যদিকে, অনেকগুলি জিনিস রয়েছে যা প্রকৃতপক্ষে ব্যক্তিগত they বেশিরভাগ প্যাকেজ সিল করা হয় না। ব্যক্তিগত ব্যতীত, আপনার সহকর্মী সেই প্যাকেজে অন্য ক্লাস স্থাপন করতে পারে এবং (আর নেই) ব্যক্তিগত ক্ষেত্রটি অ্যাক্সেস-ব্রেক ভাঙ্গতে পারে।

লক্ষণীয় বিষয়, ইউনিট টেস্টিং এমন কিছু ছিল না যা যখন সুরক্ষা স্কোপগুলি তৈরি করা হত তখন ফিরে ভাবা হত। JUnit (জাভা জন্য XUnit পরীক্ষার কাঠামো) 1997 সাল পর্যন্ত কল্পনা করা হয়নি (এর গল্পের একটি বর্ণনা http://www.martinfowler.com/bliki/Xunit.html এ পড়তে পারেন )। জেডিকে-র আলফা এবং বিটা সংস্করণগুলি ১৯৯৫ সালে এবং জেডিকে ১.৯ ছিল ১৯৯৯ সালে, যদিও সুরক্ষা স্তরগুলি সত্যিই জেডিকে ১.০.২ অবধি নেইল করা হয়নি (এর আগে আপনার private protectedসুরক্ষা স্তর থাকতে পারে )।

কিছু তর্ক করবে যে ডিফল্টটি প্যাকেজ স্তর নয়, তবে ব্যক্তিগত। অন্যরা বলছেন যে কোনও ডিফল্ট সুরক্ষা থাকা উচিত নয় তবে সমস্ত কিছু স্পষ্ট করে বলা উচিত - এর কিছু অনুগামী কোড লিখবেন যেমন:

public class Foo {
    /* package */ int bar = 42;
    ...
}

সেখানে মন্তব্য নোট করুন।

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

সুতরাং আমি একটি অনুমান নিতে হবে। এবং এটিই হ'ল এক অনুমান।

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

  • ডিজাইনাররা সি ++ এর একটি 'বন্ধুর' সম্পর্কের মাঝে মাঝে প্রয়োজন দেখেছিলেন।
  • ডিজাইনাররা এর জন্য সুস্পষ্ট বিবৃতি চেয়েছিল publicএবং privateএগুলি অ্যাক্সেসের সবচেয়ে বেশি প্রভাব ফেলেছে।

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

আমি যেমন বলেছি, এগুলি সবই অনুমান


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

ওহ অপেক্ষা করুন আপনি সি ++ এ এটি করতে পারেন, জাভাতে আমাদের এটি দরকার!
নিউলোগিক

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

2

এনক্যাপসুলেশন বলতে "আপনাকে এ সম্পর্কে ভাবতে হবে না" বলার একটি উপায়।

                 Access Levels
Modifier    Class   Package  Subclass   World
public        Y        Y        Y        Y
protected     Y        Y        Y        N
no modifier   Y        Y        N        N
private       Y        N        N        N

এগুলি ননটেকনিকাল পদগুলিতে স্থাপন করা।

  1. জনসাধারণ: এটি সম্পর্কে প্রত্যেককে ভাবতে হবে।
  2. সুরক্ষিত: ডিফল্ট এবং সাবক্লাসগুলির এটি সম্পর্কে জানতে হবে।
  3. ডিফল্ট, আপনি যদি প্যাকেজটিতে কাজ করছেন তবে আপনি এটি সম্পর্কে জানবেন (এটি ঠিক আপনার চোখের সামনে রয়েছে) পাশাপাশি আপনাকে এটির সুবিধা নিতে দেবে।
  4. ব্যক্তিগত, আপনি যদি এই ক্লাসে কাজ করে থাকেন তবে আপনার কেবল এটি সম্পর্কে জানতে হবে।

আমার মনে হয় না প্রাইভেট ক্লাস বা সুরক্ষিত শ্রেণীর মতো জিনিস আছে ..
কোরে তুগায়

@ কোরায়েগুয়ে: ডকস.অরাকল . com/ জাভাসে / টিউটোরিয়াল / জাভা / জাভাও / ইনারক্ল্যাশস এইচটিএমএল দেখুন । অভ্যন্তর শ্রেণিটি প্রাইভেট। শেষ অনুচ্ছেদ পড়ুন।
jmoreno

0

আমি মনে করি না তারা পরীক্ষার দিকে মনোনিবেশ করেছিল, কেবল কারণ টেস্টগুলি তখন খুব সাধারণ ছিল না।

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

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


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