সিটিতে ইন্টারফেস বিভাজন নীতিটি কীভাবে প্রয়োগ করবেন?


15

আমার একটি মডিউল আছে, 'এম' বলুন, যার কয়েকটি ক্লায়েন্ট রয়েছে, বলুন 'সি 1', 'সি 2', 'সি 3'। আমি মডিউল এম এর নেমস্পেসকে ভাগ করতে চাই, অর্থাৎ এটির প্রকাশিত হওয়া API গুলি এবং ডেটাগুলির ঘোষণাগুলি এমনভাবে শিরোনামের ফাইলগুলিতে (যেমন) -

  1. যে কোনও ক্লায়েন্টের জন্য এটির প্রয়োজনীয় ডেটা এবং API গুলি দৃশ্যমান; মডিউলটির বাকি নামস্থানটি ক্লায়েন্টের কাছ থেকে লুকানো আছে অর্থাৎ ইন্টারফেস বিভাজন নীতিটি মেনে চলা ।
  2. একাধিক শিরোলেখ ফাইলগুলিতে একটি ঘোষণার পুনরাবৃত্তি হয় না যেমন ডিআরওয়াই লঙ্ঘন করে না ।
  3. মডিউল এম এর ক্লায়েন্টগুলির উপর কোনও নির্ভরতা নেই।
  4. একটি ক্লায়েন্ট এটি ব্যবহার করে না মডিউল এম এর অংশে পরিবর্তন দ্বারা প্রভাবিত হয়।
  5. বিদ্যমান ক্লায়েন্টরা আরও ক্লায়েন্টদের সংযোজন (বা মোছা) দ্বারা প্রভাবিত হয় না।

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

মডিউল নামস্থান পার্টিশন

যাইহোক, এটি উল্লিখিত কিছু প্রয়োজনীয়তা অর্থাৎ আর 3 এবং আর 5 লঙ্ঘন করে। প্রয়োজনীয়তা 3 লঙ্ঘিত হয়েছে কারণ এই পার্টিশনটি ক্লায়েন্টের প্রকৃতির উপর নির্ভর করে; একটি নতুন ক্লায়েন্ট যুক্ত করার সাথে সাথে এই বিভাজনটি পরিবর্তিত হয় এবং প্রয়োজনীয়তা লঙ্ঘন করে 5.. উপরের চিত্রের ডান দিকে দেখতে পারা যায়, নতুন ক্লায়েন্ট যুক্ত করার সাথে মডিউলটির নামস্থানটি এখন 7 হেডার ফাইলগুলিতে বিভক্ত - 'এ ',' বি ',' সি ',' 1 ',' 2 * ',' 3 * 'এবং' 4 ' । 2 টি পুরানো ক্লায়েন্টের পরিবর্তিত হেডার ফাইলগুলি এর ফলে তাদের পুনর্নির্মাণকে ট্রিগার করে।

অ-স্বাক্ষরিত পদ্ধতিতে সি-তে ইন্টারফেস বিভাজন অর্জনের কোনও উপায় আছে কি?
যদি হ্যাঁ, আপনি কিভাবে উপরোক্ত উদাহরণটি মোকাবেলা করবেন?

একটি অবাস্তব অনুমানমূলক সমাধান যা আমি কল্পনা করি তা হ'ল -
মডিউলটির 1 টি ফ্যাট শিরোনাম ফাইলটি পুরো নেমস্পেসকে coveringেকে রাখে। এই শিরোনাম ফাইলটি কোনও উইকিপিডিয়া পৃষ্ঠার মতো ঠিকানাযোগ্য বিভাগ এবং সাবসেকশনগুলিতে বিভক্ত। প্রতিটি ক্লায়েন্টের জন্য এটির জন্য উপযুক্ত একটি নির্দিষ্ট হেডার ফাইল থাকে has ক্লায়েন্ট-নির্দিষ্ট হেডার ফাইলগুলি কেবল ফ্যাট হেডার ফাইলের বিভাগ / সাব-বিভাগের হাইপারলিঙ্কগুলির একটি তালিকা। এবং বিল্ড সিস্টেমে মডিউলটির শিরোনামে যে বিভাগটি নির্দেশ করেছে সেগুলির কোনওটি যদি সংশোধন করা হয় তবে একটি ক্লায়েন্ট-নির্দিষ্ট হেডার ফাইলটিকে 'সংশোধিত' হিসাবে স্বীকৃতি দিতে হবে।


1
এই সমস্যাটি সি এর সাথে নির্দিষ্ট কেন? সি এর উত্তরাধিকার নেই বলেই কি?
রবার্ট হার্ভে

এছাড়াও, আইএসপি লঙ্ঘন করা কি আপনার নকশাকে আরও ভাল করে তোলে?
রবার্ট হার্ভে

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

1
structআপনি ইন্টারফেস চান যখন আপনি সি ব্যবহার করেন। মঞ্জুর, পদ্ধতিগুলি কিছুটা কঠিন। আপনি এটি আকর্ষণীয় খুঁজে পেতে পারেন: cs.rit.edu/~ats/books/ooc.pdf
রবার্ট হার্ভে

আমি structএবং ব্যবহার করে একটি ইন্টারফেস সমতুল্য নিয়ে আসতে পারিনি function pointers
work.bin

উত্তর:


5

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

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

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


আমি নিশ্চয় ধরে নিই যে আপনি ছদ্মবেশ বা অ-ওভারল্যাপিং গোষ্ঠীগুলি বোঝাচ্ছেন ?
ডক ব্রাউন

হ্যাঁ, বিরক্তিহীন এবং অ-ওভারল্যাপিং।
নজর মেরজা

3

ইন্টারফেস বিচ্ছিন্নতার নীতি বলে:

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

এখানে কয়েকটি উত্তরবিহীন প্রশ্ন রয়েছে। এক:

কত ছোট?

তুমি বলো:

বর্তমানে আমি মডিউলটির ক্লায়েন্টগুলির প্রয়োজনীয়তার উপর নির্ভর করে নেমস্পেসকে ভাগ করে এটি মোকাবিলা করছি।

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

তবে আইএসপি কেবল "সুসংগত" রোল ইন্টারফেসের জন্য কল নয় যা পুনরায় ব্যবহার করা যেতে পারে। কোনও "সুসঙ্গত" রোল ইন্টারফেস ডিজাইন তার নিজস্ব ভূমিকা প্রয়োজনের সাথে কোনও নতুন ক্লায়েন্ট সংযোজন থেকে নিখুঁতভাবে রক্ষা করতে পারে না।

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

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

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

প্রথমে নিজেকে জিজ্ঞাসা করুন: এখনই পরিষেবা ইন্টারফেসে কী পরিবর্তন করা কঠিন? যদি তা না হয় তবে বাইরে যান এবং শান্ত না হওয়া পর্যন্ত খেলুন। এটি কোনও বৌদ্ধিক অনুশীলন নয়। দয়া করে নিশ্চিত হয়ে নিন যে রোগটি রোগের চেয়ে খারাপ নয়।

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

  2.  

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

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

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

সুতরাং দেখা যাচ্ছে যে তারা সত্যই খুব ছোট পেতে পারে।

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


আর একটি উত্তর না দেওয়া প্রশ্ন হ'ল:

এই ইন্টারফেসের মালিক কে?

বারবার আমি "লাইব্রেরি" মানসিকতা বলি তাই ডিজাইন করা ইন্টারফেস দেখতে পাই। আমরা সকলেই বানর-দেখুন-বানর-কর কোডিংয়ের জন্য দোষী হয়েছি যেখানে আপনি কেবল কিছু করছেন কারণ আপনি এটি দেখতে পেলেন। ইন্টারফেসের সাথে আমরা একই জিনিস জন্য দোষী।

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

ইন্টারফেস ডিজাইনটি দেখার জন্য এখানে দুটি সহজ উপায়:

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

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

তাহলে কে ঠিক আছে?

প্লাগিনগুলি বিবেচনা করুন:

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

এখানে ইন্টারফেসের মালিক কে? ক্লায়েন্টদের? সেবা?

দুটোই বেরিয়ে আসে।

এখানকার রঙগুলি স্তর। লাল স্তর (ডানদিকে) সবুজ স্তর (বাম) সম্পর্কে কিছু জানার কথা নয়। লাল স্তরটি স্পর্শ না করেই সবুজ স্তর পরিবর্তন বা প্রতিস্থাপন করা যেতে পারে। এইভাবে যে কোনও সবুজ স্তরকে লাল স্তরটিতে প্লাগ করা যায়।

আমার কী জানতে হবে এবং কোনটি জানা উচিত নয় তা জানা উচিত knowing আমার কাছে, "কী সম্পর্কে জানে?", এটি একক গুরুত্বপূর্ণ স্থাপত্য সংক্রান্ত প্রশ্ন।

আসুন কিছু শব্দভাণ্ডার পরিষ্কার করা যাক:

[Client] --> [Interface] <|-- [Service]

----- Flow ----- of ----- control ---->

ক্লায়েন্ট এমন কিছু যা ব্যবহার করে।

একটি পরিষেবা এমন কিছু যা ব্যবহার করা হয়।

Interactor উভয় হতে পারে।

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

  • Presenter(একটি পরিষেবা) Output Port <I>ইন্টারফেসে নির্দেশ না দেওয়া উচিত । ইন্টারফেসটি Interactor(এখানে ক্লায়েন্ট হিসাবে অভিনয় করে) যা প্রয়োজন তা সংকীর্ণ করা উচিত । তার মানে ইন্টারফেসটি সম্পর্কে জেনে রাখা Interactorএবং আইএসপি অনুসরণ করতে অবশ্যই এটির সাথে পরিবর্তন করতে হবে। এবং এই ঠিক আছে।

  • Interactor(এখানে একটি পরিষেবা হিসাবে অভিনয় করে) Input Port <I>ইন্টারফেসের নির্দেশ না দেওয়া উচিত । ইন্টারফেসটি কী Controller(ক্লায়েন্ট) প্রয়োজন তা সংকুচিত করা উচিত । তার মানে ইন্টারফেসটি সম্পর্কে জেনে রাখা Controllerএবং আইএসপি অনুসরণ করতে অবশ্যই এটির সাথে পরিবর্তন করতে হবে। আর এই হল না ঠিক আছে।

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

কমপক্ষে, যদি তারা Interactorব্যবহারের ক্ষেত্রে এটির প্রয়োজন ছাড়া অন্য কিছু না করে তবে তারা ঠিক । তাহলে Interactorঅন্যান্য ব্যবহারের ক্ষেত্রে জন্য কিছু করে কোনো কারণ এই নেই Input Port <I>হয়ে গেছে তাদের সম্পর্কে জানতে। নিশ্চিত কেনInteractor কেবল একটি ব্যবহারের ক্ষেত্রে মনোনিবেশ করা যায় না এটি এটি একটি নন ইস্যু, তবে জিনিসগুলি ঘটে।

তবে input port <I>ইন্টারফেসটি কেবল নিজেকে দাস করতে পারে নাController ক্লায়েন্টের এবং এটি একটি সত্য প্লাগইন হতে পারে। এটি একটি 'লাইব্রেরি' সীমানা। একটি সম্পূর্ণ ভিন্ন প্রোগ্রামিং শপ লাল স্তর প্রকাশের কয়েক বছর পরে সবুজ স্তর লিখতে পারে।

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

এটিকে টানানোর একটি উপায় অ্যাডাপ্টার। এটিকে ক্লায়েন্ট Controlerএবং Input Port <I>ইন্টারফেসের মধ্যে রাখুন । অ্যাডাপ্টার Interactorএকটি হিসাবে গ্রহণ করে Input Port <I>এবং এটি এতে কাজ করে দেয়। যাইহোক, এটি কেবল গ্রাহকরা Controllerগ্রীন স্তরের মালিকানাধীন কোনও ইন্টারফেস বা ইন্টারফেসের মাধ্যমে যা পছন্দ করে তা কেবল প্রকাশ করে। অ্যাডাপ্টার নিজেই আইএসপি অনুসরণ করে না তবে আরও জটিল শ্রেণিকে Controllerআইএসপি উপভোগ করতে দেয় like যদি এটির মতো ক্লায়েন্টগুলির চেয়ে কম অ্যাডাপ্টার থাকে Controllerএবং আপনি যখন অস্বাভাবিক পরিস্থিতিতে থাকেন যেখানে আপনি একটি লাইব্রেরির সীমানা অতিক্রম করছেন এবং প্রকাশিত সত্ত্বেও, গ্রন্থাগারটি পরিবর্তন করা বন্ধ করবে না এটি কার্যকর। আপনার দিকে ফায়ারফক্স। এখন এই পরিবর্তনগুলি কেবল আপনার অ্যাডাপ্টারগুলিকেই ভেঙে দেয়।

তাহলে এর অর্থ কি? এর অর্থ সততার সাথে আপনি আমার কি করতে হবে তা বলার জন্য আপনি পর্যাপ্ত তথ্য সরবরাহ করেন নি। আমি জানি না আইএসপি অনুসরণ না করা আপনাকে সমস্যার সৃষ্টি করছে কিনা। আমি জানি না এটির অনুসরণটি যদি আপনার আরও সমস্যার কারণ হয় না।

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

আপনার যদি কোনও যুক্তিসঙ্গত কারণ থাকে যেমন প্লাগিনগুলি গ্রহণ করার জন্য আপনার ডিজাইন করার মতো কিছু, তবে আইএসপি কারণগুলি অনুসরণ না করা সমস্যাগুলি সম্পর্কে অবহিত হন (ক্লায়েন্টকে না ভেঙে ফেলা শক্ত) এবং সেগুলি প্রশমিত করার উপায়গুলি (রাখুন Interactorবা কমপক্ষে কোনও Input Port <I>স্থিতিশীলের দিকে ফোকাস করুন) ব্যবহারের ক্ষেত্রে).


ইনপুট জন্য ধন্যবাদ। আমার একটি পরিষেবা সরবরাহকারী মডিউল রয়েছে যার একাধিক ক্লায়েন্ট রয়েছে। এর নেমস্পেসটি যৌক্তিকভাবে সুসংহত সীমানা রয়েছে তবে ক্লায়েন্টকে এই লজিকাল সীমানা জুড়ে কাটা দরকার। এর মাধ্যমে যৌক্তিক সীমানার ভিত্তিতে নাম স্থান বিভক্ত করা আইএসপি-র সাহায্য করে না। প্রশ্নটির ডায়াগ্রামে যেমন দেখানো হয়েছে তেমন ক্লায়েন্টের প্রয়োজনের ভিত্তিতে আমি নেমস্পেসটি বিভক্ত করেছি। তবে এটি ক্লায়েন্টদের উপর নির্ভর করে এবং ক্লায়েন্টদের সংযুক্ত করার দুর্বল পদ্ধতির উপর নির্ভর করে, যেহেতু ক্লায়েন্টগুলি তুলনামূলকভাবে ঘন ঘন যুক্ত / সরানো যেতে পারে তবে সেবার পরিবর্তনগুলি সর্বনিম্ন হবে।
work.bin 11'17

আমি এখন তার সম্পূর্ণ নেমস্পেসের মতো ফ্যাট ইন্টারফেস সরবরাহকারীর দিকে ঝুঁকছি এবং ক্লায়েন্টের নির্দিষ্ট ক্লাসিক অ্যাডাপ্টারের মাধ্যমে এই পরিষেবাগুলি অ্যাক্সেস করা ক্লায়েন্টের অবধি। সি পদে এটি ক্লায়েন্টের মালিকানাধীন ফাংশন মোড়কের ফাইল হবে। পরিষেবার পরিবর্তনগুলি অ্যাডাপ্টারের পুনরায় সংশোধন করতে বাধ্য করবে তবে ক্লায়েন্টের অগত্যা নয়। .. <
কন্টেন্ট

<কন্টেন্ট> .. এটি অবশ্যই সময়কে ন্যূনতম রাখবে এবং রানটাইম (মধ্যস্থতাকারী মোড়ক ফাংশন কলিং) এর ব্যয়ে ক্লায়েন্ট এবং পরিষেবা 'আলগা' এর মধ্যে সংযোজন রাখবে, কোড স্পেস বাড়িয়ে দেবে, এটি স্ট্যাকের ব্যবহার এবং সম্ভবত আরও মাইন্ডস্পেসকে বাড়িয়ে তোলে (প্রোগ্রামার এর) অ্যাডাপ্টারগুলি বজায় রাখার ক্ষেত্রে।
work.bin 11'17

আমার বর্তমান সমাধানটি এখন আমার চাহিদা পূরণ করে, নতুন পদ্ধতির জন্য আরও বেশি প্রচেষ্টা নেওয়া হবে এবং ইয়াজিএনআই লঙ্ঘন হতে পারে। আমাকে প্রতিটি পদ্ধতির উপকারিতা এবং কনসগুলি বিবেচনা করতে হবে এবং এখানে কোন পথে যেতে হবে তা স্থির করতে হবে।
work.bin 11'17

1

সুতরাং এই বিষয়:

existent clients are unaffected by the addition (or deletion) of more clients.

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

দ্বিতীয়

 partitioning depends on the nature of clients

কেন আপনার কোড ডিআই ব্যবহার করছে না, নির্ভরতা বিপরীতমুখী, কিছুই নয়, আপনার গ্রন্থাগারে কোনও কিছুই আপনার ক্লায়েন্টের প্রকৃতির উপর নির্ভর করে হওয়া উচিত।

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

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

হ্যাঁ

একাধিক শিরোনাম ফাইলগুলিতে একটি ঘোষণার পুনরাবৃত্তি হয় না যেমন ডিআরওয়াই লঙ্ঘন করে না। মডিউল এম এর ক্লায়েন্টগুলির উপর কোনও নির্ভরতা নেই।

হ্যাঁ

একটি ক্লায়েন্ট এটি ব্যবহার করে না মডিউল এম এর অংশে পরিবর্তন দ্বারা প্রভাবিত হয়।

হ্যাঁ

বিদ্যমান ক্লায়েন্টরা আরও ক্লায়েন্টদের সংযোজন (বা মোছা) দ্বারা প্রভাবিত হয় না।

হ্যাঁ


1

ঘোষণায় প্রদত্ত একই তথ্য সর্বদা সংজ্ঞাতে পুনরাবৃত্তি হয়। এই ভাষাটি ঠিক কাজ করে। এছাড়াও, একাধিক শিরোনাম ফাইলগুলিতে একটি ঘোষণার পুনরাবৃত্তি ডিআরওয়াই লঙ্ঘন করে না । এটি একটি বরং ব্যবহৃত কৌশল (কমপক্ষে স্ট্যান্ডার্ড লাইব্রেরিতে)।

ডকুমেন্টেশন বা বাস্তবায়ন পুনরাবৃত্তি DRY লঙ্ঘন করবে

ক্লায়েন্ট কোড আমার দ্বারা লিখিত না হলে আমি এ নিয়ে নিজেকে বিরক্ত করব না।


0

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

নমুনা কাঠামো

M.h      // fat header
 - P1    // Partition 1
 - P2    // ... 2
   - P21 // ... 2 section 1
 - P3    // ... 3
C1.c     // Client 1 (Needs to include P1, P3)
C2.c     // ... 2 (Needs to include P2)
C3.c     // ... 3 (Needs to include P1, P21, P3)

MH

#ifdef P1
#define _PREF_ P1_             // Define Prefix ("PREF") = P1_
 void _PREF_init();            // Some partition specific function
#endif /* P1 */

#ifdef P2
#define _PREF_ P2_
 void _PREF_init();
#endif /* P2 */

#if defined(P21) || defined (P2) // Part 2.1
#define _PREF_ P2_1_
 void _PREF_oddone();
#endif /* P21 */

#ifdef P3
#define _PREF_ P3_
 void _PREF_init();
#endif /* P3 */

MC

ম্যাক ফাইলে, আপনাকে আসলে #ifdefs ব্যবহার করতে হবে না কারণ আপনি .c ফাইলটিতে যা কিছু রেখেছেন তা ক্লায়েন্ট ফাইলগুলিতে এতক্ষণ প্রভাব ফেলবে না যতক্ষণ ক্লায়েন্ট ফাইলগুলি যে ফাংশনগুলি সংজ্ঞায়িত করে তা সংজ্ঞায়িত করা হয়।

#include "M.h"
#define _PREF_ P1_        
void _PREF_init() { ... };

#define _PREF_ P2_
void _PREF_init() { ... }

#define _PREF_ P2_1_
void _PREF_oddone() { ... }

#define _PREF_ P3_
void _PREF_init() { ... }

C1.c

#define P1     // "invite" P1
#define P3     // "invite" P3
#include "M.h" // Open the door, but only the invited come in.

void main()
{
    P1_init();
    //P2_init();
    //P2_1_oddone();
    P3_init();
}

C2.c

#define P2
#include "M.h

void main()
{
    //P1_init();
    P2_init();
    P2_1_oddone();
    //P3_init();
}

C3.c

#define P1
#define P21
#define P3  
#include "M.h" 

void main()
{
    P1_init();
    //P2_init();
    P2_1_oddone();
    P3_init();
}

আবার, আমি নিশ্চিত নই যে আপনি যা জিজ্ঞাসা করছেন এটি এটি কিনা। তাই লবণের এক দানা দিয়ে এটি নিন।


ম্যাক দেখতে কেমন? আপনি সংজ্ঞায়িত P1_init() এবং P2_init() ?
work.bin

@ work.bin আমি অনুমান করি যে ফাংশনগুলির মধ্যে নাম স্থান নির্ধারণের ব্যতীত ম্যাক একটি সহজ .c ফাইলের মতো দেখাবে।
সাঁচকে দেলোয়ার

সি 1 এবং সি 2 উভয়ই অনুমান করে- কী P1_init()এবং এর সাথে P2_init()লিঙ্ক রয়েছে?
work.bin

এমএইচ / ম্যাক ফাইলে, প্রিপ্রসেসর _PREF_এটি শেষ হিসাবে সংজ্ঞায়িত করা হয়েছিল তার সাথে প্রতিস্থাপন করবে । তাই _PREF_init()হতে হবে P1_init()গত # define বিবৃতির কারণ। তারপরে পরবর্তী সংজ্ঞায়িত বিবৃতিটি PREF কে P2_ এর সমতুল্য সেট করবে , এভাবে উত্পন্ন হবে P2_init()
সাঁচকে দেলোয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.