কেন "সিস্টেম ব্যবহার করছে"; খারাপ অনুশীলন হিসাবে বিবেচনা করা হয় না?


47

আমার একটি সি ++ ব্যাকগ্রাউন্ড রয়েছে এবং আমি এই প্রশ্নের উত্তরগুলি সম্পূর্ণরূপে বুঝতে এবং সম্মত হয়েছি: কেন "নেমস্পেসটি স্ট্যান্ড ব্যবহার করা হচ্ছে"; খারাপ অনুশীলন বিবেচনা?

সুতরাং আমি আশ্চর্য হয়েছি যে, এখন সি # এর সাথে কিছু অভিজ্ঞতা পেয়েছি, আমি সেখানে ঠিক এর বিপরীতে দেখতে পাচ্ছি: using Some.Namespace;আক্ষরিক অর্থেই সর্বত্র ব্যবহৃত হয়। আপনি যখনই কোনও প্রকারটি ব্যবহার শুরু করেন, আপনি প্রথমে এর নেমস্পেসের জন্য একটি ব্যবহার নির্দেশিকা যুক্ত করুন (যদি এটি ইতিমধ্যে না থাকে)। .csযে ফাইলটি শুরু হয়নি তা আমি মনে করতে পারি না using System; using System.Collections.Generic; using X.Y.Z; etc...। আসলে, আপনি যদি ভিজ্যুয়াল স্টুডিও উইজার্ডের মাধ্যমে কোনও নতুন ফাইল যুক্ত করেন তবে এটি স্বয়ংক্রিয়ভাবে সেখানে কিছু নির্দেশাবলীর সাহায্যে যুক্ত করে, যদিও আপনার এগুলির কোনও প্রয়োজনই হবে না। সুতরাং, সি ++ সম্প্রদায় থাকা অবস্থায় আপনি মূলত লিনচেড হন, সি # এমনকি এটি করতে উত্সাহ দেয়। অন্তত এটি আমার কাছে এটি প্রদর্শিত হয় appears

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

তবে, তাদের পার্থক্য থাকা সত্ত্বেও, সি # এবং সি ++ তে নির্দেশাবলী ব্যবহার করে একই উদ্দেশ্য উপস্থাপিত হয়, যা কেবল SomeTypeসমস্ত সময় টাইপ করতে হয় , বরং দীর্ঘায়িত Some.Namespace.SomeType(সি ++ এর ::পরিবর্তে .) দিয়ে থাকে। এবং এই একই উদ্দেশ্যে, বিপদটিও আমার কাছে একই রকম দেখা যাচ্ছে: নামকরণ সংঘর্ষগুলি।

সর্বোত্তম ক্ষেত্রে এটি সংকলনের ত্রুটির ফলস্বরূপ, সুতরাং আপনাকে "কেবল" এটি ঠিক করতে হবে। সবচেয়ে খারাপ ক্ষেত্রে, এটি এখনও সংকলন করে এবং কোডটি আপনি যা করতে চেয়েছিলেন তার চেয়ে আলাদাভাবে কাজ করে। সুতরাং আমার প্রশ্নটি হল: কেন (আপাতদৃষ্টিতে) সি # এবং সি ++ তে এত অসম বিবেচিত নির্দেশিকা ব্যবহার করছেন?

আমার কাছে থাকা একটি উত্তর সম্পর্কে কিছু ধারণা (যদিও এর মধ্যে কোনও সত্যই আমাকে সন্তুষ্ট করে না):

  • নেমস্পেসগুলি সি ++ ( stdবনাম System.Collection.Generic) এর চেয়ে সি # তে অনেক বেশি দীর্ঘ এবং অনেক বেশি নেস্টেড থাকে । সুতরাং, এইভাবে কোডটি ডি-নয়েজ করার ক্ষেত্রে আরও আকাঙ্ক্ষা এবং আরও লাভ রয়েছে। তবে এটি সত্য হলেও, এই যুক্তিটি কেবল তখনই প্রয়োগ হয় যখন আমরা স্ট্যান্ডার্ড নেমস্পেসগুলি দেখি। কাস্টমগুলিতে সি # এবং সি ++ উভয়ই আপনার পছন্দ মতো কোনও সংক্ষিপ্ত নাম থাকতে পারে।

  • নেমস্পেসগুলি সি ++ এর তুলনায় সি # তে অনেক বেশি "সূক্ষ্ম দানাদার" বলে মনে হয়। উদাহরণস্বরূপ, C ++ সমগ্র মান গ্রন্থাগার মধ্যে অন্তর্ভুক্ত করা হয় std(প্লাস কিছু অতি ক্ষুদ্র নেস্টেড নামব্যবধান পছন্দ chrono) যখন C # এর আপনি আছেন System.IO, System.Threading, System.Textইত্যাদি সুতরাং, নামকরণের দুর্ঘটনায় ঝুঁকি কম। তবে এটি কেবল অন্ত্রে অনুভূতি। আমি আসলে গণ্য করা হবে না কত নাম "আমদানি" সঙ্গে using namespace stdএবং using System। এবং আবার এটি সত্য হলেও, এই যুক্তিটি কেবলমাত্র স্ট্যান্ডার্ড নেমস্পেসের দিকে তাকালেই প্রযোজ্য। আপনার নিজস্বগুলি সি # এবং সি ++ উভয় ক্ষেত্রে আপনার ইচ্ছামতো সূক্ষ্ম দানাদার হিসাবে ডিজাইন করা যেতে পারে।

আরও কি যুক্তি আছে? আমি বিশেষত সত্যিকারের শক্ত তথ্যগুলিতে আগ্রহী (যদি থাকে তবে) এবং মতামতের মধ্যে এতটা নয়।


2
@Timo ওপি স্পষ্টভাবে হয় না হেডার দূষণ সম্পর্কে জিজ্ঞাসা করা।
কনরাড রুডলফ

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

2
@ থমাস ওয়েলারের সি ++ তে এটি সুস্পষ্ট। সি # তে একটি এক্সটেনশন পদ্ধতি বিবেচনা করুন Ext(this T t, long l)যার মাধ্যমে এটি ডাকা হয় t.Ext(0)। এরপরে আপনি যদি কোনও এক্সটেনশন পদ্ধতি ধারণ করে এমন একটি নেমস্পেস যোগ করেন Ext(this T t, int i)তবে তার পরিবর্তে তাকে ডাকা হবে। তবে আমি সি # (এখনও) এর বিশেষজ্ঞ নই।
সেব্রোকম

2
@ ফ্র্যাঙ্ক, এমনকি যদি আমি আপনাকে সেই পয়েন্টটি দিয়ে থাকি, তবে একই যুক্তিটি সি ++ এর ক্ষেত্রে প্রযোজ্য, আরও সি ​​++ এবং সি # এর মধ্যে পার্থক্য না দেখে আমার প্রশ্নকে চাপ দিচ্ছে
সেব্রোকম

3
@ ফ্র্যাঙ্ক সি ++ অস্পষ্টতার ক্ষেত্রে আপনাকে একটি সংকলক ত্রুটি নিক্ষেপ করবে। পাশাপাশি সি #।
টিমো

উত্তর:


28

কেন "সিস্টেম ব্যবহার করছে"; খারাপ অনুশীলন হিসাবে বিবেচনা করা হয় না?

"সিস্টেম ব্যবহার করে;" সর্বজনীনভাবে একটি খারাপ অভ্যাস হিসাবে বিবেচিত হয় না । উদাহরণস্বরূপ দেখুন: আপনি কেন সি # তে 'ব্যবহার করে' নির্দেশিকা ব্যবহার করবেন না?

তবে এটি সত্য হতে পারে যে এটি একেবারে খারাপ হিসাবে বিবেচিত হয় না using namespace std। সম্ভবত কারণ:

  1. সি # এর হেডার ফাইল নেই। প্রি-প্রসেসর ব্যবহার করে একটি সি # উত্স ফাইল অন্যটিতে অন্তর্ভুক্ত করা অস্বাভাবিক is

  2. stdনেমস্পেসটি প্রায় সমতল, প্রায় সমস্ত স্ট্যান্ডার্ড গ্রন্থাগার ফাংশন, প্রকার এবং ভেরিয়েবল এতে রয়েছে (ফাইল সিস্টেম সাব-নেমস্পেসের মতো কিছু ব্যতিক্রম রয়েছে)। এটিতে খুব, খুব বেশি সংখ্যক শনাক্তকারী রয়েছে। আমার বোঝার জন্য, Systemএতে খুব কম নাম রয়েছে এবং এর পরিবর্তে আরও সাব-নেমস্পেস রয়েছে।

  3. সি # তে কোনও বৈশ্বিক ফাংশন বা ভেরিয়েবল নেই are এই হিসাবে, গ্লোবাল শনাক্তকারীগুলির সংখ্যা সি ++ এর বিপরীতে সাধারণত খুব কম থাকে: এরপরে, সি লাইব্রেরিগুলি (প্রায়শই পরোক্ষভাবে) ব্যবহার করা সাধারণত, যার নাম স্থান নেই, এবং তাই তাদের সমস্ত নাম বিশ্বব্যাপী রাখুন নামস্থান।

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

এই পার্থক্যগুলির কারণে, "সিস্টেম ব্যবহার করে"; নাম দ্বন্দ্বের চেয়ে কম সম্ভাবনা আছে using namespace std


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

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


3
এটি খোলার নেমস্পেসগুলির কেবলমাত্র সম্ভাব্য ত্রুটিগুলি বিবেচনা করে। এটি একটি শুরু, তবে আমি মনে করি আমাদের আরও সুবিধাগুলি বিবেচনা করতে হবে: সি ++ এর ক্ষেত্রে, বেশিরভাগ ক্ষেত্রে এটি পাঁচটি অক্ষর ( std::) সংরক্ষণ করে । সি # তে, এটি যথেষ্ট পরিমাণে আরও রয়েছে ( System."কেবল" 7 ​​টি অক্ষর রয়েছে তবে অন্যান্য, নেস্টেড নেমস্পেসে আরও অনেকগুলি অক্ষর রয়েছে এবং এগুলিকে সর্বত্র লিখিতভাবে লেখা সম্পূর্ণরূপে অপঠনযোগ্য করে তুলবে)।
কনরাড রুডল্ফ

সি # ওভারলোড রেজোলিউশনটি সি ++ এর চেয়ে दयालु এবং সংকলক ত্রুটির মাধ্যমে প্রচুর অস্পষ্টতা তৈরি হয় তাও কি নয়? (কোনওভাবেই আপনার উত্তরের সমালোচনা যা
অনুমোদনযোগ্য

3
@ কনরাড রুডল্ফ যদি ত্রুটিগুলি উল্লেখযোগ্য হিসাবে বিবেচিত হয় এবং টাইপিংয়ের পরিমাণকে সমানভাবে (টাইপিংয়ের পরিমাণের সাথে তুলনা করে std::) বিবেচনা করা হয়, তবে using Sys = System;নাম-স্থানটি দূষণকারী নন-উরফের পরিবর্তে ব্যবহার করা কি আদর্শ শৈলী নয় using?
এরেরিকা

2
বাথশেবা "অনুমোদনকারী" সম্পর্কিত, আমি অস্বীকার করতে চাই যে আমি সি # সম্পর্কে খুব কমই জানি, এবং আমার উত্তর সি ++ এর জ্ঞান এবং সি # সম্পর্কে কয়েকটি গুগল অনুসন্ধানের উপর ভিত্তি করে। সুতরাং, কেউ যদি সি এর # অংশগুলি পরীক্ষা করে তবে আমি প্রশংসা করব :)
এরেরিকা

2
ADL অংশ সম্পর্কিত: সি # এর এক্সটেনশন পদ্ধতি রয়েছে। এটি এডিএল থেকে আলাদা ডিজাইন, তবে নামকরণের বিরোধের ক্ষেত্রে তারা একই সমস্যা ভাগ করে দেয়।
টিমো

-2

তবে, তাদের পার্থক্য থাকা সত্ত্বেও, সি # এবং সি ++ তে নির্দেশিকাগুলি ব্যবহার করে একই উদ্দেশ্য উপস্থাপিত হয়, যা কেবলমাত্র সর্বাধিক টাইম-নেমস্পেস.সোমটাইপ (সি ++ এর পরিবর্তে :: এর পরিবর্তে। এর পরিবর্তে) সমস্ত সময় টাইপ করে থাকে Some এবং এই একই উদ্দেশ্যে, বিপদটিও আমার কাছে উপস্থিত রয়েছে: নামকরণ সংঘর্ষগুলি।

হ্যাঁ, তবে আপনি সেই বিপদটি রফতানি করেন নি (পড়ুন: অন্যকে এটি মোকাবেলা করতে বাধ্য করা), কারণ:

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

সুতরাং এটি বরং ভিন্ন ধরণের জিনিস।

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

নেমস্পেসগুলি সি ++ এর তুলনায় সি # তে অনেক বেশি "সূক্ষ্ম দানাদার" বলে মনে হয়।

হ্যাঁ, এটাও। using namespace stdএবং using System.Collection.Genericঅতুলনীয়।

সুতরাং তাদের তুলনা করবেন না!


2
এটি ওপির উদ্বেগের জবাব দেয় না, যা শিরোনামে নেমস্পেসগুলি খোলার বিষয়ে নয় , তবে প্রয়োগকারী ফাইলগুলিতে
কনরাড রুডলফ

2
@ কনরাডরুডল্ফ using namespace stdসি ++ এ এড়ানোর পরামর্শটি বেশিরভাগ ক্ষেত্রে হেডার ফাইলগুলি সম্পর্কে। উত্তরটি হ'ল এটি সি # তে প্রযোজ্য নয়।
উইংস উইন্ড উইন্ড উইন্ডস

8
@ এস্টোরয়েডস উইথওয়েটিংয়ের পরামর্শ এড়াতে using namespace stdঅবশ্যই বেশিরভাগ শিরোনাম সম্পর্কে নয়। হেডারগুলিতে এটি ব্যবহার করা বিপজ্জনক। আপনার প্রয়োগে এটি ব্যবহারের বিরুদ্ধে পরামর্শ দেওয়া হচ্ছে।
টমি অ্যান্ডারসন

1
using namespace ...সি ++ এ এড়ানোর পরামর্শটি নামকরণের সংঘর্ষ এড়ানোর বিষয়ে, usingসি # তে নির্দেশনা নামকরণের সংঘর্ষের সম্ভাবনাও প্রবর্তন করে, তবে কেন তা এড়িয়ে যাবেন না? যদিও সেখানে বাস্তবায়নের পার্থক্য রয়েছে।
টমি অ্যান্ডারসন

@ টমিঅ্যান্ডারসন, যদি এমন সংঘাত ঘটে তবে তা সমাধান করা কতটা কঠিন? এটি এক সেকেন্ড সময় লাগে। যেহেতু সি # usingডিক্লেয়ারেশানগুলি প্রতি ফাইল যা একক প্রকার / শ্রেণি সংজ্ঞায়িত করে এবং সাধারণত টাইপটি অ্যাপ্লিকেশন ডোমেন ধারণাগুলির একটি অপেক্ষাকৃত সংক্ষিপ্ত সেট (আদর্শভাবে, একক দায়িত্বের নীতি) এর সাথে সম্পর্কিত যেমন নামস্থান সংঘর্ষের সম্ভাবনা অত্যন্ত কম। যখন ঘটে তখন সহজেই স্থিরযোগ্য। সাধারণ। নেট বিকাশ সরঞ্জাম / আইডিই আপনাকে এতে অনেক সহায়তা করে। একাধিক উন্নয়নমূলক ক্রিয়াকলাপের সংমিশ্রণ করে আপনাকে আরও উত্পাদনশীল করে তোলার জন্য ডিজাইন করা হয়েছে এমন পুরো বিকাশ বাস্তুসংস্থানটি বিবেচনা করুন
একর্নিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.