জাভা প্যাকেজ স্তরের সুযোগ কি কার্যকর?


11

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

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

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

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

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


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

কোড তাকান java.util.Stringএবং java.util.Integer


2
সদৃশ প্রশ্নের উপরের ভোটের উত্তরে প্যাকেজ-প্রাইভেটের জন্য সর্বাধিক গুরুত্বপূর্ণ ব্যবহারটি আবৃত করা হয়েছে, কেন এটি কার্যকর তা স্পষ্টভাবে উত্তর দেওয়া।

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

উত্তর:


2

java.util.*প্যাকেজ জুড়ে এমন উদাহরণ রয়েছে যেখানে প্যাকেজ স্তর সুরক্ষা সহ কোড লেখা থাকে। উদাহরণস্বরূপ, এই বিট java.util.String- জাভা 6 এর একজন নির্মাতা :

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}

বা এই getChars পদ্ধতি :

/** Copy characters from this string into dst starting at dstBegin. 
    This method doesn't perform any range checking. */
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, offset, dst, dstBegin, count);
}

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

এই পদ্ধতিগুলি এবং ক্ষেত্রগুলিকে কেবল java.utilপ্যাকেজের অন্যান্য শ্রেণি দ্বারা অ্যাক্সেস করতে সীমাবদ্ধ করে এটি তাদের মধ্যে ঘনিষ্ঠ মিলন তৈরি করে তোলে তবে এই বাস্তবায়ন বিবরণ বিশ্বে প্রকাশ করা এড়িয়ে যায়।

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

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


1
আমি java.util মাধ্যমে দেখেছি এবং আমি এটি দেখতে পারি। যাইহোক, আমি এটি একটি বড় লাইব্রেরি লক্ষ্য করি। এখনকার দিনগুলিতে মনে হচ্ছে লাইব্রেরিগুলি সাব-প্যাকেজগুলি ব্যবহার না করেই খুব কম লেখা হয়; এবং এটি সেই উপ-প্যাকেজ বিভাগগুলি যা সীমাবদ্ধ করে। আমি জাভা.উটিলটি ভুল বলছি না, তবে মনে হচ্ছে তারা কেবলমাত্র একটি বৃহত প্যাকেজ নিয়ে পালাতে পারত কারণ তাদের খুব ভাল প্রগ্রেমার ছিল কারণ তারা প্যাকেজের মধ্যে সীমিত এনক্যাপসুলেশন দিয়ে সঠিকভাবে সবকিছু করতে বিশ্বাস করতে পারে; আমার মতো ন্যূনতম প্যাকেজগুলিতে কাজ করতে পারে এমন গড় বিকাশকারীদের খারাপ করার অনেক সম্ভাবনা নিয়ে আমি নগ্ন বোধ করব।
dsollen

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

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

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

2
@ বিসর্জন এটি কর্মক্ষমতা সম্পর্কে নয় (যদিও এটি বাস্তবায়ন প্রকাশের এক কারণ) তবে বরং এনক্যাপসুলেশন। আপনি এটা কোড পুনরাবৃত্তি এড়ান করতে Integer.toString()এবং String.valueOf(int)পুরো বিশ্বের জন্য প্রকাশক ছাড়া কোড শেয়ার করতে পারেন। java.utilক্লাস কনসার্টের মধ্যে কাজ করতে বরং পৃথক ক্লাস সম্পূর্ণরূপে নিজেদের উদ্দেশ্যে দ্বীপ হয় থাকার চেয়ে কার্যকারিতা একটি বৃহত্তর পুরো প্রদান - তারা মাধ্যমে প্যাকেজ স্তর scoping একটি প্যাকেজ এবং ভাগ বাস্তবায়ন কার্যকারিতা একসঙ্গে আছে।

5

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

যেহেতু জুনিট-পরীক্ষার আইটেম-আন্ডার-টেস্টের মতো একই প্যাকেজ রয়েছে এটি এই প্রয়োগের বিশদটি অ্যাক্সেস করতে পারে

উদাহরণ

  public class MyClass {
    public MyClass() {
        this(new MyDependency());
    }

    /* package level to allow junit-tests to insert mock/fake implementations */ 
    MyClass(IDependency someDepenency) {...}
  }

এটি বিতর্কযোগ্য যদি এটি "ভাল" ব্যবহার হয় বা না হয় তবে এটি ব্যবহারিক হয়


2
আমি সর্বদা ভিন্ন প্যাকেজে পরীক্ষা করে থাকি, অন্যথায় আমি ডিফল্ট স্কোপে এমন কিছু কী পদ্ধতি রেখে গিয়েছি যা অন্য কাউকে কল করতে দেয় না ...
সোরি ২

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

protectedপ্যাকেজ-সুযোগে উন্নীত কেন ? protected ইতিমধ্যে প্যাকেজ অ্যাক্সেস সরবরাহ করে। এটি কিছুটা অদ্ভুত কৌতুক, তবে আমি মনে করি তারা যৌগিক স্কোপ ডিক্লেয়ারেশন যেমন protected packagescope void doSomething()(যার জন্য একটি নতুন কীওয়ার্ডের প্রয়োজন হয়) প্রয়োজন হয় নি।
tgm1024 - মনিকার সাথে

2

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

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

জাভা 9 এটিকে সম্বোধন করার পদ্ধতি, যাতে আপনি একটি মডিউলে কয়েকটি প্যাকেজ রাখতে পারেন এবং কেবল কিছু রফতানি করতে পারেন। তবে এটি প্যাকেজের সুযোগটিকে আরও বাড়াবাড়ি করে তুলবে।

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


আমি জাভা 9 মন্তব্য আকর্ষণীয় মনে। আমি মনে করি প্যাকেজ হেরাকিগুলি সনাক্ত করতে এবং কিছু প্যারেন্ট প্যাকেজ (টিকা ব্যবহার করে?) এর সাথে সম্পর্কিত প্যাকেজ স্কোপটিকে কোনওভাবে সংজ্ঞায়িত করার একটি সহজ ক্ষমতা দুর্দান্ত হবে।
dsollen

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

2

সংযোগ ধরণ আপনার বর্ণনা সত্যিই যেখানে আপনি প্যাকেজ এক্সেস ব্যবহার করেন সেরা উদাহরণ নয়। প্যাকেজটি ইন্টারফেসে বিনিময়যোগ্য উপাদান, মডিউলগুলি তৈরি করার জন্য কার্যকর able

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

**MissionManager.jar** - an application which uses the Java Service Provider Interface to load some implementation of missions, possible provided by a 3rd party vendor.

**missions-api.jar** - All interfaces, for services and model
    com...missions
        MissionBuilder.java   - has a createMission method
        Mission.java - interface for a mission domain object
    com...missions.strategy
        ... interfaces that attach strategies to missions ...
    com...missions.reports
        .... interfaces todo with mission reports ....

   **MCo-missionizer-5000.jar** -  provides MCo's Missionizer 5000 brand mission implementation.
       com...missions.mco
                  Mission5000.java - implements the Mission interface.
       com...missions.strategy.mco
              ... strategy stuff etc ...

মিশন 5000. জাভাতে প্যাকেজ স্তরটি ব্যবহার করে আপনি নিশ্চিত করতে পারবেন যে মিশন ম্যানেজারের মতো অন্য কোনও প্যাকেজ, বা উপাদান মিশন বাস্তবায়নের জন্য দম্পতিকে টাইট করতে পারে না। এটি কেবলমাত্র "এম কো" থেকে সরবরাহিত উপাদান "তৃতীয় পক্ষ" সেখানে একটি মিশনের নিজস্ব ব্র্যান্ডেড বাস্তবায়ন তৈরি করে। মিশন ম্যানেজারকে অবশ্যই মিশনবিলার.ক্রিটমিশন (...) কল করতে হবে এবং সংজ্ঞায়িত ইন্টারফেস ব্যবহার করতে হবে।

এইভাবে যদি মিশন বাস্তবায়ন উপাদানটি প্রতিস্থাপন করা হয় তবে আমরা জানি যে মিশন ম্যানেজ.আরজার প্রয়োগকারীরা এপিআইকে বাইপাস করেনি এবং সরাসরি এমসির বাস্তবায়ন ব্যবহার করে না।

অতএব আমরা একটি প্রতিযোগিতামূলক পণ্যটির সাথে এমসিও-মিশনাইজার ৫০০.০০.জার আউটপুট দিতে পারি। (অথবা মিশন পরিচালকের ইউনিট পরীক্ষার জন্য সম্ভবত একটি মোক)

বিপরীতে এমসিও তাদের মালিকানাধীন মিশনাইজার ট্রেড সিক্রেটগুলি হিডিংয়ের কিছু পরিমাণ করতে পারে।

(এটি একই সাথে উপাদানগুলিতে অস্থিরতা এবং বিমূর্ততা ধারণা প্রয়োগ করে for )


-1

কারণ জাভাতে প্যাকেজ স্কোপটি শ্রেণিবদ্ধভাবে ডিজাইন করা হয়নি এটি খুব কার্যকর hard আমরা প্যাকেজ সুযোগটি মোটেই ব্যবহার করি না এবং সমস্ত শ্রেণিকে সর্বজনীন হিসাবে সংজ্ঞায়িত করি।

পরিবর্তে আমরা প্যাকেজ শ্রেণিবিন্যাস এবং পূর্বনির্ধারিত প্যাকেজ নামের উপর ভিত্তি করে আমাদের নিজস্ব অ্যাক্সেস বিধিগুলি ব্যবহার করি।

যদি আপনি "কোডারু-বিধি" এর বিশদ গুগলে আগ্রহী হন।

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