আপনি কেন সি # তে 'ব্যবহার করে' নির্দেশিকা ব্যবহার করবেন না?


71

একটি বৃহত সি # প্রকল্পের বিদ্যমান কোডিং মানগুলির মধ্যে একটি বিধি অন্তর্ভুক্ত রয়েছে যে সমস্ত প্রকারের নাম পুরোপুরি যোগ্য হয়ে উঠতে হবে, নির্দেশিকাটির 'ব্যবহারের' কর্মসংস্থান নিষিদ্ধ করে। সুতরাং, পরিচিতের চেয়ে:

using System.Collections.Generic;

.... other stuff ....

List<string> myList = new List<string>();

(এটি সম্ভবত কোনও বিস্ময়কর বিষয় যা varনিষিদ্ধও

আমি এখানে দিয়ে শেষ করছি:

System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>();

টাইপিংয়ে এটি 134% বৃদ্ধি, এর কোনওটিই দরকারী তথ্য সরবরাহ করে না। আমার দৃষ্টিতে, 100% বৃদ্ধি হ'ল গোলমাল (গোলমাল) যা আসলে বুঝতে বাধা দেয়

30+ বছরের প্রোগ্রামিংয়ে, আমি এমন একটি স্ট্যান্ডার্ড একবার বা দু'বার প্রস্তাব করেছি, কিন্তু কখনও প্রয়োগ করা হয়নি। এর পিছনে যুক্তি আমার হাত থেকে বাঁচায়। মানক চাপিয়ে দেওয়া ব্যক্তি বোকা নয় এবং আমি মনে করি না তিনি দূষিত। যদি আমি কিছু মিস করি না তবে এটি কেবলমাত্র অন্য বিকল্প হিসাবে বিপথগামী হয়ে পড়ে।

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

যুক্তি

এই নিষেধাজ্ঞার কারণগুলি ছিল:

  1. পুরোপুরি যোগ্যতাসম্পন্ন টাইপ পেতে নামের উপর দিয়ে মাউস ঘোরা করা জটিল c সর্বদা সম্পূর্ণরূপে যোগ্যতাসম্পন্ন যোগ্যতাসম্পন্ন টাইপ দৃশ্যমান থাকা ভাল।
  2. ইমেল কোড স্নিপেটের পুরোপুরি যোগ্যতাসম্পন্ন নাম নেই এবং তাই বুঝতে অসুবিধা হতে পারে।
  3. ভিজ্যুয়াল স্টুডিওর (যেমন নোটপ্যাড ++ এর বাইরে) কোডটি দেখার বা সম্পাদনা করার সময়, পুরোপুরি যোগ্য টাইপের নাম পাওয়া অসম্ভব।

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

সম্ভাব্য নেমস্পেস বিরোধ সংক্রান্ত সমস্যাগুলি, যা আমি প্রাথমিক উদ্বেগ হিসাবে প্রত্যাশা করছিলাম, এমনকি তাদের উল্লেখ করা হয়নি। এটি বিশেষত অবাক হওয়ার কারণ আমাদের একটি নেমস্পেস রয়েছে MyCompany.MyProject.Core, যা একটি বিশেষত খারাপ ধারণা। আমি অনেক আগেই শিখেছি যে কোনও কিছুর নাম Systemবা Coreসি # তে নামকরণ করা উন্মাদনার দ্রুত পথ।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

1
কেন এটি একটি ভাল ধারণা হতে পারে তার একটি বাস্তব-জগত উদাহরণ (তবে সি ++ বিশ্বে): একটি উত্তর কেন "নেমস্পেস স্ট্যান্ড ব্যবহার করে" খারাপ অভ্যাস বলে বিবেচিত হয়? "কাছাকাছি" যা উভয়ই 'ব্যবহার' নির্দেশনা এবং ঘোষণা নিষিদ্ধ করেছে "।
পিটার মর্টেনসেন

যুক্তি বিভাগটি পড়ার আগে, আমি একধরনের অযৌক্তিক কারণগুলি অনুমান করেছি কারণ আমার সংস্থার অনুরূপ নিয়ম রয়েছে।
Gqqnbig

উত্তর:


69

বিস্তৃত প্রশ্ন:

আপনি কি কখনও এমন একটি মান আরোপের কথা শুনেছেন? যদি তা হয় তবে এর পেছনের কারণ কী ছিল?

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


একটি উদাহরণ: এই ধরণের দৃশ্যের একটি উদাহরণের সাথে সম্ভবত আরও ভাল ব্যাখ্যা করা হয়েছে।

ধরা যাক আমাদের Lists<T>দুটি পৃথক প্রকল্পের সাথে সম্পর্কিত belong

System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>

যখন আমরা সম্পূর্ণরূপে যোগ্য অবজেক্টের নাম ব্যবহার করি তখন এটি কোনটি List<T>ব্যবহার করা হচ্ছে তা পরিষ্কার । এই স্পষ্টতা স্পষ্টতই ভার্বোসিটির দামে আসে।

এবং আপনি যুক্তিযুক্ত হতে পারেন, "অপেক্ষা করুন! এর আগে কেউ আর দুটি তালিকা ব্যবহার করবে না!" কোনটি যেখানে আমি রক্ষণাবেক্ষণের পরিস্থিতিটি নির্দেশ করব।

আপনি Fooআপনার কর্পোরেশনের জন্য লিখিত মডিউল যা কর্পোরেশন অনুমোদিত, অনুকূলিতকরণ ব্যবহার করে List<T>

using MyCorp.CustomCollections.Optimized;

public class Foo {
    List<object> myList = ...;
}

পরে, একজন নতুন বিকাশকারী আপনার করা কাজটি বাড়িয়ে দেওয়ার সিদ্ধান্ত নেয়। সংস্থার মান সম্পর্কে সচেতন না হয়ে তারা usingব্লকটি আপডেট করে :

using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;

এবং তাড়াহুড়োয় কীভাবে জিনিসগুলি খারাপ হয়ে যায় তা আপনি দেখতে পাবেন।

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

MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();

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

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

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


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

List<T>বিশেষত, একটি সংরক্ষিত শব্দ হিসাবে বিবেচিত হওয়া উচিত এবং আপনার ক্লাসগুলির নাম হিসাবে ব্যবহার করা উচিত নয়।

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

অন্য কিছু না হলে আপনি অস্পষ্টতা সমাধানের জন্য আংশিক নেমস্পেস ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি যদি পুরোপুরি কোনও Foo()শ্রেণির নাম পরিবর্তন করতে না পারেন তবে আপনি তাদের আংশিক নেমস্পেসগুলি ব্যবহার করতে পারেন:

Bar.Foo() 
Baz.Foo()

আপনার বর্তমান প্রকল্পের নির্দিষ্ট কারণ:

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

পুরোপুরি যোগ্যতাসম্পন্ন টাইপ পেতে নামের উপর দিয়ে মাউস ঘোরা করা জটিল c সর্বদা সম্পূর্ণরূপে যোগ্যতাসম্পন্ন যোগ্যতাসম্পন্ন টাইপ দৃশ্যমান থাকা ভাল।

"কষ্টকর?" উম, না। বিরক্তিকর সম্ভবত। অন-স্ক্রিন পয়েন্টার স্থানান্তর করতে কয়েক আউন্স প্লাস্টিকের স্থানান্তর করা অসুবিধাজনক নয় । কিন্তু আমার দ্বিমত আছে.

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

এটি পুরোপুরি যোগ্যতাসম্পন্ন শ্রেণীর নামগুলির একটি বৈধ সমর্থনযোগ্যতা নয়, সম্ভবত এটি আংশিকভাবে যোগ্য শ্রেণীর নাম ব্যবহারের জন্য একটি বৈধ সমর্থনযোগ্যতা।

ইমেল কোড স্নিপেটের পুরোপুরি যোগ্যতাসম্পন্ন নাম নেই এবং তাই বুঝতে অসুবিধা হতে পারে।

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

ভিজ্যুয়াল স্টুডিওর (যেমন নোটপ্যাড ++ এর বাইরে) কোডটি দেখার বা সম্পাদনা করার সময়, পুরোপুরি যোগ্য টাইপের নাম পাওয়া অসম্ভব।

সমস্ত কারণগুলির মধ্যে, এটি আমার প্রায় আমার পানীয়কে থুতু দিয়েছিল। কিন্তু আবার, আমি digress।

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

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

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

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

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


1
+1 টি। আমি আমাদের অভ্যন্তরীণ নেমস্পেসে আসলে কিছু কদর্য সংঘর্ষের মুখোমুখি হয়েছি। উভয়ই "2.0" প্রকল্পে লিগ্যাসি কোড পোর্টিং করতে এবং কেবলমাত্র কয়েকটি নির্বাচিত কয়েকটি শ্রেণীর নাম যা বিভিন্ন নাম স্থানের প্রসঙ্গগুলিতে শব্দার্থগতভাবে বৈধ। সত্যই কৌতূহলজনক বিষয় হ'ল একই নামের দুটি জিনিসের প্রায়শই একই রকম ইন্টারফেস থাকে, তাই সংকলকটি অভিযোগ করবে না ... আপনার রানটাইমটি হবে!
এসভিডজেন

23
এই সমস্যাটি নাম স্পেসের উপকরণগুলি ব্যবহার করে সমাধান করা হয়, স্পষ্টত নাম স্থান ব্যবহারের সাথে বিশৃঙ্খলাযুক্ত করে কোডের প্রয়োজনের বোকা নিয়ম চাপিয়ে নয়।
ডেভিড আরনো

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

4
@ GlenH7 আপনি আপনার উত্তরের অন্যান্য উপলব্ধ সমাধান নির্দিষ্ট করতে চাইতে পারেন। আমি লোকেরা এটিকে হোঁচট খেতে দেখে ভেবে ঘৃণা করব এবং "ওহ! এটি দুর্দান্ত ধারণা!" +1 বাকি উদ্দেশ্য এবং বাস্তববাদী জন্য যদিও।
রাবারডাক

3
@JimMischel - এটি শোনাচ্ছে মত শাসন একটি খঁজের যষ্টি হিসাবে ব্যবহার করা হচ্ছে কিছু । জিনিসটি যদিও তা নির্ধারণ করা সম্ভব নাও হতে পারে। উচ্চ স্তরে, হ্যাঁ, মাঝে মাঝে অনুমতি না দেওয়ার জন্য ন্যায়সঙ্গততা রয়েছে usingsতবে এটি আপনার সাংস্কৃতিক প্রকল্পের মতো না বলে মনে হয় না।

16

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

উদাহরণ স্বরূপ,

  • Domain.Customer
  • Legacy.Customer
  • ServiceX.Customer
  • ViewModel.Customer
  • Database.Customer

খারাপ নকশা, আপনি বলতে পারেন, তবে আপনি জানেন যে কীভাবে এই জিনিসগুলি জৈবিকভাবে বিকশিত হয় এবং বিকল্পটি কী - নামের স্থানটি অন্তর্ভুক্ত করতে সমস্ত শ্রেণীর নাম পরিবর্তন করুন? মেজর রিফ্যাক্টরিং সব কিছুর?

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

সঙ্গে usingউপরের সরাসরি, এই গাধা একটি প্রধান ব্যথা, ছিল ReSharper বিজোড় কিছু চেষ্টা এবং এটি কার্যকর করতে, rewriting করবেন usingমাছি উপর নির্দেশনা, আপনি ক্রেতা-can't হতে-cast-as- পেতে হবে গ্রাহক-শৈলীর ত্রুটিগুলি এবং কোন ধরণেরটি সঠিক ছিল তা জানেন না।

সুতরাং, কমপক্ষে আংশিক নেমস্পেস থাকা,

var cust = new Domain.Customer

অথবা

public void Purchase(ViewModel.Customer customer)

কোডটির পঠনযোগ্যতা ব্যাপকভাবে উন্নত করেছে এবং আপনি কোন বস্তুটি চেয়েছিলেন তা স্পষ্ট করে তুলেছে।

এটি কোনও কোডিং মান ছিল না, এটি পুরো নামস্থান ছিল না এবং এটি স্ট্যান্ডার্ড হিসাবে সমস্ত শ্রেণিতে প্রয়োগ করা হয়নি।


13
"বিকল্পটি কী, নেমস্পেসকে অন্তর্ভুক্ত করতে সমস্ত শ্রেণীর নাম বদল করুন? সব কিছুর বড় রিফ্যাক্টরিং?" হ্যাঁ, এটিই (সঠিক) বিকল্প।
ডেভিড আরনো

2
কেবল স্বল্পমেয়াদেই। দীর্ঘ মেয়াদে কোডে স্পষ্টত নেমস্পেস ব্যবহার করার চেয়ে এটি অনেক কম ব্যয়বহুল।
ডেভিড আরনো

3
সেই যুক্তিটি মেনে নিতে পেরে খুশি, যতক্ষণ না আপনি আমাকে নগদ শেয়ারের বিনিময়ে শোধ করছেন।
ইয়ান

8
@ ডেভিড: না, এটি সঠিক বিকল্প নয়। সমস্ত শনাক্তকারী বা কমপক্ষে যাঁরা আসলে সংঘর্ষে থাকে তাদের পুরোপুরি যোগ্যতা অর্জন করা হ'ল সঠিক উপায় এবং একই জায়গায় বিভিন্ন মডিউলে একই নাম ব্যবহার করার পরে নাম স্থানটি প্রথম স্থানে থাকার কারণেই সংঘর্ষ সরবরাহ করা হয়। মুল্যটি হ'ল কিছু মডিউল 3 য় পক্ষের হতে পারে, কোন কোডবেস আপনি সংশোধন করতে পারবেন না। সুতরাং আপনি কী করবেন, যখন দুটি পৃথক তৃতীয় পক্ষের লাইবারিগুলির সনাক্তকারীরা সংঘর্ষ হয় এবং আপনার উভয় গ্রন্থাগার ব্যবহার করা প্রয়োজন তবে সেগুলির কোনওটিই রিফ্যাক্টর করতে পারবেন না? নেমস্পেস বিদ্যমান, কারণ রিফ্যাক্টরিং সবসময় সম্ভব হয় না।
কায়সারলুদি

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

7

খুব ভার্বোজ বা খুব ছোট হওয়া ভাল নয়: সূক্ষ্ম বাগগুলি রোধ করার জন্য অতিরিক্ত বিশদযুক্ত হওয়ার জন্য একটি সোনার মাঝের সন্ধান করা উচিত, যখন খুব বেশি কোড লিখতে এড়ানো যায়।

সি # তে এর একটি উদাহরণ আর্গুমেন্টের নাম। আমি বেশ কয়েকবার সমস্যার মুখোমুখি হয়েছি যেখানে আমি সমাধানের সন্ধানের জন্য ঘন্টা সময় ব্যয় করেছি, যখন লেখার আরও ভার্জিক স্টাইলটি প্রথমে বাগটি প্রতিরোধ করতে পারে। সমস্যাটি আর্গুমেন্টের ক্রমটিতে একটি ত্রুটি নিয়ে গঠিত। উদাহরণস্বরূপ, এটি কি আপনার কাছে ঠিক দেখাচ্ছে?

if (...) throw new ArgumentNullException("name", "The name should be specified.");
if (...) throw new ArgumentException("name", "The name contains forbidden characters.");

প্রথম দর্শনে, এটি পুরোপুরি সূক্ষ্ম দেখায় তবে একটি বাগ রয়েছে। ব্যতিক্রম নির্মাণকারীদের স্বাক্ষরগুলি হ'ল:

public ArgumentException(string message, string paramName)
public ArgumentNullException(string paramName, string message)

অর্ডারের ক্রম লক্ষ্য করেছেন?

পদ্ধতিটি একই ধরণের দুটি বা ততোধিক যুক্তি গ্রহণ করে প্রতিবার যুক্তির নাম নির্দিষ্ট করা হয় এমন একটি আরও ভার্বোস স্টাইল গ্রহণ করে আমরা ত্রুটিটি আবার ঘটতে বাধা দেয় এবং তাই:

if (...) throw new ArgumentNullException(paramName: "name", message: "The name should be specified.");
if (...) throw new ArgumentException(paramName: "name", message: "The name contains forbidden characters.");

স্পষ্টতই লিখতে দীর্ঘ, কিন্তু কম সময় নষ্ট ডিবাগিং ফলাফল।

চূড়ান্তভাবে ঠেলাঠেলি করা, কেউ প্যারামিটারগুলির ক্রমকে মেশানোর কোনও উপায় নেই এমন পদ্ধতিতে যেখানেই সর্বত্র নামযুক্ত যুক্তি ব্যবহার করতে বাধ্য করতে পারে doSomething(int, string)। এটি সম্ভবত দীর্ঘমেয়াদে প্রকল্পটির ক্ষতি করবে, যার ফলে আমি উপরে বর্ণিত ত্রুটি প্রতিরোধের সুবিধা ছাড়াই আরও অনেক বেশি কোড তৈরি করব।

আপনার ক্ষেত্রে, "না using" নিয়মের পিছনে অনুপ্রেরণা হ'ল MyCompany.Something.List<T>বনামের মতো ভুল প্রকারটি ব্যবহার করা আরও কঠিন হওয়া উচিত System.Collections.Generic.List<T>

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


এই জাতীয় পরিস্থিতিগুলি সরঞ্জাম দ্বারা সনাক্ত করা যায়। রিশার্পারটি বৈশিষ্ট্যটির paramNameসাথে চিহ্ন চিহ্নিত করে এবং এই InvokerParameterNameজাতীয় কোনও পরামিতি উপস্থিত না থাকলে একটি সতর্কতা জারি করে।
জনবট

2
@ জনবোট: তারা অবশ্যই পারেন, তবে খুব সীমিত সংখ্যক ক্ষেত্রে। আমার যদি একটি হয় SomeBusiness.Something.DoStuff(string name, string description)? নাম কী এবং বিবরণ কী তা বোঝার জন্য কোনও সরঞ্জামই যথেষ্ট স্মার্ট নয়।
আর্সেনী মোরজেনকো

এই ক্ষেত্রে আরসেনিমারউজেনকোকেও অনুরোধটি সঠিক কিনা সঠিক তা আবিষ্কার করার জন্য এমনকি মানুষের সময় নেওয়া দরকার।
Gqqnbig

6

নেমস্পেসগুলি সংক্ষিপ্ত নামগুলির অনুমতি দিয়ে কোডকে একটি শ্রেণিবদ্ধ কাঠামো দেয়।

   MyCompany.Headquarters.Team.Leader
   MyCompany.Warehouse.Team.Leader

আপনি যদি "কীওয়ার্ড" কীওয়ার্ডটি মঞ্জুরি দেন, সেখানে ইভেন্টগুলির একটি শৃঙ্খল রয়েছে ...

  • প্রত্যেকেই সত্যই একটি বিশ্বব্যাপী নেমস্পেস ব্যবহার করছে
    (কারণ এগুলিতে তারা সম্ভবত চাইবে এমন প্রতিটি নামস্থান অন্তর্ভুক্ত করে)
  • লোকেরা নাম সংঘর্ষ পেতে শুরু করে, বা
  • নাম সংঘর্ষ সম্পর্কে চিন্তা

সুতরাং ঝুঁকি এড়াতে, সবাই সত্যিই দীর্ঘ নাম ব্যবহার শুরু করে:

   HeadquartersTeamLeader
   WarehouseTeamLeader

পরিস্থিতি বাড়ছে ...

  • অন্য কেউ ইতিমধ্যে একটি নাম বেছে নিয়েছে, তাই আপনি আরও দীর্ঘ ব্যবহার করেন।
  • নামগুলি দীর্ঘ এবং দীর্ঘতর হয়।
  • দৈর্ঘ্য 60 অক্ষর অতিক্রম করতে পারে, সর্বোচ্চ ছাড়াই - এটি হাস্যকর হয়।

আমি এটি ঘটতে দেখেছি, তাই "ব্যবহার" নিষিদ্ধকারী সংস্থাগুলির প্রতি সহানুভূতি জানাতে পারি।


11
নিষিদ্ধ করা usingহচ্ছে পারমাণবিক বিকল্প। নেমস্পেসের উপাধি এবং আংশিক যোগ্যতা সবচেয়ে বেশি ভাল।
জিম মিশেল

1

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

জাভাতে অনুরূপ সমস্যা দেখা দেয় যদি কেউ উদাহরণের import Java.util.*;চেয়ে লেখেন import Java.util.List;; পরবর্তী ঘোষণার নথিগুলি কোন নামটি চালু করা হয়েছে যাতে List<>উত্সটিতে পরে যখন ঘটে তখন এর উত্সটি importঘোষণা থেকে জানা যায় ।


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

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

2
হ্যাঁ, সি # তে এমন লোকেরা কাজ করছেন যারা সেরা উপলব্ধ সরঞ্জামাদি ব্যবহার না করে নিজেকে প্রতিবন্ধী করছেন। এবং যেখানে পুরো যোগ্যতা "স্ব ডকুমেন্টিং" যুক্তিটির কিছুটা যোগ্যতা রয়েছে তেমনি এই জাতীয় কোডের পাঠযোগ্যতার জন্য বিশাল ব্যয় রয়েছে। সমস্ত বহিরাগত কোড শব্দের সৃষ্টি করে যা কোডের অংশগুলিকে অস্পষ্ট করে যা সত্যই গুরুত্বপূর্ণ।
জিম মিসেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.