রিফ্যাক্টরিং স্যুইচ স্টেটমেন্টস এবং স্যুইচ স্টেটমেন্টগুলির আদৌ কোনও বাস্তব ব্যবহার আছে?


28

আমি এই নিবন্ধটি পড়ছিলাম এবং ভাবছিলাম, আমরা কি সমস্ত স্যুইচ বিবৃতিগুলি অভিধান বা কারখানার দ্বারা প্রতিস্থাপন করে এড়িয়ে চলে যাই যাতে আমার প্রকল্পগুলিতে কোনও সুইচ বিবৃতি না থাকে।

কিছু যথেষ্ট যোগ হয়নি।

প্রশ্নটি হ'ল, স্যুইচ স্টেটমেন্টগুলির কি সত্যিকারের ব্যবহার আছে বা আমরা কি এগিয়ে গিয়ে একটি অভিধান বা কারখানার পদ্ধতিতে সেগুলি প্রতিস্থাপন করি (কারখানার পদ্ধতি ব্যবহার করার ক্ষেত্রে অবশ্যই অবজেক্ট তৈরির ক্ষেত্রে ন্যূনতম স্যুইচ স্টেটমেন্টের ব্যবহার থাকতে হবে) কারখানাটি ব্যবহার করছি ... তবে এটি প্রায়)।


10
আপনি কোনও কারখানা বাস্তবায়ন করে ধরে নিচ্ছেন, কোন ধরণের অবজেক্ট তৈরি করবেন তা আপনি কীভাবে সিদ্ধান্ত নেবেন?
কোডার্ট


@ কোড ওয়ার্কস: কোন কংক্রিট প্রয়োগ করা উচিত তা স্থির করে আমার অবশ্যই কোথাও শর্ত থাকবে।
কানিনি

@ কোড ওয়ার্কস: স্পষ্টতই ভার্চুয়াল কনস্ট্রাক্টর সহ। (এবং যদি আপনি সেভাবে কোনও কারখানার প্যাটার্ন বাস্তবায়ন করতে না পারেন তবে আপনার আরও ভাল ভাষার প্রয়োজন))
ম্যাসন হুইলারের

উত্তর:


44

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

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

যে কোনও হারে, সেরা সমাধান সর্বদা ক্ষেত্রে নির্ভরশীল dependent প্রশ্নটি হল: কোন বিকল্পটি আপনাকে দীর্ঘমেয়াদে ক্লিনার, আরও সংক্ষিপ্ত, আরও রক্ষণাবেক্ষণযোগ্য কোড দেয়?

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

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

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

* আমি এখানে "ওও" শব্দটি আলগাভাবে ব্যবহার করি; "আসল" বা "খাঁটি" ওও কী, তা নিয়ে আমি ধারণাগত বিতর্কে আগ্রহী নই।


4
+1 টি। এছাড়াও, এই সুপারিশগুলিকে শব্দযুক্ত করার প্রবণতা রয়েছে, " স্যুইচ করার পক্ষে বহুবর্ষকে পছন্দ করুন " এবং এটি এই উত্তরের সাথে মিল রেখে খুব ভাল শব্দ পছন্দ। এটি স্বীকার করে যে এমন পরিস্থিতিতে রয়েছে যেখানে কোনও দায়িত্বশীল কোডার অন্য পছন্দ করতে পারে।
কার্ল ম্যানাস্টার

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

14

এখানেই আমি ডায়নোসর হয়ে ফিরে যাই ...

স্যুইচ স্টেটমেন্টগুলি তাদের নিজেদের মধ্যে খারাপ নয়, এটি তাদের ব্যবহার যা এটি সমস্যার মধ্যে রয়েছে।

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

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

আমি মনে করি এটি পুনরাবৃত্তি এড়ানো এবং এটি নিশ্চিত করা যে আমরা আমাদের জায়গাগুলির গ্রাফগুলি সঠিক জায়গায় রচনা করছি তা নিশ্চিত করার একটি প্রশ্ন।

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

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


4
আমার একজন শিক্ষক ছিলেন যিনি বলেছিলেন যে আদর্শ কোডটি লিখতে হবে "যাতে যে প্রোগ্রামিং সম্পর্কে কিছুই জানত না (যেমন আপনার মা সম্ভবত) এটি বুঝতে পারে।" দুর্ভাগ্যক্রমে এটি একটি আদর্শ, তবে সম্ভবত আমাদের কোডগুলি পর্যালোচনাগুলিতে অন্তর্ভুক্ত করা উচিত!
মাইকেল কে

"+1" এর জন্য তবে আপনি যদি কোডের একক লাইনে এসে
পৌঁছান

8

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

মূলত, আমাদের ধরণের (ক্লাস) এবং ফাংশন (পদ্ধতি) রয়েছে। আমরা কীভাবে স্টাফ কোড করব যাতে নতুন ধরণের বা নতুন পদ্ধতি যুক্ত করা সহজ হয়?

আপনি যদি ওও স্টাইলে প্রোগ্রাম করেন তবে একটি নতুন পদ্ধতি যুক্ত করা শক্ত (যেহেতু এটি বিদ্যমান সমস্ত ক্লাসকে রিফেক্টর করার অর্থ) তবে এটি খুব সহজ নতুন ক্লাসগুলিতে যুক্ত করা যা আগের মতো একই পদ্ধতি ব্যবহার করে।

অন্যদিকে, আপনি যদি একটি স্যুইচ স্টেটমেন্ট ব্যবহার করেন (বা এর ওও সমতুল্য, পর্যবেক্ষক প্যাটার্ন) তবে এটি নতুন ফাংশন যুক্ত করা খুব সহজ তবে নতুন ক্ষেত্রে / শ্রেণি যুক্ত করা শক্ত hard

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


4
আমার প্রকল্পগুলিতে কোনও সুইচ স্টেটমেন্ট না থাকায় আমরা কি অভিধান বা কারখানার পরিবর্তে সমস্ত স্যুইচ বিবৃতিগুলি এড়াতে পারি?

না। এই ধরণের বিরলতা খুব কমই একটি ভাল ধারণা।

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


এবং প্রকৃতপক্ষে, আপনি যদি কারখানা এবং অভিধান এবং অনুসন্ধানটি তালিকাভুক্ত না করেন তবে এটি মূলত একটি সুইচ বিবৃতি হিসাবে দেখাবে: যদি অ্যারে [হ্যাশ (অনুসন্ধান)] তবে অ্যারে [হ্যাশ (অনুসন্ধান)] কল করুন call যদিও এটি রানটাইম-প্রসারণযোগ্য হবে যা সংকলিত সুইচগুলি নয়।
Zan Lynx

@ জ্যানলিনেক্স, সম্পূর্ণ বিপরীতটি সত্য, কমপক্ষে সি # দিয়ে। আপনি যদি তুচ্ছ-স্বল্প সুইচ স্টেটমেন্টের জন্য উত্পাদিত আইএলটি লক্ষ্য করেন তবে আপনি সংকলকটিকে অভিধানে রূপান্তরিত করতে দেখবেন asএটি দ্রুত is
ডেভিড আরনো

@ ডেভিড আর্নো: "সম্পূর্ণ বিপরীত"? আমি যেভাবে এটি পড়েছি আমরা ঠিক একই জিনিসটি বলেছিলাম। কীভাবে এর বিপরীত হতে পারে?
জ্যান লিংস

2

এটি কীভাবে ভাষা-অজ্ঞানবাদী, ফল-থ্রো কোডটি switchবিবৃতি সহ সেরা কাজ করে :

switch(something) {
   case 1:
      foo();
   case 2:
      bar();
      baz();
      break;

   case 3:
      bang();
   default:
      bizzap();
      break;
}

খুব বিশ্রী ডিফল্ট কেসের ifসাথে সমান । এবং মনে রাখবেন যে যত বেশি পতন হচ্ছে, তত বেশি শর্তের তালিকাটি পাবেন:

if (1 == something) {
   foo();
}
if (1 == something || 2 == something) {
   bar();
   baz();
}
if (3 == something) {
   bang();
}
if (1 != something && 2 != something) {
   bizzap();
}

(তবে অন্যান্য উত্তরগুলির মধ্যে যা যা বলেছে তা দেওয়া, আমার মনে হচ্ছে আমি প্রশ্নের বিন্দুটি মিস করেছি ...)


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

1

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

tl; dr - এগুলি দরকারী, তবে প্রায়শই আপনি আরও ভাল করতে পারেন।


2
আমি সেখানে কিছু পক্ষপাত গন্ধ করছি - পলিম্যাফিক্স প্যাটার্ন মিলের চেয়ে আরও মার্জিত কেন? এবং আপনি কী ভাবেন যে এফপিতে পলিমারফিজম নেই?
টিডামাররা

@tdammers সবার আগে আমি বোঝাতে চাইনি যে এফপিতে বহুবর্ষের অস্তিত্ব নেই। হাস্কেল অ্যাডহক এবং প্যারামেট্রিক পলিমারফিজম সমর্থন করে। বীজগণিত ডেটাটাইপের জন্য প্যাটার্নের মিলটি অর্থবোধ করে। তবে বাহ্যিক মডিউলগুলির জন্য এটির জন্য এক্সপোজিং কনস্ট্রাক্টর প্রয়োজন। স্পষ্টতই এটি একটি বিমূর্ত ডেটা টাইপের (বীজগণিত ডেটাটাইপগুলি দিয়ে উপলব্ধি) এনক্যাপসুলেশনকে ভেঙে দেয়। সে কারণেই আমি অনুভব করি যে বহুবর্ষটি আরও মার্জিত (এবং এফপিতে সম্ভব)।
স্কার্ফ্রিজে 4'12

আপনি টাইপক্লাস এবং দৃষ্টান্তগুলির মাধ্যমে বহুবর্ষকে ভুলে যাচ্ছেন।
টিডামার্স 4'12

আপনি কি কখনও এক্সপ্রেশন সমস্যার কথা শুনেছেন ? ওও এবং এফপি বিভিন্ন পরিস্থিতিতে আরও ভাল, যদি আপনি এটি নিয়ে চিন্তা করা বন্ধ করেন।
hugomg

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