কীভাবে আমার চিন্তাভাবনা সি ++ থেকে সি # তে স্থানান্তরিত করবেন


12

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

সি ++ এর দৃষ্টিকোণ থেকে সি # তে আলাদা কোন ভাল অনুশীলন , ডিজাইনের ধরণ , আইডিয়ামগুলি আপনি প্রস্তাব দিতে পারেন? সি # তে বোবা না দেখায় একটি নিখুঁত সি ++ ডিজাইন কীভাবে পাবেন?

বিশেষত, আমি (সাম্প্রতিক উদাহরণগুলি) মোকাবেলার জন্য একটি ভাল সি-ইশ উপায় খুঁজে পাচ্ছি না:

  • আজীবন সংস্থানগুলি নিয়ন্ত্রনমূলক ক্লিনআপ (ফাইলগুলির মতো) প্রয়োজন হয় তা নিয়ন্ত্রণ করে। এটি usingহাতে রাখা সহজ তবে যখন সম্পদের মালিকানা হস্তান্তরিত হচ্ছে তখন কীভাবে এটি সঠিকভাবে ব্যবহার করা যায় [... বেটউইন থ্রেড]? সি ++ তে আমি কেবল ভাগ করে নেওয়া পয়েন্টার ব্যবহার করব এবং ঠিক সময়ে সঠিক সময়ে এটি 'আবর্জনা সংগ্রহের' যত্ন নিতে দেব।
  • নির্দিষ্ট জেনেরিকের জন্য ওভাররাইডিং ফাংশনগুলির সাথে অবিচ্ছিন্ন লড়াই করা (আমি সি ++ তে আংশিক টেম্পলেট বিশেষায়নের মতো জিনিস পছন্দ করি)। আমি কি কেবল # # তে কোনও জেনেরিক প্রোগ্রামিংয়ের কোনও প্রচেষ্টা ত্যাগ করা উচিত? হয়তো জেনেরিকগুলি উদ্দেশ্য ভিত্তিতে সীমাবদ্ধ এবং কোনও নির্দিষ্ট ডোমেন ব্যতীত সেগুলি ব্যবহার করা সি-ইশ নয়?
  • ম্যাক্রোর মতো কার্যকারিতা। যদিও একটি খারাপ ধারণা, সমস্যার কিছু ডোমেনের জন্য অন্য কোনও কার্যকারিতা নেই (যেমন বিবৃতিটির শর্তসাপেক্ষ মূল্যায়ন যেমন লগগুলির সাথে কেবলমাত্র ডিবাগ রিলিজে যাওয়া উচিত)। সেগুলি না থাকার অর্থ হল যে আমার আরও if (condition) {...}বয়লারপ্লেট লাগাতে হবে এবং এটি এখনও পার্শ্ব প্রতিক্রিয়াগুলি ট্রিগার করার ক্ষেত্রে সমান নয়।

# 1 আমার পক্ষে খুব কঠিন, উত্তরটি নিজেই জানতে চাই। # 2 - আপনি কি একটি সাধারণ সি ++ কোড উদাহরণ দিতে এবং ব্যাখ্যা করতে পারেন যে আপনার এটি কেন প্রয়োজন? # 3 এর জন্য - C#অন্যান্য কোড উত্পন্ন করতে ব্যবহার করুন । আপনি একটি CSVবা একটি পড়তে পারেন XMLবা ইনপুট হিসাবে আপনি কী ফাইল করেছেন এবং একটি C#বা একটি SQLফাইল তৈরি করতে পারেন। এটি কার্যক্ষম ম্যাক্রোগুলি ব্যবহারের চেয়ে আরও শক্তিশালী হতে পারে।
কাজ

ম্যাক্রোর মতো কার্যকারিতা প্রসঙ্গে আপনি কোন নির্দিষ্ট জিনিসগুলি করার চেষ্টা করছেন? আমি যা পেয়েছি তা হ'ল সি ++ এ ম্যাক্রোর সাহায্যে আমি যা করতাম তা পরিচালনা করতে সাধারণত একটি # # ভাষা রচনা থাকে। এছাড়াও চেক আউট C # এর প্রাক প্রসেসর নির্দেশনা: msdn.microsoft.com/en-us/library/4y6tbswk.aspx
ravibhagw

সি ++ তে ম্যাক্রোগুলির সাহায্যে অনেক কিছুই সি # তে প্রতিবিম্বের সাহায্যে করা যায়।
সেবাস্তিয়ান রেডল

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

উত্তর:


16

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

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

বেশিরভাগ ক্ষেত্রে, নতুন সরঞ্জামগুলি সবচেয়ে কার্যকরভাবে ব্যবহার করার দিকে মনোনিবেশ করুন, পুরানোগুলির সাথে একটি সংযুক্তি দিয়ে নিজেকে মারবেন না।

সি # তে বোবা না দেখায় একটি নিখুঁত সি ++ ডিজাইন কীভাবে পাবেন?

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

তবে নির্দিষ্ট পরিস্থিতিতে প্রতিক্রিয়া:

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

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

প্রাক প্রসেসর শর্তাদি - সি # হ'ল#if বাদাম go আরও ভাল, এর শর্তসাপেক্ষ বৈশিষ্ট্য রয়েছে যা কোনও সংকলক চিহ্নটি সংজ্ঞায়িত না করা হলে কোড থেকে কেবল সেই ফাংশনটি ফেলে দেবে।


রিসোর্স ম্যানেজমেন্ট সম্পর্কিত, সি # তে ম্যানেজার ক্লাস (যা স্থির বা গতিশীল হতে পারে) রাখা খুব সাধারণ বিষয়।
রুয়ানং

ভাগ করা সংস্থান সম্পর্কে: পরিচালিতগুলি সি # তে সহজ (যদি বর্ণ-শর্তগুলি অপ্রাসঙ্গিক হয়), পরিচালনা না করা এগুলি অনেক নিকৃষ্ট।
হস্তান্তরকারী

@ রওং - সাধারণ, তবে ম্যানেজার ক্লাসগুলি এখনও এড়াতে পারা যায় না।
টেলাস্টিন

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

4

যতদূর আমি দেখতে পাচ্ছি, কেবলমাত্র জৈবিক পরিচালনা ব্যবস্থার জন্য নির্ধারিত জিনিস হ'ল IDisposable, যা ভেঙে যায় (যেমন: কোনও ভাষা বা টাইপ সিস্টেম সমর্থন নয়) যখন আপনি লক্ষ্য করেছেন, আপনাকে এই জাতীয় সংস্থার মালিকানা স্থানান্তর করতে হবে।

আপনার মতো একই নৌকায় থাকা - সি ++ বিকাশকারী সি # এটিএম করছেন। - সি # প্রকার / স্বাক্ষরে মডেল ওনারশিপ ট্রান্সফার (ফাইল, ডিবি-সংযোগগুলি, ...) এর সমর্থনের অভাব আমার কাছে খুব বিরক্তিকর হয়েছে, তবে আমাকে স্বীকার করতে হবে যে এটি "ঠিক" নির্ভর করতে বেশ কাজ করে does এই অধিকার পেতে কনভেনশন এবং এপিআই ডক্সে।

  • প্রয়োজনে ডিটারিনিস্টিকIDisposable ক্লিন আপ করতে ব্যবহার করুন ।
  • যখন আপনাকে কোনওটির মালিকানা স্থানান্তর IDisposableকরতে হবে, তখন নিশ্চিত হয়ে নিন যে এতে জড়িত এপিআই স্পষ্ট কিনা usingএবং এই ক্ষেত্রে ব্যবহার করবেন না , কারণ usingকথা বলার জন্য "বাতিল" হতে পারে না।

হ্যাঁ, আপনি টাইপ সিস্টেমে আধুনিক সি ++ (সিমিটিকস ইত্যাদি সরান) দিয়ে যা প্রকাশ করতে পারেন তার মতো মার্জিত নয়, তবে এটি পুরোপুরি কাজটি করেছে, এবং (আশ্চর্যজনকভাবে আমার কাছে) পুরো # সি সম্প্রদায়টি মনে হয় না যত্ন অত্যধিক, এএএফআইসিটি।


2

আপনি দুটি নির্দিষ্ট সি ++ বৈশিষ্ট্য উল্লেখ করেছেন। আমি RAII নিয়ে আলোচনা করব:

এটি সাধারণত প্রযোজ্য নয়, যেহেতু সি # আবর্জনা সংগ্রহ করা হয়। নিকটতম সি # নির্মাণ সম্ভবত IDisposableইন্টারফেস যা নীচে ব্যবহার করা হয়েছে:

using (FileStream fs = File.OpenRead(@"c:\path\filename.txt"))
{
   //Do stuff with the file.
} //File will be closed here.

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


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

@ অ্যান্ড্রু আপনি যা বর্ণনা করেছেন তা মালিকানার স্থানান্তরকে বোঝায়, সুতরাং এখন দ্বিতীয় থ্রেড Disposing()ফাইলটির জন্য দায়ী এবং সম্ভবত এটি ব্যবহার করা উচিত using
সোভিক 21

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

1
@ টেলাস্টিন এর অর্থ কি এই যে কোনও পরিচালিত সংস্থার উপর মালিকানা দেওয়া সি ++ এর চেয়ে সি # তে একটি বড় সমস্যা? বেশ অবাক।
অ্যান্ড্রু

6
@ অ্যান্ড্রু: আমাকে সংক্ষেপে বলি: সি ++ এ আপনি সমস্ত সংস্থার ইউনিফর্ম, আধা-স্বয়ংক্রিয় পরিচালনা পান। সি # তে, আপনি মেমরির পুরোপুরি স্বয়ংক্রিয় পরিচালনা - এবং সমস্ত কিছুর পুরোপুরি ম্যানুয়াল পরিচালনা পান। এটির কোনও বাস্তব পরিবর্তন হচ্ছে না, সুতরাং আপনার একমাত্র আসল প্রশ্নটি "আমি কীভাবে এটি ঠিক করব?", কেবল "আমি কীভাবে এই অভ্যাস করব?"
জেরি কফিন

2

এটি একটি খুব ভাল প্রশ্ন, কারণ আমি অনেকগুলি সি ++ বিকাশকারীকে ভয়ানক সি # কোড লিখতে দেখেছি।

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

এর একটি উদাহরণ যা আমি দেখেছি তা হ'ল প্রচুর সি ++ বিকাশকারী লুপের জন্য ব্যবহার করতে পছন্দ করবে কারণ তারা ফোরচের চেয়ে দ্রুত। এটি সাধারণত সি # তে একটি খারাপ ধারণা কারণ এটি সংগ্রহের সম্ভাব্য প্রকারগুলিকে পুনরাবৃত্তি করা সীমাবদ্ধ করে (এবং তাই কোডটির পুনরায় ব্যবহারযোগ্যতা এবং নমনীয়তা)।

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

আপনি যদি তালিকার লুপের জন্য লেখার পরিবর্তে অবজেক্টের তালিকার সমস্ত কিছুতে কিছু করতে চান তবে একটি পদ্ধতি তৈরি করুন যা গ্রহণ করে IEnumerable<MyObject>এবং একটি foreachলুপ ব্যবহার করে ।

আপনার নির্দিষ্ট উদাহরণ:

আজীবন সংস্থানগুলি নিয়ন্ত্রনমূলক ক্লিনআপ (ফাইলগুলির মতো) প্রয়োজন হয় তা নিয়ন্ত্রণ করে। এটি হাতে ব্যবহার করা সহজ তবে যখন সম্পদের মালিকানা হস্তান্তরিত হচ্ছে তখন কীভাবে এটি সঠিকভাবে ব্যবহার করতে হবে [... বাইটউইন থ্রেড]? সি ++ তে আমি কেবল ভাগ করে নেওয়া পয়েন্টার ব্যবহার করব এবং ঠিক সময়ে সঠিক সময়ে এটি 'আবর্জনা সংগ্রহের' যত্ন নিতে দেব।

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

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

সি # তে জেনারিকগুলি জেনেরিক হওয়ার জন্য ডিজাইন করা হয়েছে। জেনেরিকের বিশেষীকরণগুলি উত্পন্ন শ্রেণি দ্বারা পরিচালনা করা উচিত। List<T>এটি একটি List<int>বা একটি হলে কেন অন্যরকম আচরণ করা উচিত List<string>? সমস্ত অপারেশন List<T>জেনেরিক যাতে কোনও ক্ষেত্রে প্রয়োগ করা যায় List<T>। আপনি যদি .Addক এর পদ্ধতির আচরণ পরিবর্তন করতে চান List<string>তবে একটি উত্পন্ন শ্রেণি MySpecializedStringCollection : List<string>বা একটি সমন্বিত শ্রেণি তৈরি করুন MySpecializedStringCollection : IList<string>যা জেনেরিকে অভ্যন্তরীণভাবে ব্যবহার করে তবে বিভিন্ন উপায়ে কাজ করে। এটি আপনাকে লিসকোভ সাবস্টিটিউশন নীতি লঙ্ঘন করা এবং আপনার শ্রেণি ব্যবহার করে এমন অন্যদের স্ক্র্যাচ্যভাবে এড়াতে সহায়তা করে।

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

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

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


3
WRT। সংস্থান স্থানান্তর: "আপনার কখনই এটি করা উচিত নয়" এটি IMHO কেটে দেয় না। প্রায়শই, একটি খুব ভাল নকশা প্রস্তাব দেওয়া একটি হস্তান্তরের IDisposable( না এক বর্গ থেকে অন্য কাঁচা রিসোর্স): শুধু দেখতে StreamWriter এপিআই যেখানে এই নিখুঁত জ্ঞান করে তোলে Dispose()পাস স্ট্রীমের। এবং সি # ভাষার গর্ত রয়েছে - আপনি টাইপ সিস্টেমে এটি প্রকাশ করতে পারবেন না।
মার্টিন বা

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

1

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

যাইহোক, স্থির শ্রেণিগুলিও রয়েছে যা আমাকে সত্যই বিরক্ত করে তাই আপনি প্রায়শই একটি তৈরি করার চেষ্টা করেন কেবল আপনাকে কেবল এটির ব্যবহার করতে হবে find আমি কোনটি ব্যবহার করব তা জানা এত সহজ নয়।

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

আপনি খুব তাড়াতাড়ি এটিকে বাছাই করবেন, সি # ভিবি থেকে খুব কমই আলাদা তাই আপনি এটিকে একই র‌্যাড সরঞ্জাম হিসাবে বিবেচনা করতে পারবেন (যদি এটি ভিবি.এনইটের মতো সি # ভাবতে সহায়তা করে তবে এটি করুন, বাক্য গঠনটি কেবল সামান্য ভিন্ন, এবং আমার ভিবি ব্যবহারের পুরানো দিনগুলি আমাকে আরএড বিকাশের জন্য সঠিক মানসিকতায় নিয়ে যায়)। একমাত্র কঠিন বিটটি আপনাকে নির্ধারণ করতে পারে যে বিশাল। নেট লাইব্রেরিগুলির মধ্যে আপনার কোনটি ব্যবহার করা উচিত। গুগল এখানে অবশ্যই আপনার বন্ধু!


1
অন্তর্নিহিত ডেটা ভাগ করার জন্য কোনও অবজেক্টকে কোনও রুটিনে পৌঁছে দেওয়া সি # তে কমপক্ষে একটি সিনট্যাক্স দৃষ্টিকোণ থেকে পুরোপুরি ঠিক fine
ব্রায়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.