দৈত্য "স্যুইচ" বিবৃতিটির পরিবর্তে কেন ওও পদ্ধতির ব্যবহার করবেন?


59

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

সত্যিকার অর্থে এর বিরুদ্ধে আমার কোন যুক্তি নেই ... কারণ আমি জানি না তিনি কীসের বিরুদ্ধে কথা বলছেন।
সে ঠিক আছে?
সে কি কেবল তার পাছার কথা বলছে?
এখানে শুধু শেখার চেষ্টা করছি।


7
সংসদ কোডটি দেখতে এবং "সিপিইউ জাম্প টেবিল" সন্ধানের জন্য .NET রিফ্লেক্টর জাতীয় কিছু ব্যবহার করে আপনি যাচাই করতে পারেন।
হতাশ

5
Cpu 'র লাফ টেবিল "দ্য সুইচ বক্তব্য থেকে প্রনয়ন" "তাই বিশুদ্ধ-ভার্চুয়াল ফাংশন সঙ্গে ডিসপ্যাচিং খারাপ-কেস পদ্ধতি আছে কোনটি ভার্চুয়াল ফাংশন কেবল সরাসরি লিঙ্ক করা হয় আপনি তুলনা করতে কোন কোড ডাম্প করা হয়েছে।।?
S.Lott

64
কোডটি লোকদের জন্য মেশিনের জন্য নয়, অন্যথায় আমরা কেবল সমাবেশে সমস্ত কিছু করব।
maple_shaft

8
তিনি যদি এতটা আড়ম্বরপূর্ণ হন, তবে নথকে তাঁর কাছে উদ্ধৃতি দিয়ে বললেন: "আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলুন: অকালীন অপ্টিমাইজেশনই সমস্ত মন্দের মূল।"
ডেভি

12
Maintainability। একটি শব্দের উত্তর সহ অন্য কোনও প্রশ্ন আমি আপনাকে সাহায্য করতে পারি?
ম্যাট এলেন

উত্তর:


48

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

সম্পাদনা

বিল ওয়াগনার লিখেছেন:

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

EDIT2:

সুতরাং ... আপাতদৃষ্টিতে একটি স্যুইচ স্টেটমেন্টটি / অন্য বিবৃতিগুলির একগুণের চেয়ে দ্রুত এবং ভাল, কারণ একটি তুলনা লোগারিথমিক এবং অন্যটি লিনিয়ার। http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

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

আমি এখনও নিশ্চিত নই যে স্যুইচ স্টেটমেন্টটি আরও ভাল।


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

27
@ জোব যদি সে আসলে ঠিক থাকে? মোদ্দা কথাটি সে নয় যে সে ভুল, মূল বিষয়টি হ'ল তিনি সঠিক এবং এটি কোনও বিষয় নয়
রেন হেনরিচস

2
এমনকি যদি তিনি প্রায় 100% ক্ষেত্রে সঠিক হন তবে তিনি এখনও আমাদের সময় নষ্ট করছেন।
জেরেমি

6
আপনার লিঙ্ক করা পৃষ্ঠাটি পড়ার চেষ্টা করে আমার চোখ বন্ধ করতে চাই।
আক্রমণ

3
C ++ ঘৃণা কিসের? সি ++ সংকলকগুলি আরও ভাল হয়ে উঠছে, এবং বড় স্যুইচগুলি সি ++ তেও খারাপ, যেমন # #, এবং ঠিক একই কারণে। যদি আপনি প্রাক্তন সি ++ প্রোগ্রামারদের দ্বারা ঘিরে থাকেন তবে যারা আপনাকে দুঃখ দেয় এটি কারণ তারা সি ++ প্রোগ্রামার নয়, কারণ তারা খারাপ প্রোগ্রামার।
সেবাস্তিয়ান রেডল

39

আপনার সহকর্মী যদি প্রমাণ সরবরাহ করতে না পারে তবে এই পরিবর্তনটি পুরো প্রয়োগের স্কেলগুলিতে একটি আসল পরিমাপযোগ্য সুবিধা দেয়, এটি আপনার পদ্ধতির (যেমন পলিমারফিজম) থেকে নিকৃষ্টতর, যা আসলে এই জাতীয় সুবিধা দেয়: রক্ষণাবেক্ষণযোগ্যতা।

মাইক্রোপ্রটিমাইজেশন কেবলমাত্র বাধা হয়ে যাওয়ার পরে করা উচিত । অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল

গতি মাপের পরিমাণ। "অ্যাপ্রোচ এ এর ​​কাছে বি এর চেয়ে দ্রুতগতি" তে খুব কম দরকারী তথ্য রয়েছে। প্রশ্ন " কত দ্রুত? "


2
একেবারে সত্য. কখনও দাবি করবেন না যে কোনও কিছু দ্রুত, সর্বদা পরিমাপ করুন। এবং মাপুন কেবল তখনই যখন অ্যাপ্লিকেশনটির অংশটি পারফরম্যান্সের বাধা।
কিলিয়ান ফথ

6
-১ এর জন্য "অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল"। দয়া করে নাথের মতামতকে বৈষম্যমূলক একটি অংশ নয়, পুরো উক্তিটি প্রদর্শন করুন ।
বিকল্প 15

2
@ ম্যাথেপিক: আমি ইচ্ছাকৃতভাবে এটিকে উদ্ধৃতি হিসাবে উপস্থাপন করি নি। এই বাক্যটি যেমন আমার ব্যক্তিগত মতামত, যদিও তা অবশ্যই আমার সৃষ্টি নয়। যদিও এটি লক্ষণীয় হতে পারে যে সি 2 এর ছেলেরা কেবল সেই অংশটিকে মূল প্রজ্ঞা হিসাবে বিবেচনা করেছে।
back2dos

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

2
@ মারকজে 97% সময়
বিকল্প

27

তাড়াতাড়ি হলে কে পাত্তা দেয়?

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

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

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

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


1
অকাল অপটিমাইজেশনের একটি বিশাল উদাহরণ।
শানেসি

অবশ্যই এটি।
ডেড এমএমজি

'একটি জায়ান্ট সুইচ বিবৃতি এমনকি সামান্য রক্ষণাবেক্ষণযোগ্য নয়' এর জন্য +1
কোরি হিন্টন

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

14

স্যুইচ বিবৃতি থেকে দূরে সরে ...

এই জাতীয় স্যুইচ স্টেটমেন্টটি প্লেগের মতো ফেলে দেওয়া উচিত কারণ এটি ওপেন ক্লোজড নীতি লঙ্ঘন করে । এটি নতুন কোড যুক্ত করার পরিবর্তে নতুন কার্যকারিতা যুক্ত করার প্রয়োজন হলে এটি দলকে বিদ্যমান কোডে পরিবর্তন করতে বাধ্য করে।


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

3
ওসিপি লঙ্ঘন না করে যদি আপনাকে ওও দৃষ্টান্তে বিদ্যমান ধরনেরগুলিতে আরও ক্রিয়াকলাপ যুক্ত করার দরকার হয় তবে আমি বিশ্বাস করি এটিই দর্শকের প্যাটার্ন।
স্কট হুইটলক

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

8
@ মার্টিন: আপনি কি কখনও পার্সার লিখেছেন? বড় স্যুইচ-কেসগুলি পাওয়া খুব সাধারণ বিষয় যা লুকোহেড বাফারের পরবর্তী টোকেনটিতে স্যুইচ করে। আপনি পরবর্তী টোকেনে ভার্চুয়াল ফাংশন কলগুলির সাহায্যে সেই স্যুইচগুলি প্রতিস্থাপন করতে পারেন তবে এটি একটি রক্ষণাবেক্ষণের দুঃস্বপ্ন। এটি বিরল, তবে কখনও কখনও স্যুইচ-কেসটি আসলে আরও ভাল পছন্দ, কারণ এটি এমন কোড রাখে যা খুব কাছাকাছি সময়ে একসাথে পড়া / পরিবর্তন করা উচিত।
নিকি

1
@ মার্টিন: আপনি "কখনই না", "কখনও" এবং "পপিকক" এর মতো শব্দ ব্যবহার করেছেন, তাই আমি ধরেই নিয়েছিলাম আপনি কেবল ব্যতিক্রম ছাড়া সব ক্ষেত্রেই কথা বলছেন, কেবলমাত্র সাধারণ ক্ষেত্রে নয়। (এবং বিটিডাব্লু: লোকেরা এখনও হাত দিয়ে পার্সার লিখেন example উদাহরণস্বরূপ, সিপিথন
পার্সারটি

8

আমি বিশাল স্যুইচ স্টেটমেন্ট দ্বারা চালিত বিশাল পরিসীমা রাষ্ট্র মেশিন হিসাবে পরিচিত দুঃস্বপ্ন থেকে বেঁচে গেছি। আরও খারাপ, আমার ক্ষেত্রে, এফএসএম তিনটি সি ++ ডিএলএল বিস্তৃত করেছিল এবং এটি বেশ স্পষ্ট ছিল কোডটি সি-তে পারদর্শী কেউ লিখেছিলেন was

আপনার যে মেট্রিকগুলির যত্ন নেওয়া উচিত তা হলেন:

  • পরিবর্তন আনার গতি
  • সমস্যাটি হওয়ার পরে এটির গতি

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

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

ওও ভাষার জন্য বৃহত্তর স্যুইচ স্টেটমেন্টে কী সমস্যা?

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

8

আমি পারফরম্যান্স যুক্তি কিনছি না; এটি কোড রক্ষণাবেক্ষণযোগ্যতা সম্পর্কে সমস্ত।

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

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


5

আপনি আমাকে বোঝাতে পারবেন না:

void action1()
{}

void action2()
{}

void action3()
{}

void action4()
{}

void doAction(int action)
{
    switch(action)
    {
        case 1: action1();break;
        case 2: action2();break;
        case 3: action3();break;
        case 4: action4();break;
    }
}

তুলনায় উল্লেখযোগ্যভাবে দ্রুত:

struct IAction
{
    virtual ~IAction() {}
    virtual void action() = 0;
}

struct Action1: public IAction
{
    virtual void action()    { }
}

struct Action2: public IAction
{
    virtual void action()    { }
}

struct Action3: public IAction
{
    virtual void action()    { }
}

struct Action4: public IAction
{
    virtual void action()    { }
}

void doAction(IAction& actionObject)
{
    actionObject.action();
}

অতিরিক্তভাবে ওও সংস্করণটি আরও বেশি রক্ষণাবেক্ষণযোগ্য।


8
কিছু জিনিসের জন্য এবং অল্প পরিমাণে ক্রিয়াকলাপের জন্য ওও সংস্করণটি অনেক বোকা। আইএ্যাকশন তৈরিতে কিছু মানকে রূপান্তর করতে এটির এক ধরণের কারখানা থাকতে হবে। অনেক ক্ষেত্রে কেবলমাত্র সেই মানটির পরিবর্তে এটি আরও অনেক বেশি পাঠযোগ্য।
Zan Lynx

@ জ্যান লিঙ্কস: আপনার যুক্তি খুব সাধারণ ic আইএাকশন অবজেক্টের তৈরি করা যেমন ক্রিয়া পূর্ণসংখ্যার পক্ষে পুনরুদ্ধার ঠিক ততটা কঠিন আর সহজ নয়। সুতরাং আমরা জেনেরিক উপায় ছাড়াই একটি সত্য কথোপকথন করতে পারি। একটি ক্যালকুলেটর বিবেচনা করুন। এখানে জটিলতার পার্থক্য কী? উত্তরটি শূন্য। সমস্ত ক্রিয়া প্রাক-তৈরি হিসাবে। আপনি ব্যবহারকারীর কাছ থেকে ইনপুট পাবেন এবং এটি ইতিমধ্যে একটি ক্রিয়া।
মার্টিন ইয়র্ক

3
@ মার্টিন: আপনি একটি জিইউআই ক্যালকুলেটর অ্যাপ্লিকেশন ধরে নিচ্ছেন। এর পরিবর্তে এম্বেড থাকা সিস্টেমে সি ++ এর জন্য লিখিত একটি কীবোর্ড ক্যালকুলেটর অ্যাপটি নেওয়া যাক। এখন আপনার কাছে একটি হার্ডওয়্যার রেজিস্টার থেকে একটি স্ক্যান-কোড পূর্ণসংখ্যা রয়েছে। এখন কম জটিল কি?
Zan Lynx 21

2
@ মার্টিন: আপনি দেখতে পাচ্ছেন না যে পূর্ণসংখ্যা -> দেখার সারণী -> নতুন অবজেক্ট তৈরি -> কল ভার্চুয়াল ফাংশনটি পূর্ণসংখ্যার -> স্যুইচ -> ফাংশনের চেয়ে আরও জটিল? কীভাবে দেখছেন না?
ঝ্যান লিংস

2
@ মার্টিন: সম্ভবত আমি করব। এরই মধ্যে আপনি কীভাবে আইএএকশন অবজেক্টটিকে কোনও সংক্ষিপ্ত থেকে কোনও লুকিং টেবিল ছাড়াই কল করতে কল করতে পারেন তা ব্যাখ্যা করুন ।
জ্যান লিংস

4

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

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


3

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


3

ওওপি কোডে একটি স্যুইচ স্টেটমেন্ট হারা ক্লাসগুলির একটি শক্তিশালী ইঙ্গিত

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


3

সাধারণত আমি "অকাল অপ্টিমাইজেশন" শব্দটি ঘৃণা করি তবে এটি এর পুনরুদ্ধার করে। উল্লেখ্য যে, Knuth ব্যবহার করতে ঠেলাঠেলি প্রেক্ষাপটে এই বিখ্যাত উদ্ধৃতি ব্যবহার করা মূল্য gotoঅনুক্রমে কোড গতি বাড়াতে মধ্যে বিবৃতির সমালোচনা এলাকায়। এটিই মূল বিষয়: সমালোচনামূলক পথ।

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

পক্ষপাতী switchযতটা সম্ভব বিবৃতি অবিশেষে একটি কোডবেস সর্বত্র (থাকুক বা না থাকুক কোন ভারী লোড পরিচালিত হয়) কি Knuth "পেনি ভিত্তিক এবং পাউন্ড-নির্বোধ" প্রোগ্রামার যারা সারাদিন বজায় রাখার জন্য তাদের "অপ্টিমাইজ সংগ্রাম ব্যয় কল ধ্রুপদী উদাহরণ "কোড যা পাউন্ডের উপর পেনিগুলি সংরক্ষণ করার চেষ্টা করার ফলে একটি ডিবাগিং দুঃস্বপ্নে পরিণত হয়েছে। এই জাতীয় কোড খুব কমই প্রথম স্থানে কার্যকর রাখার জন্য খুব কমই রক্ষণাবেক্ষণযোগ্য।

সে ঠিক আছে?

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

জাম্প টেবিলের ক্ষেত্রে এই ব্যয়টি না ভাবা বরং আরও অনুকূলিতকরণ বাধার ক্ষেত্রে আরও কার্যকর useful পলিমারফিজমের জন্য, কলিংটি Base.method()কম্পাইলারকে এটি জানার অনুমতি দেয় না methodযে ভার্চুয়াল, সিল না করে থাকলে এবং কোনটি ওভাররাইড করা যেতে পারে কোন ফাংশনটি আসলে শেষ হবে । যেহেতু এটি জানে না যে কোন ফাংশনটি আসলে আগাম ডাকা হবে, তাই এটি ফাংশন কলটি অপ্টিমাইজ করতে পারে না এবং অপ্টিমাইজেশান সিদ্ধান্ত নিতে আরও তথ্য ব্যবহার করতে পারে না, যেহেতু এটি আসলে জানে না যে কোন ফাংশনটিতে ডাকা হবে কোডটি সংকলিত হওয়ার সময়।

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

সে কি কেবল তার পাছার কথা বলছে?

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

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

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


2

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


1
সময় পরীক্ষার পাশাপাশি একটি কোড ডাম্প সি ++ (এবং সি #) পদ্ধতি কীভাবে প্রেরণে কাজ করে তা দেখাতে সহায়তা করে।
এস .লট

2

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

যেমন। আপনি একটি থেকে অন্যটিতে পরিবর্তন যদি হয় Dog, Catএবং Elephant, এবং কখনও কখনও Dogএবং Catএকই ক্ষেত্রে আছে, তবে আপনি তাদের উভয় একটি বিমূর্ত ক্লাস থেকে উত্তরাধিকার করতে পারেন DomesticAnimalএবং বিমূর্ত ক্লাসে ঐ ফাংশন করা।

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


একটি স্যুইচ এটির ডিফল্ট কেসের মাধ্যমেও আচরণের উত্তরাধিকারী হতে পারে। "... বেসওপ্রেসনভিসিটার বাড়ায়" "ডিফল্ট: বেসওপ্রেশন (নোড)"
স্যামুয়েল ড্যানিয়েলসন

0

"আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলুন: অকালীন অপ্টিমাইজেশন হ'ল সমস্ত মন্দের মূল"

ডোনাল্ড নুথ


0

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


1
"না" মিস? C #, না সব ফাংশান কল ভার্চুয়াল হয়। সি # জাভা নয়।
বেন ভয়েগট

0

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

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

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


0

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

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

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

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

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

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