স্তরযুক্ত সফ্টওয়্যার আর্কিটেকচারে একই স্তরের বস্তুর মধ্যে নির্ভরতা থাকা কি সমস্যাযুক্ত?


12

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

তবে আমি নিশ্চিত না যে একই স্তরের অন্যান্য বস্তুর উপর নির্ভর করে এমন অবজেক্টগুলি সম্পর্কে কী চিন্তাভাবনা করা উচিত।

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

এখানে চিত্র বর্ণনা লিখুন

বিজ্ঞপ্তি নির্ভরতা বাদ দিয়ে, উত্থাপিত হতে পারে এবং এই ক্ষেত্রে স্তরযুক্ত আর্কিটেকচারটি কতটা লঙ্ঘিত হচ্ছে তা নিয়ে আমি আগ্রহী।


আপনার যদি চক্র না থাকে তবে এমন স্তরে যেখানে আপনার দিগন্তের লিঙ্কগুলি রয়েছে সেখানে উপ-স্তরগুলিতে বিভক্ত হওয়া রয়েছে যা কেবল স্তরগুলির মধ্যে কেবল নির্ভরশীলতা রয়েছে
সর্বাধিক 630

উত্তর:


10

হ্যাঁ, এক স্তরের বস্তুর একে অপরের মধ্যে সরাসরি নির্ভরতা থাকতে পারে, কখনও কখনও এমনকি চক্রাকারগুলিও - এটি আসলে বিভিন্ন স্তরের বস্তুর মধ্যে অনুমোদিত নির্ভরতাগুলির মূল পার্থক্য তৈরি করে, যেখানে কোনও প্রত্যক্ষ নির্ভরতা অনুমোদিত নয়, বা কেবল একটি কঠোর নির্ভরতা অভিমুখ .

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

উদাহরণস্বরূপ, যাক, আপনার কাছে একটি "অনুভূমিকভাবে স্তরযুক্ত সিস্টেম" রয়েছে যার সাথে একটি ডাটাবেস স্তর, একটি ব্যবসায় স্তর এবং একটি ব্যবহারকারী ইন্টারফেস (ইউআই) স্তর রয়েছে। আসুন বলুন যে ইউআই স্তরটিতে কমপক্ষে কয়েক ডজন বিভিন্ন সংলাপের ক্লাস রয়েছে।

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

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


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

@ ব্র্যাককো ২৩: "অভ্যন্তরীণ" নির্ভরতা থাকার পক্ষে মতামতগুলি স্বেচ্ছাসেবী নির্ভরতা থাকার পক্ষে মত হয়। "কনস" তারা হ'ল উপাদানগুলি পুনরায় ব্যবহার করা শক্ত এবং পরীক্ষার পক্ষে আরও শক্ত, বিশেষত অন্যান্য উপাদানগুলি থেকে বিচ্ছিন্নতায়। পেশাদাররা হ'ল সুস্পষ্ট নির্ভরতা এমন জিনিসগুলিকে তৈরি করে যার জন্য সামঞ্জস্যতা ব্যবহার করা, বোঝা, পরিচালনা এবং পরীক্ষা করা সহজ হয়।
ডক ব্রাউন

14

আমি এটি বলতে স্বাচ্ছন্দ্য বোধ করি যে কোনও স্তরের অন্তর্গত একটি অবজেক্ট নিম্ন স্তর থেকে আসা বস্তুর উপর নির্ভর করতে পারে

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

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

তবে আমি নিশ্চিত না যে একই স্তরের অন্যান্য বস্তুর উপর নির্ভর করে এমন অবজেক্টগুলি সম্পর্কে কী চিন্তাভাবনা করা উচিত।

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


উত্তর করার জন্য ধন্যবাদ. হ্যাঁ, স্তরটি অবজেক্টগুলি নয় তবে ইন্টারফেসগুলিকে প্রকাশ করা উচিত, আমি এটি জানি তবে সরলতার জন্য আমি এটিকে রেখে দিয়েছি।
bracco23

4

এটি ব্যবহারিকভাবে তাকান

এখানে চিত্র বর্ণনা লিখুন

Obj 3এখন জানেন Obj 4। তাতে কি? আমাদের যত্ন কেন?

ডিআইপি বলে

"উচ্চ-স্তরের মডিউলগুলি নিম্ন-স্তরের মডিউলগুলির উপর নির্ভর করে না Both উভয়েরই বিমূর্ততার উপর নির্ভর করা উচিত" "

ঠিক আছে তবে, সমস্ত বস্তু বিমূর্ত নয়?

ডিআইপিও বলে

"বিমূর্ততা বিশদগুলির উপর নির্ভর করে না Details বিশদ বিমূর্তির উপর নির্ভর করে।"

ঠিক আছে তবে, যদি আমার অবজেক্টটি সঠিকভাবে এনপ্যাপুলেটেড থাকে যা কোনও বিবরণ লুকায় না?

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

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

Obj 3জানে Obj 4বিদ্যমান। কিন্তু কংক্রিট Obj 3কিনা তা জানেন Obj 4?

এখানে ঠিক এই কারণেই এটি কোথাও ছড়িয়ে না পারা খুব সুন্দর new। কংক্রিট Obj 3কিনা Obj 4তা যদি জানেন না, সম্ভবত কারণ এটি এটি তৈরি করেনি, তবে আপনি যদি পরে স্নেক করেন এবং Obj 4একটি বিমূর্ত শ্রেণিতে পরিণত হন তবে সেটির কোনও কারণ Obj 3হবে না।

আপনি যদি এটি করতে পারেন তবে Obj 4পুরোপুরি বিমূর্তভাবে সমস্ত বরাবর ছিল। শুরু থেকেই তাদের মধ্যে ইন্টারফেস তৈরির একমাত্র জিনিসটি আপনি নিশ্চিত হন যে কেউ দুর্ঘটনাক্রমে এমন কোনও কোড যুক্ত করবে যা এই Obj 4মুহূর্তে কংক্রিটের কাছে দেয় । সুরক্ষিত নির্মাণকারীরা সেই ঝুঁকি হ্রাস করতে পারে তবে এটি অন্য প্রশ্নের দিকে নিয়ে যায়:

ওবজ 3 এবং ওবজ 4 একই প্যাকেজে কী?

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

আমি বৈশিষ্ট্য দ্বারা গ্রুপ করতে চান। যদি Obj 3এবং Obj 4একই গোষ্ঠী এবং স্তর হয় তবে এটি খুব কমই অসম্ভব যে আপনি একটি প্রকাশ করেছেন এবং কেবলমাত্র অন্য একটিতে পরিবর্তন করার প্রয়োজনে এটি পুনরুদ্ধার করতে চান না। তার মানে এই বিষয়গুলির স্পষ্ট প্রয়োজন হওয়ার আগেই তাদের মধ্যে বিমূর্ততা রাখার দ্বারা উপকৃত হওয়ার সম্ভাবনা কম।

আপনি যদি কোনও গ্রুপের সীমানা অতিক্রম করছেন তবে উভয় পক্ষের অবজেক্টগুলিকে স্বতন্ত্রভাবে পৃথক হতে দেওয়া সত্যিই ভাল ধারণা।

এটি এমন সহজ হওয়া উচিত তবে দুর্ভাগ্যক্রমে জাভা এবং সি # উভয়ই দুর্ভাগ্যজনক পছন্দ করেছে যা এটিকে জটিল করে তোলে।

সি # তে প্রতিটি কীওয়ার্ড ইন্টারফেসের একটি Iউপসর্গের সাথে নাম লেখানোর tradition তিহ্য। এটি ক্লায়েন্টদের জানতে জোর করে তারা কীওয়ার্ড ইন্টারফেসের সাথে কথা বলছে। যে রিফ্যাক্টরিং পরিকল্পনা সঙ্গে গণ্ডগোল।

জাভাতে এটি আরও ভাল নামকরণের প্যাটার্নটি ব্যবহার করার traditionতিহ্য: FooImple implements Fooতবে জাভা কীওয়ার্ড ইন্টারফেসকে একটি ভিন্ন বাইনারিতে সংকলন করায় এটি কেবল উত্স কোড পর্যায়ে সহায়তা করে। এর অর্থ যখন আপনি যখন Fooকংক্রিট থেকে বিমূর্ত ক্লায়েন্টগুলিকে একক অক্ষর কোডের প্রয়োজন হয় না তখন তাদের পুনরায় সংকলন করতে হবে clients

এই বিশেষ ভাষাগুলিতে এই সমস্যাগুলি হ'ল যা লোকেরা সত্যই এটি প্রয়োজন না হওয়া অবধি আনুষ্ঠানিক বিমূর্তকরণ বন্ধ রাখতে সক্ষম করে। আপনি কোন ভাষাটি ব্যবহার করছেন তা আপনি বলেননি তবে কিছু ভাষা রয়েছে যা বুঝতে সমস্যা হয় না these

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

YAGNI নীতি এখানে মূল ভূমিকা পালন করে। তবে তাই "দয়া করে নিজেকে পায়ে গুলি করা শক্ত করুন"।


0

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

উদাহরণস্বরূপ, নির্ভরতা বিধি দৃষ্টিকোণ থেকে। ডিআর হ'ল একটি নিয়ম যা রবার্ট সি মার্টিন তার বিখ্যাত ক্লিন আর্কিটেকচারের জন্য প্রস্তাব করেছিলেন ।

এটা বলে

উত্স কোড নির্ভরতাগুলি কেবলমাত্র উচ্চতর স্তরের নীতিগুলির দিকে, অভ্যন্তরীণ দিকে নির্দেশ করবে।

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

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

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

আর একটি স্ট্যান্ডপয়েন্ট হচ্ছে এসআরপি।

ক্ষতিকারক নির্ভরতাগুলি ভাঙার এবং নির্ভরশীলতা বিপরীতমুখীকরণ (আইওসি) এর মতো কয়েকটি সেরা অনুশীলনগুলি দিয়ে বোঝানো আমাদের ডিকউপলিং way তবে যে উপাদানগুলি পরিবর্তনের কারণগুলি ভাগ করে তারা ডিউপল করার কারণ দেয় না কারণ একই কারণে পরিবর্তিত হওয়ার কারণগুলি একই সময়ে পরিবর্তিত হবে (খুব সম্ভবত) এবং সেগুলি একই সময়ে মোতায়েন করা হবে। যদি এরপরে Obj3এবং Obj4তারপরে আবারও কিছু হয় তবে সহজাতভাবে কিছু ভুল হয় না।

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