আপনার। নেট গ্রন্থাগারটি COM সীমাবদ্ধতার কথা মাথায় রেখে লেখার চেয়ে ভাল, বা আপনার নেট নেট লাইব্রেরি ইন্টারপ থেকে আলাদা করুন?


9

আমি এই আকর্ষণীয় নিবন্ধটি জুড়ে এসেছি: কোডপ্রোজেজে সিওএম ইন্টারঅ্যাপেরিবিলিটি আমি কীভাবে ভালবাসি , যা আমাকে ভাবতে পেরেছিল ...

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

এবং যখন আমি মনে করি এটি খুব উপন্যাস, এটি কি কেবল প্রকল্পটি সংগ্রহ করে না?

  • এখন আপনার নিজের নেট লাইব্রেরি এবং একটি ইন্টারপ লাইব্রেরি পরীক্ষা করার দরকার।
  • আপনার সুন্দর। নেট লাইব্রেরিটির চারপাশে কীভাবে কাজ করা যায় তা নির্ধারণ করার জন্য আপনাকে এখন সময় কাটাতে হবে এবং এটি COM এ প্রকাশ করবে।
  • আপনার ক্লাস গণনে দ্বিগুণ বা ট্রিপল কার্যকর করতে হবে।

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

অথবা, এটি আপনাকে একটি র‌্যাপার সরবরাহ করে আপনার গ্রন্থাগারের সংস্করণটিকে আরও সহজ করে তোলে? এটি কী আপনার ইউনিট টেস্টগুলি সিওএম ব্যবহার না করে দ্রুত চালাচ্ছে?


2
আপনার অর্থ, আসল কোডটিকে আরও ভাল / ক্লিনার করতে দরকারী সরঞ্জামগুলি ব্যবহার করার পাশাপাশি? এবং সেই (সম্ভবতঃ উত্তরাধিকার) সিওএম স্টাফের জন্য একটি পরিষ্কার মাইগ্রেশন পাথ সরবরাহ করছেন?
টেলাস্টিন

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

3
@ মেসনভিয়েল: এটি 6 মাসের চেয়ে পুরানো সমস্ত সফ্টওয়্যার "উত্তরাধিকার" হিসাবে একইভাবে হ্রাস পেয়েছে, আমি কি ঠিক আছি?
-15

2
@ ম্যাসনওহিলার সিওএমকে লোকেরা (মাইক্রোসফ্টের মধ্যে কিছু গোষ্ঠী সহ) যত তাড়াতাড়ি ইচ্ছা করবে তা নির্বিঘ্ন করা যায় না কারণ প্রক্রিয়া বহির্ভূত বিষয়গুলি নিয়ন্ত্রণ করা এটি এখনও সেরা পছন্দ।
মাইক

2
@ মাইক, আমি আসলে সি # নেট থেকে একটি ভিবি 6 প্রকল্পের পোর্টিংয়ের দিকে তাকিয়ে আছি। আমরা ব্যবহারকারীর মুখোমুখি এপিআইগুলি খুব সহজ, তবে, পর্দার পিছনের কোডটি যেমন হয় তেমন রক্ষণাবেক্ষণযোগ্য নয়। আমি সি # .NET- এ লাইব্রেরির বেশিরভাগটি বাস্তবায়নের এবং বিভিন্ন ক্লাসের সাথে ইন্টারঅ্যাক্ট করার সহজ এপিআই সরবরাহকারী একটি ইন্টারপ ফেকাদ সরবরাহ করার প্রত্যাশা করছি।
robodude666

উত্তর:


7

তবে, আপনি যদি কেবল সিওএম ব্যবহারের উদ্দেশ্যে থাকেন তবে এই ধরণের ডিজাইনের কোনও সুবিধা রয়েছে যা আমি দেখছি না?

আপনার প্রশ্নের এই স্নিপেট হয় এখানে আপনার নকশা সিদ্ধান্তের সবচেয়ে গুরুত্বপূর্ণ অংশ, এবং উত্তর (সবসময়) হল এটা নির্ভর করে

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

যাইহোক , আমি। নেট লাইব্রেরিটি COM- র ব্যবহারকে সীমাবদ্ধ করার কোনও ভাল কারণ সম্পর্কে ভাবতে পারি না। আপনি অন্যান্য। নেট কোডে অ্যাসেম্বলিটি ব্যবহার করতে সক্ষম হবেন না কেন ? নিজেকে এইভাবে সীমাবদ্ধ রাখার জন্য এটি সামান্য অর্থবোধ করে।

এটির সাথে আমার কিছু অভিজ্ঞতা আছে, তাই আমি কীভাবে এটি পরিচালনা করেছি তা ভাগ করে নেব। এটি অবশ্যই আদর্শ নয়। আমি কিছু বাণিজ্য বন্ধ করেছি। আমি কেবল COM ক্লাসগুলির জন্য (সত্যই ইন্টারফেস) একটি মুখোমুখি ব্যবহার করি যা নতুন। নেট আইডিয়ামগুলির সাথে সামঞ্জস্য নয়, অন্যথায়, আমি সরাসরি। নেট ইন্টারফেসটি সিওএম এ প্রকাশ করি। এর মূলত অর্থ হল যে আমি জেনেরিক ব্যবহার করে এমন কোনও ইন্টারফেসের জন্য একটি মুখোমুখি ব্যবহার করি। জেনেরিক্স হ'ল একমাত্র জিনিস যা আমি কেবলমাত্র বেমানান across দুর্ভাগ্যক্রমে, এর অর্থ এমন কোনও কিছুর জন্য একটি মুখোমুখি IEnumerable<T>, যা মোটামুটি সাধারণ।

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

namespace Company.Product.Feature
{
    public class MyClass : INetInterface 
    {
        // lots of code
    }
}

namespace Company.Product.Interop
{
    public class MyClass : Feature.MyClass, IComInterface
    {
        // over ride only the  incompatible properties/methods
    }
}

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

এর সম্পূর্ণ উত্সাহিত উদাহরণের জন্য, আপনি আমার রেপোর সোর্সকন্ট্রোল এবং ইন্টারপ ফোল্ডারগুলির মাধ্যমে ব্রাউজ করতে পারেন । ISourceControlProviderএবং GitProviderবিশেষ আগ্রহী হবে।


প্রতিক্রিয়ার জন্য ধন্যবাদ রবারডাক! আমি কিছুদিন আগে রাবারডাক প্রকল্প জুড়ে দৌড়েছি; এটা কোড মাধ্যমে খুব আকর্ষণীয় পড়া হয়েছে। আপনি কি IEnumerableভিবিএ পাস করতে পারবেন ? এছাড়াও, Rubberduck.Interop.GitProviderকেন আপনি প্যারামিটারাইজড কনস্ট্রাক্টরগুলি সংজ্ঞায়িত করেন যদি COM তাদের সমর্থন না করে?
robodude666

হ্যাঁ, আপনি IEnumerableCOM এর মাধ্যমে একটি পাস করতে পারেন , তবে এটি পুরানো, অ-জেনেরিক সংস্করণ হতে হবে। কনস্ট্রাক্টর হিসাবে, একবার দেখুন SourceControlClassFactory। মূলত, আপনি এটির এমন কোনও ক্লাসের উদাহরণ শুরু করে যা এর সিটারের জন্য প্যারামিটারের প্রয়োজন হয় না এবং এটি আপনার API এর ক্লাসগুলির নতুন দৃষ্টান্ত অ্যাক্সেস পেতে ব্যবহার করে fake
রাবারডাক

আমি অনুমান করছি যে আপনার ComVisible(true)ক্লাস / ইন্টারফেসে সংজ্ঞায়িত যে কোনও কিছু যা সিওএম সমর্থন করে না কেবল তা "উপেক্ষা" করা যায়? আমি আরও অনুমান করছি যে আপনার যদি একাধিক নেমস্পেসে সংজ্ঞায়িত একই নামের একটি শ্রেণি ProgIdথাকে তবে আপনি যদি তাদের মধ্যে একটিরও বেশি প্রকাশ করতে চান তবে আপনাকে একটি অনন্য সরবরাহ করতে হবে?
robodude666

হ্যাঁ. এটি সঠিক এবং staticপদ্ধতিগুলি উপেক্ষা করা হয়। আমি ভিবি 6 এর সমতুল্য কিনা তা দেখার চেষ্টা করছি VB_PredeclaredId। আমি ভাবছি কোনও ডিফল্ট উদাহরণ তৈরি করা সম্ভব হতে পারে।
রাবারডাক

7

এটি তাদের। নেট লাইব্রেরির সৌন্দর্য থেকে দূরে সরে যায়

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

আপনার ক্লাসগুলিকে কম-দৃশ্যমান হিসাবে চিহ্নিত করতে সক্ষম হওয়া এবং সিওএমের মাধ্যমে আপনার .NET কোডের সাথে কথা বলতে সক্ষম হওয়া অত্যন্ত কার্যকর। সৌন্দর্যের জন্য উত্পাদনশীলতায় সেই দুর্দান্ত সুবিধাটি ত্যাগ করা পাগল।

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

অন্যদিকে, যদি আপনার সিওএম ক্লায়েন্টদের নাটকীয়ভাবে আলাদা ইন্টারফেসের প্রত্যাশা থাকে, নির্ভরতা বা অন্যান্য সীমাবদ্ধতাগুলি রয়েছে যা আপনার .NET ক্লাসগুলিতে মোকাবেলা করা বাজে বা অন্যটি সীমাবদ্ধতা রয়েছে বা আপনি আপনার নেট নেট ক্লাসগুলিতে উল্লেখযোগ্যভাবে পরিবর্তন আনবেন এবং COM পশ্চাৎপদ বজায় রাখতে হবে - সামঞ্জস্যতা, তারপরে যেকোন উপায়ে সেই ফাঁকটি কাটাতে একটি ইন্টারপ ক্লাস তৈরি করুন।

তবে "সৌন্দর্য" সম্পর্কে চিন্তা করবেন না। .NET এর মাধ্যমে COM প্রকাশ করতে সক্ষম হওয়াই আপনার কাজ বাঁচানোর জন্য। নিজের জন্য আরও কাজ তৈরি করবেন না।


+1 টি। আমি যখন ব্ল্যাক বক্সের ব্ল্যাক বোতামগুলির সৌন্দর্য পছন্দ করি তবে তা আরও গুরুত্বপূর্ণ।
gbjbaanb

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

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

1
আপনার ফ্যাক্টরিটিকে "গ্লোবাল মাল্টিউলিউজ" শ্রেণি হিসাবে প্রকাশ করা কি সম্ভব? সুতরাং আপনি কেবলমাত্র Set oObject = MyCOMInterop.NewMyClass()কোনও নতুন কারখানার অবজেক্ট ইনস্ট্যান্ট না করেই করতে পারেন ?
robodude666

এটি হ'ল এক উত্তম প্রশ্ন @ robodude666। এখন আপনি এটি উল্লেখ করেছেন, আমি আশা করি
রাবারডাক

3

ভাল কথা বলতে গেলে, নিবন্ধটির মূল লেখক তার নিবন্ধের কোথাও "সৌন্দর্য" শব্দটি ব্যবহার করেন নি, আপনিই ছিলেন, যাঁরা এই নিবন্ধটি পড়তে সময় নেননি তাদের জন্য এই ক্ষেত্রে পক্ষপাতমূলক ধারণা তৈরি করতে পারেন নিজেদের.

যতদূর আমি এই নিবন্ধটি বুঝতে পেরেছি, .NET গ্রন্থাগারটি ইতিমধ্যে বিদ্যমান ছিল এবং সিওএমকে মাথায় না রেখেই লেখা হয়েছিল - সম্ভবত কারণ যখন গ্রন্থাগারটি তৈরি হয়েছিল তখন সিওএম সমর্থন করার প্রয়োজন ছিল না।

পরবর্তীতে, সমর্থনকারী সিওএমের অতিরিক্ত প্রয়োজনীয়তা চালু করা হয়েছিল। এ জাতীয় পরিস্থিতির মুখোমুখি হয়ে আপনার কাছে দুটি বিকল্প রয়েছে:

  • সিওএম ইন্টারওপের সাথে সামঞ্জস্যপূর্ণ করার জন্য মূল লিবটি আবার ডিজাইন করুন (জিনিস ভাঙার ঝুঁকির সাথে)

  • মূল কাজের লাইব্রেরিটি বেশিরভাগের মতোই চলুন এবং তার পরিবর্তে একটি "র‍্যাপার" (বা "অ্যাডাপ্টার") এর ফাংশন সহ একটি পৃথক সমাবেশ তৈরি করুন

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

আপনার উদ্বেগ

এখন আপনার নিজের নেট লাইব্রেরি এবং একটি ইন্টারপ লাইব্রেরি পরীক্ষা করার দরকার।

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

আপনার সুন্দর। নেট লাইব্রেরিটির চারপাশে কীভাবে কাজ করা যায় তা নির্ধারণ করার জন্য আপনাকে এখন সময় কাটাতে হবে এবং এটি COM এ প্রকাশ করবে।

যখন আপনাকে মূল গ্রন্থাগারটি আবার ডিজাইন করতে হবে তখন আপনাকে এটিও বের করতে হবে এবং আমার ধারণা এটি আরও কাজ করবে।

আপনার ক্লাস গণনে দ্বিগুণ বা ট্রিপল কার্যকর করতে হবে।

শুধুমাত্র সার্বজনীন সিওএম ইন্টারফেসের মাধ্যমে প্রকাশিত ক্লাসগুলির জন্য, যা মূল গ্রন্থাগারের খুব কম শ্রেণীর অংশ হওয়া উচিত।

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


(+1) তবে, "... যা অল্প সংখ্যক হওয়া উচিত ... মূল পাঠাগার" কেবল কখনও কখনও সত্য। "শ্রেণীর গ্রন্থাগার শৈলীতে" প্রচুর ধরণের প্রকল্পের নকশা করা হয়েছে, যেখানে এক শ্রেণির মধ্যে একটি প্রকাশ্য দৃশ্যমান উদ্দেশ্য সমান হয় এবং সেই ক্লাসগুলি আকর্ষণীয় কার্যকারিতা বাড়িয়ে তোলে। সেক্ষেত্রে .NET বর্গ গণনা এবং সিওএম ইন্টারপ ক্লাস গণনার মধ্যে ওয়ান-টু ওয়ান ম্যাপিং হতে পারে।
রোয়ানং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.