আইওসি কনটেইনারগুলি ওওপি নীতিগুলি ভঙ্গ করে


51

আইওসি কনটেইনারগুলির উদ্দেশ্য কী? এর সম্মিলিত কারণগুলি নিম্নলিখিতগুলিতে সহজ করা যেতে পারে:

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

এটি সম্পাদন করার ওপি / সলিড উপায় নেই এবং দুর্দান্ত চমত্কার কোড রয়েছে।

যদি আগের বিবৃতিটি সত্য হয়, তবে আইওসি পাত্রে এটি কীভাবে করবেন? যতদূর আমি জানি, তারা এমন কিছু অজানা কৌশল ব্যবহার করছেন না যা ম্যানুয়াল ডিআই দিয়ে করা যায় না তাই একমাত্র অন্বেষণ হ'ল আইওসি কনটেইনাররা স্ট্যাটিক অবজেক্টস প্রাইভেট অ্যাকসেসর ব্যবহার করে ওওপি / সোলিড নীতিমালা ভঙ্গ করে।

আইওসি কনটেইনাররা কি পর্দার আড়ালে নিম্নলিখিত নীতিগুলি ভঙ্গ করে? এটি আসল প্রশ্ন যেহেতু আমার একটি ভাল বোঝাপড়া আছে তবে অন্য কারও কাছে আরও ভাল বোঝার আছে বলে মনে হচ্ছে:

  1. ব্যাপ্তি নিয়ন্ত্রণ । আমি আমার কোড ডিজাইনে প্রায় প্রতিটি সিদ্ধান্ত নেওয়ার কারণ হ'ল ope ব্লক, স্থানীয়, মডিউল, স্ট্যাটিক / গ্লোবাল। ব্যাপ্তিটি খুব স্পষ্ট হওয়া উচিত, ব্লক-স্তরে এবং যতটা সম্ভব স্ট্যাটিকের মধ্যে কম। আপনার ঘোষণাপত্র, তাত্ক্ষণিক এবং জীবনচক্রের সমাপ্তি দেখতে হবে। আমি ভাষা এবং জিসির উপর নির্ভর করে যতক্ষণ আমি এর সাথে স্পষ্ট থাকব ততক্ষণ সুযোগটি পরিচালনা করতে পারি। আমার গবেষণায় আমি জানতে পেরেছি যে আইওসি কনটেইনাররা বেশিরভাগ বা সমস্ত নির্ভরতা স্থির হিসাবে স্থাপন করে এবং পর্দার আড়ালে কিছু এওপি প্রয়োগের মাধ্যমে সেগুলি নিয়ন্ত্রণ করে। সুতরাং কিছুই স্বচ্ছ নয়।
  2. এনক্যাপসুলেশন । এনক্যাপসুলেশন এর উদ্দেশ্য কী? আমাদের ব্যক্তিগত সদস্যদের কেন এমন রাখা উচিত? ব্যবহারিক কারণে এটি এত তাড়াতাড়ি হয় যে আমাদের এপিআই এর প্রয়োগকারীরা রাষ্ট্র পরিবর্তন করে (যা মালিক শ্রেণীর দ্বারা পরিচালিত হওয়া উচিত) প্রয়োগটি ভেঙে ফেলতে পারে না। তবে এছাড়াও, সুরক্ষার কারণে, এতটা ইনজেকশন ঘটতে পারে না যা আমাদের সদস্য দেশগুলিকে ছাড়িয়ে যায় এবং বৈধতা এবং শ্রেণি নিয়ন্ত্রণকে বাইপাস করে। তাই কোনও কিছু (মজাদার ফ্রেমওয়ার্ক বা আইওসি ফ্রেমওয়ার্কগুলি) যা ব্যক্তিগত সদস্যদের বাহ্যিক অ্যাক্সেসের অনুমতি দেওয়ার জন্য সংকলনের সময়টির আগে কোনওভাবে কোডকে ইনজেক্ট করে দেয় তা দুর্দান্ত।
  3. একক দায়িত্ব নীতি । পৃষ্ঠতলে, আইওসি কনটেইনারগুলি জিনিস পরিষ্কার করে বলে মনে হয়। তবে কল্পনা করুন আপনি কীভাবে সহায়ক কাঠামো ছাড়াই একই জিনিসটি সম্পাদন করবেন। আপনার এক ডজন বা তার উপর নির্ভরশীলতা কেটে যাওয়ার সাথে সাথে কনস্ট্রাক্টর থাকবেন That এর অর্থ এটি আইওসি কনটেইনারগুলির সাথে আবরণ নয়, এটি ভাল জিনিস! এটি আপনার কোডটিকে পুনরায় ফ্যাক্টর করার এবং এসআরপি অনুসরণ করার জন্য একটি চিহ্ন।
  4. খোলা / বন্ধ । এসআরপি যেমন ক্লাস-ওয়ান নয় (আমি এসআরপিটি একক-দায়বদ্ধতার লাইনে প্রয়োগ করি, তবে পদ্ধতিগুলি ছেড়ে দেওয়া যাক)। ক্লাসের কোড পরিবর্তন না করার জন্য ওপেন / ক্লোজড কেবল একটি উচ্চ স্তরের তত্ত্ব নয়। এটি আপনার প্রোগ্রামের কনফিগারেশন বোঝার এবং কী পরিবর্তন হয় এবং কীটি প্রসারিত হয় তার নিয়ন্ত্রণ রাখার অনুশীলন। আইওসি কনটেইনারগুলি আপনার ক্লাসগুলি পুরোপুরিভাবে কাজ করার পদ্ধতিটি আংশিকভাবে বদলে দিতে পারে কারণ:

    • ক। মূল কোডটি নির্ভরতাগুলি স্যুইচ করার সিদ্ধান্ত নিচ্ছে না, ফ্রেমওয়ার্ক কনফিগারেশনটি।

    • B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর. কলিং সদস্যদের দ্বারা নিয়ন্ত্রিত নয় এমন সময়ে স্কোপটি পরিবর্তন করা যেতে পারে, এটি স্থির কাঠামোর দ্বারা বাহ্যিকভাবে নির্ধারিত হয় determined

সুতরাং শ্রেণীর কনফিগারেশনটি সত্যিই বন্ধ নয় এটি তৃতীয় পক্ষের সরঞ্জামের কনফিগারেশনের ভিত্তিতে পরিবর্তিত হয়।

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

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

ইজি: সত্তা ফ্রেমওয়ার্ক এবং অন্যান্য ওআরএম দৃ strongly়ভাবে টাইপযুক্ত বস্তু তৈরি করে এবং এটি ডাটাবেস সত্তাগুলিতে ম্যাপ করে, পাশাপাশি সিআরইউডি সম্পাদনের জন্য বয়লার-প্লেট বেসিক কার্যকারিতা সরবরাহ করে। যে কেউ তাদের নিজস্ব ওআরএম তৈরি করতে এবং ম্যানুয়ালি OOP / SOLID নীতি অনুসরণ করতে পারে। তবে এই ফ্রেমওয়ার্কগুলি আমাদের সহায়তা করে যাতে আমাদের প্রতিবার চাকাটি পুনরায় আবিষ্কার করতে হবে না। যদিও আইওসি কনটেইনারগুলি মনে হয়, আমাদের OOP / SOLID নীতিগুলির চারপাশে উদ্দেশ্যমূলকভাবে কাজ করতে এবং এটি কভার করতে সহায়তা করুন।


13
আমার সাথে সমস্যা হ'ল +1 এর মধ্যে সম্পর্ক IOCএবং Explicitness of codeহ'ল। ম্যানুয়াল ডিআই সহজেই নক্ষত্র হয়ে উঠতে পারে, তবে এটি কমপক্ষে স্ব-সংযুক্ত স্পষ্ট প্রোগ্রামের প্রবাহকে এক জায়গায় ফেলে দেয় - "আপনি যা দেখতে পান তা পেয়ে যান, আপনি কী পান"। যদিও আইওসি পাত্রে বাঁধাই এবং ঘোষণাগুলি সহজেই নিজের উপর একটি গোপন সমান্তরাল প্রোগ্রামে পরিণত হতে পারে।
ইউজিন পডস্কাল

6
এটি কিভাবে একটি প্রশ্ন?
স্টিফেন

8
এটি একটি প্রশ্নের চেয়ে ব্লগ পোস্টের মতো মনে হয়।
বার্ট ভ্যান ইনজেন শেহেনো

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

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

উত্তর:


35

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

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

সুতরাং, পয়েন্ট দ্বারা যেতে:

  1. তাত্ক্ষণিকভাবে আমরা পৌঁছে যা আমি কেবল ধরে নিতে পারি উপরের উদাহরণ। আপনি বলছেন যে আইওসি পাত্রে স্থির হিসাবে সর্বাধিক নির্ভরতা সেট আপ হয়। ওয়েল, সম্ভবত তারা কীভাবে কাজ করে তার কিছু বাস্তবায়নের বিশদ স্ট্যাটিক স্টোরেজ অন্তর্ভুক্ত করে (যদিও তাদের দেওয়া আছে যে তারা নিিনজেক্টের মতো কোনও বস্তুর উদাহরণ IKernelহিসাবে তাদের মূল স্টোরেজ হিসাবে রয়েছে, আমি সে সম্পর্কেও সন্দেহ করি)। তবে এটি আপনার উদ্বেগ নয়!

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

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

    এখন আইওসি পাত্রে কী হবে? ঠিক আছে, আপনি ঠিক একই কাজ! আবার, Ninject পরিভাষা দ্বারা যাচ্ছে, তুমি কোথায় বাঁধাই সেট আপ করা হয়েছে তাকান, এবং এটি কিনা এটা বলে কিছু InTransientScope, InSingletonScopeবা যাই হোক না কেন। যদি এটি কোনও কিছু সম্ভাব্যভাবে পরিষ্কার হয় তবে কারণ আপনার কোনও কোডের সাথে তার ব্যাপ্তিটি ঘোষণা করার ঠিক আছে, কারণ কোনও বস্তুর কী ঘটেছিল তা ট্র্যাক করার জন্য কোনও পদ্ধতির সন্ধানের চেয়ে (কোনও বস্তু একটি ব্লকে বিভক্ত হতে পারে, তবে এটি এতে একাধিকবার ব্যবহৃত হয়েছে) ব্লক করুন বা কেবল একবার, উদাহরণস্বরূপ)। সুতরাং আপনি স্কোপ লেখার জন্য কোনও কাঁচা ভাষার বৈশিষ্ট্য না দিয়ে আইওসি পাত্রে কোনও বৈশিষ্ট্য ব্যবহার করার ধারণার দ্বারা আপনি প্রত্যাখ্যান করেছেন, তবে যতক্ষণ আপনি আপনার আইওসি লাইব্রেরিতে বিশ্বাস করেন - যা আপনার করা উচিত! - এটির কোনও প্রকৃত অসুবিধা নেই there's ।

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

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

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

    এখন, যদি নির্দোষভাবে করা খুব সহজ ভুল ছিল এবং আইওসি পাত্রে এটি উত্সাহিত করে, তবে ঠিক আছে, সম্ভবত আপনার কোনও বক্তব্য থাকতে হবে। এটা আমার শ্রেণীর প্রতিটি সদস্যকে পাবলিক করার মতো হবে এবং অন্য লোকদের যখন তাদের জিনিসগুলি পরিবর্তন করা উচিত নয় তখন তাদের দোষ দেওয়া উচিত, তাই না? তবে যে কেউ এসআরপি লঙ্ঘন coverাকতে সেটার ইঞ্জেকশন ব্যবহার করেন তা হয় ইচ্ছাকৃতভাবে মৌলিক নকশার নীতিগুলি অবহেলা বা সম্পূর্ণ অজ্ঞ nt আইওসি পাত্রে এটির জন্য দোষ দেওয়া অযৌক্তিক।

    এটি বিশেষত সত্য কারণ এটি দরিদ্র মানুষের ডিআই দিয়ে আপনি খুব সহজেই করতে পারেন এমন কিছু:

    var myObject 
       = new MyTerriblyLargeObject { DependencyA = new Thing(), DependencyB = new Widget(), Dependency C = new Repository(), ... };
    

    সুতরাং সত্যিই, এই উদ্বেগটি কোনও আইওসি পাত্রে ব্যবহৃত হয়েছে কিনা তা সম্পূর্ণরূপে অর্থেগোনাল মনে হয়।

  4. আপনার ক্লাসগুলি কীভাবে একসাথে কাজ করে তা পরিবর্তন করা ওসিপি লঙ্ঘন নয়। যদি এটি হয় তবে সমস্ত নির্ভরতা বিপরীতকরণ ওসিপি লঙ্ঘনকে উত্সাহিত করবে। এটি যদি হয় তবে তারা উভয়ই একই সলিড সংক্ষেপে না!

    তদুপরি, পয়েন্ট ক) বা খ) ওসিপি-র সাথে কোনও সম্পর্ক স্থাপনের কাছাকাছি আসে না come আমি ওসিসি সম্মানের সাথে এই উত্তর দিতে জানি না।

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

এবং একটি চূড়ান্ত বিষয় যা আপনি বলেছেন:

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

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

অভিযোজ্য বস্তু

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

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

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

সুতরাং আপনি বসুন, এবং এটি সম্পর্কে চিন্তা করুন, এবং সিদ্ধান্ত নিন যে এমন কোনও শ্রেণি থাকা উচিত যা নির্ভরতা সমাধান করতে পারে। এটি কী কী সার্বজনীন পদ্ধতির প্রয়োজন তা স্কেচ করুন:

void Bind(Type interfaceType, Type concreteType, bool singleton);
T Resolve<T>();

Bind"যেখানে আপনি টাইপের কোনও নির্মাণকারী যুক্তি দেখেন, সেখানে interfaceTypeএকটি উদাহরণ দিয়ে যান concreteType"। অতিরিক্ত singletonপ্যারামিটারটি বলে যে concreteTypeপ্রতিটি সময় একই উদাহরণ ব্যবহার করা উচিত , বা সর্বদা একটি নতুন তৈরি করা উচিত।

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

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


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

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

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

2
4 সম্পর্কিত, ডিপেন্ডেন্সি ইঞ্জেকশনটি সলিড সংক্ষিপ্ত আকারে নেই । 'ডি' = 'ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপাল', এটি একটি সম্পূর্ণ সম্পর্কিত নয় concept
অ্যাস্ট্রেলત્সভ

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

27

আইওসি পাত্রে কি এই নীতিগুলি অনেকটা ভেঙে যায়?

ধারণায়? নং আইওসি পাত্রে কেবল একটি সরঞ্জাম। আপনার এমন একটি জিনিস থাকতে পারে যাগুলির একটি একক দায়িত্ব রয়েছে, ভালভাবে পৃথক ইন্টারফেস রয়েছে, একবার লেখার পরে তাদের আচরণ পরিবর্তন করা যাবে না etc.

প্রস্তুতিতে? একেবারে।

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

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

" Actionকনস্ট্রাক্টরের কাছে যাওয়ার চেয়ে কীভাবে এটি আলাদা ?" আপনি জিজ্ঞাসা। এটি আলাদা কারণ কারণ আপনি যখন সফ্টওয়্যারটি নিযুক্ত হয়ে যান (বা রানটাইমের সময়!) আপনি কনস্ট্রাক্টরের কাছে যা যা পরিবর্তন করা যায় তা পরিবর্তন করতে পারবেন না। এটি ভিন্ন কারণ আপনার ইউনিট পরীক্ষাগুলি (বা আপনার গ্রাহকের ইউনিট পরীক্ষাগুলি) এমন পরিস্থিতিতেগুলিকে আবরণ করেছে যেখানে প্রতিনিধি নির্মাত্রে পাস হয়।

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

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

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


3
ঠিক। এবং অনেকগুলি দোকান দাবি করবে যে তাদের পণ্য এত জটিল যে তারা প্রকৃতপক্ষে না হলে তারা সেই বিভাগে চলে যায়। যেমনটি অনেক পরিস্থিতিতে রয়েছে সত্য।
সুমের

12
তবে আইওসি আপনি যা বলেছেন তার ঠিক বিপরীত। এটি প্রোগ্রামের মুক্ত / নিবিড়তা নিয়োগ করে। আপনি যদি নিজের কোড পরিবর্তন না করেই পুরো প্রোগ্রামটির আচরণ পরিবর্তন করতে পারেন।
ইউফোরিক

6
@ ইউফোরিক - এক্সটেনশনের জন্য উন্মুক্ত, পরিবর্তনের জন্য বন্ধ। আপনি যদি পুরো প্রোগ্রামটির আচরণ পরিবর্তন করতে পারেন তবে এটি পরিবর্তন করার জন্য বন্ধ নয়, তাই না? আইওসি কনফিগারেশনটি এখনও আপনার সফ্টওয়্যার, এটি আপনার ক্লাস দ্বারা কাজ করার জন্য এখনও কোড ব্যবহার করা হয় - এটি জাভা বা সি # বা যাই হোক না কেন XML এ থাকা সত্ত্বেও।
টেলাস্টিন

4
@ টেলাস্টিন "সংশোধনের জন্য বন্ধ" এর অর্থ হ'ল পুরোটির আচরণ পরিবর্তন করার জন্য কোডটি পরিবর্তন (সংশোধন) করা প্রয়োজন হবে না। যে কোনও বাহ্যিক কনফিগারেশন সহ, আপনি কেবল এটি একটি নতুন dll এ নির্দেশ করতে পারেন এবং পুরো পরিবর্তনের আচরণ রাখতে পারেন।
ইওফোরিক

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

14

আইওসি পাত্রে ব্যবহার করা কি অগত্যা OOP / SOLID নীতি লঙ্ঘন করে? কোন

আপনি কি আইওসি পাত্রে এমনভাবে ব্যবহার করতে পারেন যাতে তারা ওওপি / সলিড নীতি লঙ্ঘন করে? হ্যাঁ

আইওসি পাত্রে আপনার আবেদনের নির্ভরতা পরিচালনার জন্য ফ্রেমওয়ার্ক মাত্র।

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

উদাহরণস্বরূপ, ASP.NET ওয়েব ফর্মস, আপনাকে সম্পত্তি ইনজেকশন ব্যবহার করা প্রয়োজন কারণ এটিকে ইনস্ট্যান্ট করা সম্ভব নয় Page। এটি বোধগম্য কারণ ওয়েবফোর্ডগুলি কখনই কঠোর ওওপি দৃষ্টান্তগুলি মাথায় রেখে তৈরি করা হয়নি।

অন্যদিকে ASP.NET MVC, খুব OOP / SOLID বন্ধুত্বপূর্ণ কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করে কোনও IoC ধারক ব্যবহার করা সম্পূর্ণ সম্ভব।

এই দৃশ্যে (কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করে), আমি বিশ্বাস করি এটি নিম্নলিখিত কারণে সলাইড নীতিগুলি প্রচার করে:

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

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

  • লিসকভ সাবস্টিটিউশন নীতি - সত্যই প্রাসঙ্গিক নয়

  • ইন্টারফেস বিভাজন নীতি - আপনি চাইলে একক কংক্রিটের জন্য একাধিক ইন্টারফেস বরাদ্দ করতে পারেন, কোনও আইওসি ধারক নুনের দানা সহজেই এটি করতে পারে।

  • নির্ভরতা বিপর্যয় - আইওসি পাত্রে আপনাকে সহজেই নির্ভরতা বিপরীতমুখী করতে দেয়।

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

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

আমি সম্মত হই যে আমি যখন আইওসি পাত্রে ব্যবহার করে কোডটি লিখি বা পড়ি তখন এটি কিছুটা অবাস্তব কোড থেকে মুক্তি পায়।

এটি ওওপি / সলিডের পুরো কারণ, সিস্টেমগুলি পরিচালনাযোগ্য করে তোলা। একটি আইওসি পাত্রে ব্যবহার করা সেই লক্ষ্যের সাথে অন্তর্নিহিত।

এই শ্রেণীর লেখক বলেছেন, "আমরা যদি কোনও আইওসি কনটেইনার না ব্যবহার করি তবে কনস্ট্রাক্টরের একটি ডজন পরামিতি থাকত! এটি ভয়াবহ!"

12 নির্ভরতা সহ একটি শ্রেণি সম্ভবত একটি এসআরপি লঙ্ঘন হ'ল আপনি এটি যে প্রসঙ্গে ব্যবহার করছেন তা নয়।


2
দুর্দান্ত উত্তর। অতিরিক্ত হিসাবে, আমি মনে করি সমস্ত বড় আইওসি পাত্রেও এওপি সমর্থন করে, যা ওসিপি দিয়ে অনেক সহায়তা করতে পারে। ক্রস কাটা উদ্বেগের জন্য, এওপি সাধারণত ডেকরেটারের চেয়ে বেশি ওসিপি বান্ধব রুট।
বেন অ্যারনসন

2
@ বেনআরনসন বিবেচনা করে যে এওপি কোডটিকে একটি শ্রেণিতে ইনজেক্ট করে, আমি এটিকে আরও ওসিপি-বান্ধব বলব না। আপনি জোর করে সংকলন / রানটাইমে ক্লাস খুলছেন এবং পরিবর্তন করছেন।
ডোভাল

1
@ ডোভাল আমি দেখতে পাচ্ছি না এটি কীভাবে কোনও ক্লাসে কোড ইনজেকশন করছে। দ্রষ্টব্য আমি ক্যাসল ডায়নামিকপ্রক্সী শৈলীর বিষয়ে কথা বলছি, যেখানে আইএল-বয়ন শৈলীর পরিবর্তে আপনার একটি ইন্টারসেপ্টর রয়েছে। তবে একটি ইন্টারসেপ্টর মূলত কেবল একটি সাজসজ্জা যা কিছু প্রতিবিম্ব ব্যবহার করে যাতে এটি কোনও নির্দিষ্ট ইন্টারফেসের সাথে নিজেকে জুড়ি না দেয়।
বেন অ্যারনসন

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

আমি সত্যিকারের ব্যাখ্যাটির যুক্তি পাই না যে সত্যের ভিত্তিতে কিছু খারাপ নয়, এটি একটি কাঠামো। সার্ভিস লোকেশনগুলি ফ্রেমওয়ার্ক হিসাবে তৈরি করা হয় এবং সেগুলি খারাপ হিসাবে বিবেচিত হয় :)।
ipavlu

5

আইওসি কনটেইনারগুলি উভয়ই ভাঙ্গা দেয় না এবং প্রচুর ওওপি / সলিড নীতিগুলি কোডারগুলিকে ভাঙ্গতে দেয় না?

staticসি # এর কীওয়ার্ডটি বিকাশকারীদের প্রচুর OOP / SOLID নীতি ভাঙ্গতে দেয় তবে এটি সঠিক পরিস্থিতিতে এখনও একটি বৈধ সরঞ্জাম valid

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

সুতরাং যদিও এই রেন্ট দুর্বল লিখিত কোড সম্পর্কে কিছু বৈধ পয়েন্ট উত্থাপন করে, এটি ঠিক কোনও প্রশ্ন নয় এবং এটি সঠিকভাবে কার্যকর নয়।


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

2
@ সুমের - আমি মনে করি আপনি হয়ত আইওসি-র সংজ্ঞা ব্যবহার করছেন। আমি যেটি ব্যবহার করি তা সংকলিত কোডটি পরিবর্তন করে না। প্রচুর অন্যান্য নন-আইওসি সরঞ্জাম রয়েছে যা সংকলিত কোডটিও পরিবর্তন করে। হতে পারে আপনার শিরোনামটি আরও বেশি হওয়া উচিত: "সংকলিত কোড বিরতিতে কী পরিবর্তন হয় ..."।
সেরাড

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

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

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

3

আমি আপনার প্রশ্নে একাধিক ভুল এবং ভুল বোঝাবুঝি দেখতে পাচ্ছি। প্রথম প্রধানটি হ'ল আপনি সম্পত্তি / ক্ষেত্রের ইনজেকশন, কনস্ট্রাক্টর ইঞ্জেকশন এবং পরিষেবা লোকেটারের মধ্যে পার্থক্য মিস করছেন। জিনিসগুলি করার সঠিক উপায় যা সম্পর্কে প্রচুর আলোচনা হয়েছে (উদাঃ ফ্লেমওয়ারস)। আপনার প্রশ্নে, আপনি কেবল সম্পত্তি ইনজেকশন ধরেছেন এবং কনস্ট্রাক্টর ইঞ্জেকশনটিকে উপেক্ষা করছেন বলে মনে হয়।

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

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

সুতরাং, আপনার প্রশ্নের উত্তর না হয়। আইওসি পাত্রে ওওপি নকশার নীতিগুলি ভঙ্গ করা হয় না। একেবারে বিপরীতে, তারা সলিড নীতিগুলি (বিশেষত নির্ভরতা-বিপরীত নীতি) অনুসরণ করে সমস্যাগুলি সমাধান করে।


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

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

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

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