একটি বাস্তবায়ন নির্মাণের বহুগুণ। ডিআই হতাশ? পরিষেবা লোকেটার ব্যবহার করবেন?


14

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

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

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

বিকল্পগুলি:

1) ক্লায়েন্টরা যে পরিষেবাটি ব্যবহার করে তা কার্যকর করে যাতে এটি ক্লায়েন্টদের এখন যা প্রয়োজন। ব্যাং আমরা সম্পন্ন করেছি। নমনীয় নয়। জটিল নয়।

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

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

4) এমন কিছু যা আমি এখনও ভাবিনি।

উদ্দেশ্য:

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

ক্লায়েন্টদের তাদের নির্ভরতাগুলির বাস্তবায়ন জানতে বা নিয়ন্ত্রণ করা উচিত নয় তবে তারা সেগুলি তৈরির সাথে জোর দেয় new। আমরা তাদের নিয়ন্ত্রণ করতে পারি না newতবে তারা যে শ্রেণী তৈরি করছে তা আমরা নিয়ন্ত্রণ করি।

আমার প্রশ্ন:

আমি কী বিবেচনা করতে ব্যর্থ হয়েছে?


ডক ব্রাউন থেকে প্রশ্ন

আপনার কি বাস্তবায়নের জন্য বিভিন্ন বাস্তবায়নের মধ্যে কনফিগার করার সম্ভাবনা দরকার? কোন উদ্দেশ্যে?

দ্রুততা। অজানা অনেক। পরিচালন পরিবর্তনের সম্ভাবনা চায়। কেবলমাত্র বাইরের বিশ্বের উপর নির্ভরতা হারাবেন। পরীক্ষাও হচ্ছে।

আপনার কি বিভিন্ন সময় প্রয়োগের মধ্যে স্যুইচ করার জন্য রান টাইম মেকানিক্স বা কেবল একটি সংকলন টাইম মেকানিকসের প্রয়োজন? কেন?

সংকলন টাইম মেকানিক্স সম্ভবত যথেষ্ট যথেষ্ট। টেস্টিং বাদে।

বাস্তবায়নের মধ্যে আপনার কোন গ্রানুলারিটি পরিবর্তন করতে হবে? একেবারে? প্রতি মডিউল (প্রতিটি ক্লাসের একটি গ্রুপ সহ)? প্রতি ক্লাস?

1001 এর মধ্যে কেবল একটিই যেকোন সময় সিস্টেমের মাধ্যমে চালিত হয়। সমস্ত ক্লায়েন্ট একবারে যা ব্যবহার করে তা পরিবর্তন করা সম্ভবত ভাল। নির্ভরতাগুলির ব্যক্তিগত নিয়ন্ত্রণ সম্ভবত যদিও গুরুত্বপূর্ণ।

কার সুইচ নিয়ন্ত্রণ করতে হবে? কেবল আপনার / আপনার বিকাশকারী দল? প্রশাসক? প্রতিটি ক্লায়েন্ট তার নিজের? বা ক্লায়েন্টের কোডের জন্য রক্ষণাবেক্ষণ ডেভেলপাররা? তাহলে যান্ত্রিকগুলি কতটা সহজ / শক্তিশালী / বোকা হতে হবে?

দেব পরীক্ষার জন্য। বাহ্যিক হার্ডওয়্যার নির্ভরতা হিসাবে প্রশাসক পরিবর্তন। এটি পরীক্ষা এবং কনফিগার করা সহজ হওয়া দরকার।


আমাদের লক্ষ্যটি দেখানো হয় যে সিস্টেমটি দ্রুত এবং আধুনিকীকরণ করা যায়।


বাস্তবায়নের সুইচের বাস্তব ব্যবহারের ক্ষেত্রে?

একটি, হার্ডওয়্যার সমাধান প্রস্তুত না হওয়া পর্যন্ত কিছু ডেটা সফ্টওয়্যার দ্বারা সরবরাহ করা হবে।


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

কাস্টম বর্গ লোডার ব্যবহার বিবেচনা করুন।
বেসিলিভস

কৌতূহলের বাইরে, এই সিস্টেমটি কী করে?
প্রাইম

উত্তর:


7

ঠিক আছে, আমি নিশ্চিত নই যে আমি আপনার সমর্থিত সমাধানগুলির প্রযুক্তিগত বিবরণগুলি এবং তাদের সঠিক পার্থক্যগুলি সম্পূর্ণরূপে বুঝতে পেরেছি, তবে আপনাকে প্রথমে কোন ধরণের নমনীয়তাটি প্রয়োজন তা আপনাকে প্রথমে খুঁজে বের করতে হবে IM

নিজেকে যে প্রশ্নগুলি জিজ্ঞাসা করতে হবে সেগুলি হ'ল:

  • আপনার কি বাস্তবায়নের জন্য বিভিন্ন বাস্তবায়নের মধ্যে কনফিগার করার সম্ভাবনা দরকার? কোন উদ্দেশ্যে?

  • আপনার কি বিভিন্ন সময় প্রয়োগের মধ্যে স্যুইচ করার জন্য রান টাইম মেকানিক্স বা কেবল একটি সংকলন টাইম মেকানিকসের প্রয়োজন? কেন?

  • বাস্তবায়নের মধ্যে আপনার কোন গ্রানুলারিটি পরিবর্তন করতে হবে? একেবারে? প্রতি মডিউল (প্রতিটি ক্লাসের একটি গ্রুপ সহ)? প্রতি ক্লাস?

  • কার সুইচ নিয়ন্ত্রণ করতে হবে? কেবল আপনার / আপনার বিকাশকারী দল? প্রশাসক? প্রতিটি ক্লায়েন্ট তার নিজের? বা ক্লায়েন্টের কোডের জন্য রক্ষণাবেক্ষণ ডেভেলপাররা? তাহলে যান্ত্রিকগুলি কতটা সহজ / শক্তিশালী / বোকা হতে হবে?

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

আপনার উত্তরের জবাব হিসাবে: আপনার হাতে যদি কমপক্ষে একটি আসল ব্যবহারের মামলা থাকে তবে এটি আপনার নকশার সিদ্ধান্তগুলি বৈধ করার জন্য ব্যবহার করুন। কোন ধরণের সমাধান আপনার পক্ষে সবচেয়ে ভাল কাজ করে তা খুঁজে পেতে ব্যবহারের ক্ষেত্রে এটি ব্যবহার করুন। "ফ্যাক্টরি" বা "পরিষেবা লোকেটার" আপনাকে যা প্রয়োজন তা আপনাকে সরবরাহ করে, বা অন্য কোনও কিছুর প্রয়োজন হলে কেবল চেষ্টা করে দেখুন। আপনি যদি মনে করেন যে উভয় সমাধান আপনার ক্ষেত্রে সমানভাবে ভাল, তবে একটি পাশা নিক্ষেপ করুন।


ভাল প্রশ্ন! আপডেট দেখুন।
candied_orange

বাস্তব ব্যবহারের ক্ষেত্রে আপডেট হয়েছে।
candied_orange

@ ক্যান্ডিওড ওরেঞ্জ: আমি আপনাকে কিছু মাছ দিতে পারি না, আমি কেবল আপনাকে নিজেই মাছ ধরাতে সহায়তা করার চেষ্টা করতে পারি :-)
ডক ব্রাউন

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

1
@ ক্যান্ডিওড অরেঞ্জ ডিআই করার ইচ্ছা পোষণ করবেন না কারণ এটি অন্য কোনও কিছুর চেয়ে "ভাল" বা "ভাল"। ডিআই হ'ল সমস্যার একটি নির্দিষ্ট সমাধান (বা কখনও কখনও বেশ কয়েকটি)। তবে, এটি সর্বদা সর্বাধিক "ফিট" সমাধান নয়। এটির প্রেমে পড়ে যাবেন না ... এটির মতো আচরণ করুন। এটি একটি সরঞ্জাম
এসভিডজেন

2

আমি এই অধিকারটি পাচ্ছি তা নিশ্চিত করার জন্য। আপনি কিছু ক্লাস তৈরি কিছু সেবা বলার আছে C1,...,Cnএবং ক্লায়েন্ট যে সরাসরি কল একটি গুচ্ছ new Ci(...)। সুতরাং আমি মনে করি যে আমি আপনার সমাধানের সাধারণ কাঠামোর সাথে একমত, যা হ'ল কিছু নতুন শ্রেণীর সাথে একটি নতুন অভ্যন্তরীণ পরিষেবা তৈরি করা যা D1,...,Dnসুন্দর এবং আধুনিক এবং তাদের নির্ভরতা ইনজেকশন করা (স্ট্যাকের মাধ্যমে এই জাতীয় নির্ভরতার অনুমতি দেওয়া) এবং তারপরে Ciইনস্ট্যান্টিয়েট এবং কিছুই না করে পুনরায় লেখার জন্য থেকে delgate Di। প্রশ্ন কিভাবে এটা করবেন এবং আপনাকে একটি দম্পতি উপায়ে প্রস্তাব 2এবং 3

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

public class OldClassI {
    private final NewClassI newImplementation;

    public OldClassI(Object parameter) {
        this.newImplementation = CompositionRoot.getInstance().getNewClassI(parameter);
    }
}

মূলত এটি আপনার সমাধান 2, তবে এটি নির্ভরতা ইঞ্জেকশনের বাকি অংশগুলির সাথে আপনার সমস্ত কারখানাগুলি এক জায়গায় সংগ্রহ করে।


আমি এটার সাথে একমত. অপশন 3 থেকে সার্ভিস লোকেটারের মতো এটি কীভাবে হবে না ঠিক তা নিশ্চিত না আপনি কি প্রতিটি কলটিতে একটি নতুন উদাহরণ তৈরির প্রত্যাশা করছেন getInstance()?
candied_orange

@ ক্যান্ডিওডআরেঞ্জ এটি সম্ভবত ব্যবহারের সংঘর্ষ, আমার জন্য একটি সার্ভিস লোকেটার খুব বিশেষভাবে এমন একটি জিনিস যা মূলত কেবলমাত্র হ্যাশম্যাপ থেকে বিভিন্ন ধরণের অবজেক্টে থাকে, যদিও এই রচনাটির মূলটি কেবলমাত্র একটি অবজেক্টের সাথে থাকে যা অন্যান্য অবজেক্ট তৈরি করে।
15

1

সহজ, কিছুই-অভিনব, একক বাস্তবায়ন দিয়ে শুরু করুন।

আপনার যদি পরে অতিরিক্ত বাস্তবায়ন তৈরি করতে হয় তবে বাস্তবায়নের সিদ্ধান্তটি কখন ঘটে তা একটি প্রশ্ন।

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

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

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