বিজ্ঞপ্তি প্যাকেজ নির্ভরতা কীভাবে সমাধান করবেন


11

আমি একটি বৃহত কোডবেস রিফ্যাক্টর করছি যেখানে বেশিরভাগ ক্লাসগুলি একটি প্যাকেজে অবস্থিত। আরও ভাল মডুলারিটির জন্য, আমি প্রতিটি কার্যকারিতার জন্য উপপ্যাকগুলি তৈরি করছি।

আমি কোথাও শিখেছি যে কোনও প্যাকেজ নির্ভরতা গ্রাফের লুপগুলি না থাকা উচিত, তবে নিম্নলিখিত সমস্যাটি কীভাবে সমাধান করা যায় তা আমি জানি না: Figureপ্যাকেজে রয়েছে figure, Layoutপ্যাকেজে রয়েছে layout, Layoutবিন্যাস সম্পাদনের জন্য চিত্রের প্রয়োজন হয়, সুতরাং প্যাকেজ প্যাকেজের layoutউপর নির্ভর করে figure। তবে অন্যদিকে, একটি এর অভ্যন্তরে Figureঅন্য Figureগুলি ধারণ করতে পারে Layoutযা প্যাকেজকে প্যাকেজের figureউপর নির্ভর করে layout

আমার কাছে কিছু সমাধান রয়েছে যেমন একটি Containerইন্টারফেস তৈরি করা যা Figureকার্যকর করে এবং Layoutপ্যাকেজে রাখে। এটি কি ভাল সমাধান? অন্য কোন সম্ভাবনা?

ধন্যবাদ


এটি মডিউলগুলি (যেমন বিভিন্ন জারগুলি) বিজ্ঞপ্তি নির্ভরতা থাকতে পারে না। প্যাকেজগুলি একই মডিউলের অন্তর্ভুক্ত যতক্ষণ না তারা প্রায়শই বিজ্ঞপ্তি অবনতি করতে পারে।
লরাস

@lorus সুতরাং এটি কোনও ডিজাইনের সমস্যা নয়?
ভ্যানোলো

2
না এটা না. প্যাকেজগুলি সাধারণত একটি নামস্থান থাকে his এটি কেবল তখনই পরিবর্তিত হতে পারে যখন তারা অন্য কোনও কিছুর জন্য ব্যবহার করে, যেমন ওএসজি পরিবেশে তাদের সামগ্রীর দৃশ্যমানতা পরিবর্তন করতে। অন্যথায় বিরক্ত করবেন না।
লরাস

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

উত্তর:


9

ইনভারসন অফ কন্ট্রোল সম্পর্কে আপনার ভাবা উচিত

আপনি মূলত আপনার জন্য একটি ইন্টারফেসটি সংজ্ঞায়িত করেন Layoutযা আপনার নিজস্ব প্যাকেজে আপনার লেআউট ক্লাসের কাছাকাছি অবস্থিত যাতে আপনার কাছে একটি বাস্তবায়ন প্যাকেজ এবং একটি পাবলিক ইন্টারফেস প্যাকেজ থাকে - উদাহরণস্বরূপ এটি কল করুন Layoutable(আমি জানি না যে এটি সঠিক ইংরেজী কিনা)। এখন - লেআউট সেই ইন্টারফেসটি প্রয়োগ করবে না তবে Figureশ্রেণিটি। একইভাবে আপনি চিত্রের Drawableজন্য উদাহরণস্বরূপ একটি ইন্টারফেস তৈরি করবেন ।

সুতরাং

my.public.package.Layoutable
my.implementation.package.Layout
my.public.package.Drawable
my.implementation.package.Figure

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

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

এটাই মোটামুটি ধারণা।

এই সমস্যার সমাধানের জন্য একটি দুর্দান্ত উত্স হ'ল কર્ક ন্নারসচাইল্ডের জাভা অ্যাপ্লিকেশন আর্কিটেকচার বইটি ।


Containerপ্রশ্নটিতে প্রস্তাবিত ইন্টারফেসের মতো এটিই কি নয় ?
ওয়াঘানড্রয়েড

হ্যাঁ - এবং না - আমি উভয়কে আমার প্যাকেজে একই প্যাকেজে রাখব না। এবং এর পিছনে খুব বেশি তত্ত্ব ছিল না। এবং এই ক্ষেত্রে এটি একদিকে করা যথেষ্ট নয়, আপনাকে এটি উভয় পক্ষেই করতে হবে। ঠিক আছে?
মাইকেল_স

ওহো, আমি Containerএকই প্যাকেজে যাওয়া সম্পর্কে মূল প্রশ্নটিতে কিছুটা মিস করেছি Layout। এটি কার্যকর হবে না, যেখানে আপনার সমাধান হবে।
ওয়াঘানড্রয়েড

আহ - ঠিক আছে - আমি মনে হচ্ছিলাম যে আমি ধারকটির সাথে অংশটি মিস করেছি যদিও আমি যখন হ্যাকিং করছিলাম - তবে এটির নামটি কনটেইনার রাখা উচিত ছিল;)
মাইকেল_স

0

আমি কী তা সম্পর্কে খুব পরিষ্কার নয় Figure, তবে সম্ভবত এটি একই প্যাকেজে থাকা উচিত Layout?

আপনার প্রস্তাবিত Containerইন্টারফেস সমাধান কাজ করবে না - আপনি যদি Containerতৃতীয় প্যাকেজের ইন্টারফেসটি না রাখেন তবে দুটি প্যাকেজের মধ্যে আপনার এখনও একটি বৃত্তাকার নির্ভরতা থাকবে। কিছু কাজ করবে তার জন্য মাইকেল_স এর উত্তর দেখুন ।

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

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