স্যুইচ / প্যাটার্ন ম্যাচিং ধারণা


151

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

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

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

যদিও সি # এর পক্ষে শেষ পর্যন্ত এই ধনীতার কিছুটা ধার করা [আহেমে] কাছে করা অন্তরঙ্গভাবে আমি রানটাইমের সময় কী করা যায় তা দেখছিলাম - উদাহরণস্বরূপ, কিছু বস্তুকে একসাথে ঠেকানো মোটামুটি সহজ:

var getRentPrice = new Switch<Vehicle, int>()
        .Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
        .Case<Bicycle>(30) // returns a constant
        .Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
        .Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
        .ElseThrow(); // or could use a Default(...) terminator

যেখানে getRentPrice হ'ল একটি ফানক <যানবাহন, int>।

[দ্রষ্টব্য - সম্ভবত স্যুইচ / কেসটি এখানে ভুল পদ রয়েছে ... তবে এটি ধারণাটি দেখায়]

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

আমি যদি কেবল লোকেরা মনে করি উপরের মতো নির্মাণ (ভাষা সহায়তার অভাবে) থেকে অনেক বেশি উপকার পাওয়া যায় তবে আমি গেজ করার চেষ্টা করছি?

অতিরিক্ত হিসাবে নোট করুন যে আমি উপরের 3 টি ভেরিয়েন্টের সাথে খেলছি:

  • মূল্যায়নের জন্য একটি ফানক <টিএসসোর্স, টিভিয়াল্য> সংস্করণ - সংমিশ্রিত ত্রৈমাসিকের শর্তসাপেক্ষ বিবৃতিগুলির সাথে তুলনীয়
  • একটি অ্যাকশন << উত্স> সংস্করণ - সাথে তুলনাযোগ্য / অন্যথায় যদি / অন্যথায় / অন্যথায় যদি / অন্য কিছু হয়
  • একটি এক্সপ্রেশন <ফানক <টিসোর্স, টিভি >> সংস্করণ - প্রথম হিসাবে, তবে নির্বিচারে লিনকিউ সরবরাহকারীদের দ্বারা ব্যবহারযোগ্য

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

আমি উপরের যে কোনও ধারণা / ইনপুট / সমালোচনা / ইত্যাদিকে স্বাগত জানাই (বা আরও সমৃদ্ধ সি # ভাষা সহায়তার সম্ভাবনার উপর ... এখানে আশা করি ;- পি)।


"লোকেরা যদি মনে করে উপরের মত নির্মাণের (ভাষা সহায়তার অভাবে) এর থেকে আরও বেশি উপকার পাওয়া যায় তবে আমি কেবলমাত্র गेজ করার চেষ্টা করছি?" আইএমএইচও, হ্যাঁ অনুরূপ কিছু ইতিমধ্যে বিদ্যমান নেই? যদি তা না হয় তবে একটি হালকা ওজনের লাইব্রেরি লিখতে উত্সাহিত বোধ করুন।
কনরাড রুডল্ফ

10
আপনি ভিবি। নেট ব্যবহার করতে পারেন যা এটির সিলেক্ট কেস স্টেটমেন্টে এটি সমর্থন করে। ওহো!
জিম বার্গার

আমি আমার নিজস্ব শিং টোট করব এবং আমার লাইব্রেরিতে একটি লিঙ্ক যুক্ত করব: ফাংশনাল-ডটনেট
আলেক্সি রোমানভ

1
আমি এই ধারণাটি পছন্দ করি এবং এটি একটি খুব সুন্দর এবং একটি স্যুইচ-কেসের আরও নমনীয় ফর্ম তৈরি করে; তবে, লিনক-এর মতো সিনট্যাক্সকে যদি-তবে মোড়ক হিসাবে ব্যবহার করার পক্ষে এটি কি কোনও শোভিত উপায় নয়? আমি সত্যিকারের চুক্তির স্থানে কাউকে এটি ব্যবহার থেকে নিরুৎসাহিত করব, অর্থাত্ একটি switch-caseবিবৃতি। আমাকে ভুল করবেন না, আমি মনে করি এটির জায়গা আছে এবং আমি সম্ভবত এটি প্রয়োগ করার উপায় খুঁজব।
IAbstract

2
যদিও এই প্রশ্নটি দুই বছরেরও বেশি পুরানো, এটি উল্লেখ করা প্রাসঙ্গিক বলে মনে হচ্ছে যে সি # 7 শীঘ্রই প্রকাশিত হচ্ছে (প্যাটার্ন) প্যাটার্ন ম্যাচিংয়ের ক্ষমতা সহ।
Abion47

উত্তর:


22

আমি জানি এটি একটি পুরানো বিষয়, তবে সি # 7 এ আপনি এটি করতে পারেন:

switch(shape)
{
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("<unknown shape>");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));
}

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

37

সি # তে এই জাতীয় "কার্যকরী" জিনিসগুলি করার চেষ্টা করার পরেও (এবং এটিতে কোনও বইয়ের চেষ্টা করার পরে) আমি এই সিদ্ধান্তে পৌঁছেছি যে না, কিছু ব্যতিক্রম ব্যতীত এ জাতীয় জিনিসগুলি খুব বেশি সহায়তা করে না।

মূল কারণ হ'ল এফ # এর মতো ভাষাগুলি এই বৈশিষ্ট্যগুলিকে প্রকৃতপক্ষে সমর্থন করার মাধ্যমে তাদের প্রচুর শক্তি অর্জন করে। "আপনি এটি করতে পারেন" না, "এটি সহজ, এটি পরিষ্কার, এটি প্রত্যাশিত"।

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

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

আমি সি # তে প্রায়শই (পুরো প্রকল্পগুলি) ব্যবহার করে যা শেষ করেছি:

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

** তবে মনে রাখবেন: স্বয়ংক্রিয় জেনারালাইজেশন এবং টাইপ অনুক্রমের অভাব এমনকি এই বৈশিষ্ট্যগুলির ব্যবহারকে বাধা দেয়। **

এই সমস্ত কিছু বলেছেন, যেমন একটি নির্দিষ্ট উদ্দেশ্যে অন্য একটি ছোট দলে, হ্যাঁ, আপনি সি # এর সাথে আটকে থাকলে সম্ভবত তারা সাহায্য করতে পারে perhaps তবে আমার অভিজ্ঞতায় তারা সাধারণত তাদের চেয়ে বেশি ঝামেলার মতো অনুভূত হয়েছিল - ওয়াইএমএমভি।

কিছু অন্যান্য লিঙ্ক:


25

যুক্তিযুক্তভাবে সি # টাইপটি স্যুইচ করা সহজ করে না বলে কারণ এটি মূলত একটি বস্তু-কেন্দ্রিক ভাষা এবং অবজেক্ট-ভিত্তিক ক্ষেত্রে এটি করার 'সঠিক' উপায়টি হ'ল যানবাহনে গেটরেন্টপ্রাইজ পদ্ধতিটি সংজ্ঞায়িত করা এবং এটি উত্পন্ন ক্লাসে ওভাররাইড করুন।

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

[সম্পাদনা: পারফরম্যান্স সম্পর্কে অংশটি সরানো হয়েছে যেমন মার্ক চিহ্নিত করেছে যে এটি সংক্ষিপ্ত-প্রচারিত হতে পারে]

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

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


1
প্রকৃতপক্ষে - আমার যে সংস্করণটি রয়েছে তা প্রতিনিধি এবং অভিব্যক্তি উভয় সংস্করণেই শর্ট সার্কিট করে। এক্সপ্রেশন সংস্করণটি একটি যৌগিক শর্তসাপেক্ষে সংকলিত হয়; প্রতিনিধি সংস্করণটি হ'ল পূর্বাভাস এবং ফানক / ক্রিয়াকলাপগুলির একটি সেট - এটির সাথে ম্যাচ হয়ে গেলে এটি বন্ধ হয়ে যায়।
মার্ক গ্রেভেল

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

22

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

এটি কোনও সি # ভাষার বৈশিষ্ট্য হওয়ার সম্ভাবনা থাকলে আমার সন্দেহ নেই (সন্দেহজনক মনে হয় তবে ভবিষ্যত কে দেখতে পারে?)।

রেফারেন্সের জন্য, সম্পর্কিত F # প্রায়:

let getRentPrice (v : Vehicle) = 
    match v with
    | :? Motorcycle as bike -> 100 + bike.Cylinders * 10
    | :? Bicycle -> 30
    | :? Car as car when car.EngineType = Diesel -> 220 + car.Doors * 20
    | :? Car as car when car.EngineType = Gasoline -> 200 + car.Doors * 20
    | _ -> failwith "blah"

ধরে নিচ্ছি যে আপনি লাইন বরাবর একটি শ্রেণিবিন্যাসকে সংজ্ঞায়িত করেছেন

type Vehicle() = class end

type Motorcycle(cyl : int) = 
    inherit Vehicle()
    member this.Cylinders = cyl

type Bicycle() = inherit Vehicle()

type EngineType = Diesel | Gasoline

type Car(engType : EngineType, doors : int) = 
    inherit Vehicle()
    member this.EngineType = engType
    member this.Doors = doors

2
এফ # সংস্করণের জন্য ধন্যবাদ। আমি অনুমান করি যেভাবে এফ # এটি পরিচালনা করে তা আমি পছন্দ করি তবে আমি নিশ্চিত নই যে (সামগ্রিকভাবে) এফ # এই মুহুর্তে সঠিক পছন্দ, সুতরাং আমি সেই মাঝের মাটিতে হাঁটছি ...
মার্ক গ্র্যাভেল

13

আপনার প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ আমি মনে করি প্যাটার্নের সাথে মিলে যাওয়া সিনট্যাকটিক নির্মাণগুলি কার্যকর। আমি এর জন্য সি # তে সিনট্যাকটিক সমর্থনটি দেখতে চাই।

এখানে এমন একটি শ্রেণীর আমার বাস্তবায়ন যা আপনার বর্ণনা অনুযায়ী একই সিনট্যাক্স সরবরাহ করে (প্রায়)

public class PatternMatcher<Output>
{
    List<Tuple<Predicate<Object>, Func<Object, Output>>> cases = new List<Tuple<Predicate<object>,Func<object,Output>>>();

    public PatternMatcher() { }        

    public PatternMatcher<Output> Case(Predicate<Object> condition, Func<Object, Output> function)
    {
        cases.Add(new Tuple<Predicate<Object>, Func<Object, Output>>(condition, function));
        return this;
    }

    public PatternMatcher<Output> Case<T>(Predicate<T> condition, Func<T, Output> function)
    {
        return Case(
            o => o is T && condition((T)o), 
            o => function((T)o));
    }

    public PatternMatcher<Output> Case<T>(Func<T, Output> function)
    {
        return Case(
            o => o is T, 
            o => function((T)o));
    }

    public PatternMatcher<Output> Case<T>(Predicate<T> condition, Output o)
    {
        return Case(condition, x => o);
    }

    public PatternMatcher<Output> Case<T>(Output o)
    {
        return Case<T>(x => o);
    }

    public PatternMatcher<Output> Default(Func<Object, Output> function)
    {
        return Case(o => true, function);
    }

    public PatternMatcher<Output> Default(Output o)
    {
        return Default(x => o);
    }

    public Output Match(Object o)
    {
        foreach (var tuple in cases)
            if (tuple.Item1(o))
                return tuple.Item2(o);
        throw new Exception("Failed to match");
    }
}

এখানে কিছু পরীক্ষার কোড দেওয়া হল:

    public enum EngineType
    {
        Diesel,
        Gasoline
    }

    public class Bicycle
    {
        public int Cylinders;
    }

    public class Car
    {
        public EngineType EngineType;
        public int Doors;
    }

    public class MotorCycle
    {
        public int Cylinders;
    }

    public void Run()
    {
        var getRentPrice = new PatternMatcher<int>()
            .Case<MotorCycle>(bike => 100 + bike.Cylinders * 10) 
            .Case<Bicycle>(30) 
            .Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
            .Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
            .Default(0);

        var vehicles = new object[] {
            new Car { EngineType = EngineType.Diesel, Doors = 2 },
            new Car { EngineType = EngineType.Diesel, Doors = 4 },
            new Car { EngineType = EngineType.Gasoline, Doors = 3 },
            new Car { EngineType = EngineType.Gasoline, Doors = 5 },
            new Bicycle(),
            new MotorCycle { Cylinders = 2 },
            new MotorCycle { Cylinders = 3 },
        };

        foreach (var v in vehicles)
        {
            Console.WriteLine("Vehicle of type {0} costs {1} to rent", v.GetType(), getRentPrice.Match(v));
        }
    }

9

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

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

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

আমার বক্তব্যটি হ'ল, প্যাটার্ন ম্যাচিং টিকটি ভাষা নকশা এবং ডেটা মডেলের সাথে আবদ্ধ। এটি বলার পরেও, আমি বিশ্বাস করি না যে প্যাটার্ন মেলানো সি # এর একটি দরকারী বৈশিষ্ট্য কারণ এটি সাধারণ সি # সমস্যার সমাধান করে না বা এটি অত্যাবশ্যক প্রোগ্রামিং দৃষ্টান্তের মধ্যেও ঠিক ফিট করে না।


1
হতে পারে. প্রকৃতপক্ষে, কেন এটির প্রয়োজন হবে তার একটি দৃinc়প্রত্যয়ী "হত্যাকারী" যুক্তি নিয়ে ভাবতে আমি সংগ্রাম করব (ভাষাটিকে আরও জটিল করার ব্যয়ে "কয়েকটি প্রান্তের ক্ষেত্রে সম্ভবত দুর্দান্ত")।
মার্ক গ্র্যাভেল

5

আইএমএইচও এই জাতীয় কাজগুলি করার উপায় ভিজিটর ধরণ। আপনার ভিজিটর সদস্যের পদ্ধতিগুলি কেবল কেস কনস্ট্রাক্ট হিসাবে কাজ করে এবং আপনি ভাষাটিকে প্রকারভেদে "উঁকি" না দিয়ে উপযুক্ত প্রেরণটি পরিচালনা করতে দেন।


4

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


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

এটিও নোট করুন - এটি অগত্যা টাইপ-এ কোনও স্যুইচ নয় - এটি সংমিশ্রণীয় শর্তসাপেক্ষ হিসাবেও ব্যবহার করা যেতে পারে (এমনকি লিনকুইয়ের মাধ্যমেও) - তবে অগোছালো x => পরীক্ষা ছাড়াই? ফলাফল 1: (টেস্ট 2? ফলাফল 2: (টেস্ট3? ফলাফল 3: ফলাফল 4))
মার্ক গ্রাভেল

জেনে ভালো লাগলো , যদিও আমি প্রকৃত সংকলনের পারফরম্যান্সটি বোঝছিলাম: csc.exe কতক্ষণ সময় নেয় - আমি সি # এর সাথে যথেষ্ট পরিচিত নই যে এটি আসলেই কোনও সমস্যা কিনা তা জানার জন্য, তবে এটি সি ++ এর জন্য একটি বড় বিষয়।
সাইমন বুচান

সিসিএস এতে ঝাঁকুনি মারবে না - এটি লিনকিউ কীভাবে কাজ করে তার সাথে একই রকম, এবং লিনিক / এক্সটেনশন পদ্ধতিতে সি # 3.0 সংকলকটি বেশ ভাল
মার্ক মার্কেল

3

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

আপনার নির্দিষ্ট উদাহরণটি এমন কিছু করে যা আমি খুব দরকারী বলে মনে করি - টাইপ অনুসারে কেসের সমতুল্য কোনও সিনট্যাক্স নেই, যেমন (উদাহরণস্বরূপ) typeof(Motorcycle)ধ্রুবক নয়।

ডায়নামিক অ্যাপ্লিকেশনটিতে এটি আরও আকর্ষণীয় হয়ে ওঠে - আপনার যুক্তিটি এখানে 'নিয়ম-ইঞ্জিন' শৈলী সম্পাদন করে সহজেই ডেটা চালিত হতে পারে।


0

আমার লেখা, পাঠানো লাইব্রেরি ব্যবহার করে আপনি যা অর্জন করতে পারেন ওয়ানওফ

switch(এবং ifএবং exceptions as control flow) এর সবচেয়ে বড় সুবিধাটি হ'ল এটি সংকলন-সময় নিরাপদ - কোনও ডিফল্ট হ্যান্ডলার বা এর মধ্যে পড়ে না

   OneOf<Motorcycle, Bicycle, Car> vehicle = ... //assign from one of those types
   var getRentPrice = vehicle
        .Match(
            bike => 100 + bike.Cylinders * 10, // "bike" here is typed as Motorcycle
            bike => 30, // returns a constant
            car => car.EngineType.Match(
                diesel => 220 + car.Doors * 20
                petrol => 200 + car.Doors * 20
            )
        );

এটি নুগেটে রয়েছে এবং নেট 4511 এবং নেটস্ট্যান্ডার্ড1.6 লক্ষ্য করে

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