.NET মডিউলগুলি মডিউল ফাইলের নাম নামস্থান থেকে পৃথক করে?


9

স্কিম প্রোগ্রামিং ল্যাঙ্গুয়েজ (আর R আরএস স্ট্যান্ডার্ড) বাস্তবায়নে আমি নিম্নরূপে একটি মডিউল আমদানি করতে পারি:

(import (abc def xyz))

সিস্টেমটি এমন কোনও ফাইলের $DIR/abc/def/xyz.slsসন্ধানের চেষ্টা করবে যেখানে $DIRএমন কিছু ডিরেক্টরি রয়েছে যেখানে আপনি নিজের স্কিম মডিউলগুলি রেখেছেন। xyz.slsমডিউলটির উত্স কোড এবং এটি প্রয়োজনে ফ্লাইয়ে সংকলিত হয়।

এই ক্ষেত্রে রুবি, পাইথন এবং পার্ল মডিউল সিস্টেমগুলি একই রকম।

অন্যদিকে সি # আরও কিছুটা জড়িত।

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

দ্বিতীয়ত, dll ফাইলের নাম এবং dll দ্বারা প্রদত্ত নেমস্পেসের মধ্যে একের সাথে নামকরণের চিঠিপত্র নেই। আমি এই নমনীয়তার প্রশংসা করতে পারি, তবে এটি হাত থেকেও বেরিয়ে আসতে পারে (এবং আছে)।

এই কংক্রিটটি তৈরি করার জন্য, এটি চমৎকার হবে যদি, যখন আমি এটি বলি using abc.def.xyz;, সি # একটি abc/def/xyz.dllডিরেক্টরি অনুসন্ধান করার চেষ্টা করবে , এমন কোনও ডিরেক্টরিতে যা সি # জেনে যেতে চায় (প্রতিটি প্রকল্পের ভিত্তিতে কনফিগারযোগ্য)।

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

.NET / C # বিশ্ব কেন অতিরিক্ত স্তরের ইন্ডিरेশন দিয়ে এইভাবে কাজ করে?


10
.NET এর সমাবেশ এবং শ্রেণি সমাধান প্রক্রিয়া 10 বছরেরও বেশি সময় ধরে ঠিক কাজ করেছে fine আমি মনে করি এটি কেন এমনভাবে ডিজাইন করা হয়েছে সে সম্পর্কে আপনার কাছে কোনও মৌলিক ভুল বোঝাবুঝির (বা পর্যাপ্ত গবেষণা নয়) অভাব রয়েছে - যেমন বাইন্ড টাইম এবং অন্যান্য অনেক দরকারী রেজোলিউশন পদ্ধতিতে সমাবেশ পুনর্নির্দেশকরণ ইত্যাদি সমর্থন
কেভ

আমি দৃ sure়ভাবে নিশ্চিত যে একটি ব্যবহারের বিবৃতি থেকে ডিএলএল রেজোলিউশন পাশাপাশি পাশের কার্যকারিতা ভঙ্গ করবে। এছাড়াও যদি 1 থেকে 1 থাকে তবে আপনাকে এমএসসিআরলিবের সমস্ত নেমস্পেসের জন্য 50 টি ঘরের প্রয়োজন, বা তাদের নামের জায়গাগুলির ধারণাটি ফেলে দিতে হবে
কনরাড ফ্রিক্স

ইন্ডিরিশনের একটি অতিরিক্ত স্তর? হুঁ মমম
সুন্দর_

@ গিলিস প্রশ্ন সম্পাদনা এবং উন্নতির জন্য ধন্যবাদ!
ধর্মটেক 20'12

আপনার কয়েকটি পয়েন্ট ভিজ্যুয়াল স্টুডিওতে অদ্ভুত, এবং একটি ভাষার সাথে তাদের তুলনা করা মোটামুটি ন্যায্য নয় ( উদাহরণস্বরূপ , প্রকল্পগুলিতে ডিএলএল উল্লেখ)। পূর্ণ .NET পরিবেশের জন্য আরও ভাল তুলনা হ'ল জাভা + এক্সলিপস।
রস প্যাটারসন

উত্তর:


22

নিম্নলিখিত টীকা ফ্রেমওয়ার্ক ডিজাইন নির্দেশিকা অনুচ্ছেদ 3.3। নাম স্থান এবং সমাবেশগুলি কেন পৃথক রয়েছে সে সম্পর্কে অন্তর্দৃষ্টি দেয় As

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


এখন পর্যন্ত সর্বাধিক অনুমোদনের উত্স বলে মনে হচ্ছে। ধন্যবাদ কনরাড!
ধর্মটেক

তিরস্কার-প্রামাণিক উত্তর পাওয়ার জন্য +1। তবে, প্রতিটি " কেন সি # কর <x> " প্রশ্নটি " জাভা <এক্স> নীচে: ... " এর লেন্সের মাধ্যমে দেখা দরকার , কারণ সি # র (স্পষ্টভাবে বা না) সূর্যের প্রতিক্রিয়া ছিল এবং উইন্ডোজ জাভা জন্য মাইক্রোসফ্ট এর পৃথক পৃথক এজেন্ডা।
রস প্যাটারসন

6

এটি নমনীয়তা যুক্ত করে এবং চাহিদা অনুসারে লাইব্রেরিগুলি (আপনি কী আপনার প্রশ্নের মডিউলগুলি কল করেন) লোড করতে দেয়।

একটি নেমস্পেস, একাধিক গ্রন্থাগার:

এর একটি সুবিধা হ'ল আমি সহজেই অন্য একটি লাইব্রেরি প্রতিস্থাপন করতে পারি। ধরা যাক আমার একটি নেমস্পেস MyCompany.MyApplication.DALএবং একটি লাইব্রেরি DAL.MicrosoftSQL.dllরয়েছে, যাতে সমস্ত এসকিউএল কোয়েরি এবং অন্যান্য স্টাফ থাকে যা ডাটাবেসের সাথে নির্দিষ্ট হতে পারে। যদি আমি অ্যাপ্লিকেশনটি ওরাকলের সাথে সামঞ্জস্যপূর্ণ হতে চাই তবে আমি DAL.Oracle.dllএকই নাম স্থান রেখে কেবল যুক্ত করব । এখন থেকে, আমি মাইক্রোসফ্ট এসকিউএল সার্ভারের সাথে সামঞ্জস্যের প্রয়োজন গ্রাহকদের জন্য এবং অন্য গ্রন্থাগারের সাথে যারা ওরাকল ব্যবহার করেন তাদের জন্য একটি লাইব্রেরির সাথে অ্যাপ্লিকেশনটি সরবরাহ করতে পারি।

এই স্তরে নাম স্থান পরিবর্তন করা হয় হয় নকল কোড, বা প্রয়োজন এবং usingপ্রতিটি ডাটাবেসের জন্য উত্স কোড ভিতরে সমস্ত গুলি পরিবর্তন করতে হবে ।

একটি গ্রন্থাগার, একাধিক নেমস্পেস:

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

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

  • ছোট লাইব্রেরি থাকার কারণে ফাইলের প্রতি একটি লাইব্রেরির কার্যকারিতা প্রভাবিত হবে: অ্যাপ্লিকেশনটি চালানোর সময় প্রতিটি লাইব্রেরি মেমরির চাহিদা অনুযায়ী লোড করা উচিত এবং ভার্চুয়াল মেশিন দ্বারা প্রক্রিয়া করা উচিত; লোড করতে কম ফাইল মানে কিছুটা ভাল পারফরম্যান্স।


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

2

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

সি # সহ নেমস্পেস সমর্থন করে এমন বেশিরভাগ ভাষায়, নেমস্পেস কোনও মডিউল নয়। একটি নামস্থান স্কোপিং নামগুলির একটি উপায়। মডিউলগুলি স্কোপিং আচরণের একটি উপায়।

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

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

স্কিমে, আপনার যদি কোনও বাহ্যিক লাইব্রেরি লোড করতে হয় তবে আপনাকে (#%require (lib "mylib.ss"))প্রথমে কিছু করতে হবে , বা বিদেশী ফাংশন ইন্টারফেসটি সরাসরি ব্যবহার করতে হবে, যেমনটি আমি মনে করি। আপনি যদি বাহ্যিক বাইনারিগুলি ব্যবহার করে থাকেন তবে বাহ্যিক বাইনারিগুলি সমাধান করার জন্য আপনার সমান পরিমাণ কাজ রয়েছে। সম্ভবত আপনি সাধারণত গ্রন্থাগারগুলি এত সাধারণভাবে ব্যবহার করেছেন যে আপনার কাছে এমন একটি স্কিম-ভিত্তিক শিম রয়েছে যা এটিকে বিমূর্ত করে তোলে, তবে আপনি যদি কখনও কোনও তৃতীয় পক্ষের লাইব্রেরির সাথে নিজের ইন্টিগ্রেশন লিখতে চান তবে আপনাকে অবশ্যই "লোড করার জন্য কিছু কাজ করতে হবে" " লাইব্রেরি.

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

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

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

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


1
নির্ভরতা পরিচালনার বিষয়ে আপনি নুগেটটি একবার দেখে নিতে পারেন । ফিল হ্যাক থেকে এটি সম্পর্কে একটি চমৎকার নিবন্ধ এখানে
কনরাড ফ্রিক্স

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

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