জাভাতে লেখা একটি এপিআইতে অভ্যন্তরীণ ক্লাসগুলি কীভাবে সজ্জিত করা যায়?


9

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

কাঠামোর জন্য আমি বর্তমানে দুটি উপায় দেখতে পাচ্ছি:

1. প্যাকেজ ব্যবহার।

পেশাদাররা: গ্রন্থাগারটি খুব সুন্দরভাবে কাঠামোগত করা যেতে পারে। সবকিছু তার নিজের জায়গায়।

কনস: প্যাকেজ সীমান্তের মাধ্যমে ক্লাসের ব্যবহারের জন্য সর্বজনীন ক্লাস প্রয়োজন এবং তাই পুরো লাইব্রেরির এপিআই বিস্তৃত করুন।

২. একটি প্যাকেজে সমস্ত স্ট্যাটিক ইনার ক্লাস ব্যবহার করুন।

পেশাদার: খুব সামান্য পাবলিক জিনিস (ক্লাস, পদ্ধতি ইত্যাদি) প্রয়োজন।

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


একটি ভাল কাঠামোগত লাইব্রেরিতে একটি ছোট এপিআই অর্জন করার আরও ভাল উপায় আছে কি?

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


আপনার অভ্যন্তর শ্রেণিগুলিকে অচল করার দরকার কেন?
ডেভিড আরনো

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

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

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

1
@ টুলিনস কর্ডোভা: হ্যাঁ, কোড ইউনিটগুলি বড় হয়ে যায় (প্রতি ফাইলের 3k লাইন কোড)। এটি কাঠামোগত এই পদ্ধতির আরেকটি গুরুত্বপূর্ণ সমস্যা।
মার্কাস ফ্রেউনফেলার্ডার 15

উত্তর:


1

আমি দেখতে পাচ্ছি আপনি কি করছেন ২. আপনি প্যাকেজ হিসাবে প্যাকেজ এবং মডিউল হিসাবে প্যাকেজ হিসাবে ক্লাস ব্যবহার করছেন যাতে আপনি প্যাকেজের মধ্যে নিজেকে বিচ্ছিন্ন করতে পারেন তবে ক্লাসগুলি ব্যবহার করে প্যাকেজের অভ্যন্তরে সজ্জিত করতে পারেন।

খুব চালাক। চতুর থেকে সাবধান।

এটি আপনাকে একই উত্স ফাইলে একাধিক ক্লাস জ্যাম করতে বাধ্য করবে (যা আপনি পছন্দ করতে পারেন) এবং পাথের একটি অতিরিক্ত ক্যাপিটাল শব্দ রয়েছে।

এটি বাইরে থেকে আপনার পথে হ্যাক করার জন্য প্রতিবিম্বটি ব্যবহার না করা হলে প্যাকেজের মধ্যে কোনও পরীক্ষা কোড লিখতে বাধ্য করবে।

অন্য যে তারপর, এই কাজ করবে। এটি কেবল অদ্ভুত বলে মনে হবে।

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

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

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

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

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

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 করে এবং API টি প্রসারিত করে। ইন্টারফেসের যথাযথ ব্যবহার চাপটি প্রয়োগের বাইরে রাখে।

1 এ আপনি যা চান তা হ্যাক করা এমনকি আরও খারাপ। কল স্ট্যাকের দিকে তাকাও এবং যখনই আপনাকে যা পছন্দ করে না এমন প্যাকেজ থেকে যখনই আপনাকে ডেকে আনে তখনও তার ব্যতিক্রম নিক্ষেপ করুন। Eeew।


3

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

শেষ-ব্যবহারকারীদের যে জিনিসগুলি করা উচিত নয় সেগুলি অ্যাক্সেস করা থেকে বাঁচতে আপনাকে আপনার এপিআইকে ইন্টারফেস এবং বাস্তবায়নে আলাদা করতে হবে।

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

অথবা আপনি এটি কনভেনশনের মাধ্যমে, internalপ্যাকেজগুলি তৈরি করে এবং সেই প্যাকেজগুলি বাস্তবায়ন-নির্ভর হিসাবে ডকুমেন্ট করে এবং সতর্কতা বা পিছনের সামঞ্জস্য ছাড়াই পরিবর্তন সাপেক্ষে করতে পারেন।


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

@ ফ্রিমার্কাস - আমি মনে করি যে (1) আপনি অ্যাক্সেস নিয়ন্ত্রণের বাইরে অনেক বেশি প্রত্যাশা করছেন, বা (২) আপনার প্যাকেজ কাঠামোর পুনরায় চিন্তা করা দরকার যাতে একটি প্যাকেজ থেকে ক্লাসগুলি অন্য ক্লাসের উপর নির্ভর করতে না পারে প্যাকেজ (যদি আপনি স্থির নেস্টেড ক্লাস হিসাবে সবকিছু রাখতে পারেন তবে এটি কঠিন হওয়া উচিত নয়)।
কেডিগ্রিগরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.