কী-ভ্যালু পেয়ারের মতো প্রাক-বিল্ট স্ট্রাকচারের চেয়ে আমি কখন 2-প্রপার্টি ক্লাস ব্যবহার করব?


31

প্রাক-বিল্ট জেনেরিক স্ট্রাকচার যেমন একটি KeyValuePairবা এ ব্যবহার করার পরিবর্তে আপনার নিজের শ্রেণিতে কী / মান ধরণের ডেটা রাখা উচিত Tuple?

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

আমি বর্তমানে এমন কিছুতে কাজ করছি যা ব্যবহার করে iCalendarএবং নির্বাচিত ব্যবহারকারীর ডেটা শেষ পর্যন্ত এক key1=value1;key2=value2;ধরণের স্ট্রিংয়ের সাথে মিলিত হয় । আমি ডেটা একটিতে রেখে শুরু করেছিলাম KeyValuePair<string,string>, তবে এখন আমি ভাবছি যে এটির পরিবর্তে এটি নিজস্ব শ্রেণি হওয়া উচিত কিনা।

সামগ্রিকভাবে, KeyValuePair2-প্রপার্টি অবজেক্টের ওপরের মতো বিদ্যমান কাঠামো / শ্রেণি যেমন ব্যবহার করার সিদ্ধান্ত নেওয়ার সময় কী নির্দেশিকা ব্যবহৃত হয় এবং আপনি কী ধরনের পরিস্থিতিতে আপনি একে অপরের উপর ব্যবহার করবেন তা জানতে আগ্রহী।


3
কী ভাষা? পাইথনে, আমাদের এই দ্বিধা নেই, কারণ আমাদের tupleটাইপ রয়েছে।
এস .লট

3
@ এস.লট - .NET বিসিএল এর ভি 4.0 এর পরে টুপলস রয়েছে।
ওপড

1
.NET 4 এও টুপল টাইপ রয়েছে। msdn.microsoft.com/en-us/library/system.tuple.aspx
ডেভ নাই

1
@ ওডে এই ক্ষেত্রে, আমি এর সাথে কিছু নির্মাণ করছি iCalendarএবং আমি BYDAYএবং এর জন্য সামগ্রী চাইছিলাম BYSETPOS। এগুলি কম্বোবক্সে উপস্থিত হয়, তবে আসল উপাত্তগুলি পুনরাবৃত্ত নিয়মের স্ট্রিংয়ের সাথে একত্রিত করা হয়, যা স্ট্রিংয়ের একটি key=value;প্রকার
রাহেল

4
@ র্যাচেল: আরও নির্দিষ্ট হতে দয়া করে প্রশ্নটি আপডেট করুন। মন্তব্যগুলির একটি গুচ্ছ বিষয়গুলি পরিষ্কার করার সেরা উপায় নয়।
এস .লট

উত্তর:


26

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

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



3
@ বেএন - টিএফটিএফওয়াই । ।
ওয়াট বার্নেট

7

নতুন শ্রেণীর সংজ্ঞা দেওয়ার নিয়মটি সহজ: এটি "ওকামের রেজার" দ্বারা সংক্ষিপ্তসারিত হয়েছে।

http://c2.com/cgi/wiki?OccamsRazor

কোনও ভাল কারণ ছাড়াই নতুন ক্লাস চালু করবেন না। বা যতটা সম্ভব প্রাক-বিল্ট ক্লাস ব্যবহার করুন। বা যতটা সম্ভব আবিষ্কার করুন। তবে আপনি কম কোড লিখতে আরামদায়ক।

আপনি যদি প্রাক-বিল্ট ক্লাসটি ব্যবহার করতে পারেন তবে যদি আপনাকে অবজেক্টটির জন্য কিছু অনন্য দায়িত্ব অর্পণ করতে হয় এবং সেই দায়িত্বটি পূর্ব-নির্মিত শ্রেণিতে সংজ্ঞায়িত না হয়। প্রায়শই এটি একটি অনন্য পদ্ধতি।

tupleবা KeyValuePairপছন্দসই।

যতক্ষণ না।

আপনার কিছু কার্যকারিতা দরকার যা এ tupleবা এর অংশ নয় KeyValuePair। তারপরে আপনাকে নিজের ক্লাসটি নির্ধারণ করতে হবে।


3
" আপনি চুরি করতে পারেন তা কখনই ডিজাইন করবেন না " এটি আমার প্রিয় বাক্যগুলির প্রিয় উপায় সম্পর্কে।
সিঙ্গেল নেজেশন ইলিমিনেশন

1
আপনি কী শব্দার্থকে "কার্যকারিতা যে একটি tupleবা এর অংশ নয় KeyValuePair" হিসাবে বিবেচনা করবেন? কীভালিউপায়ার কমপক্ষে শব্দার্থবিজ্ঞানের কিছু সীমাবদ্ধ ফর্ম রয়েছে, তবে টিপলস খুব কমই করে (সম্ভবত সম্ভব হতে পারে, প্রসঙ্গের উপর নির্ভর করে) imho। একটি নতুন শ্রেণির সাথে পরিচয় করিয়ে দেওয়া অবশ্যই আপনাকে অবশ্যই স্পষ্ট শব্দার্থকতা দেবে।
মল রস

+1 কোনও প্লাগ ফিট করতে পারলে নালী টেপ সহ একটি নৌকায় পুরোটা প্যাচ করবেন না।
ইভান প্লেস

4
আমি মনে করি এটি ওকামের রেজারের একটি ভুল ব্যবহার। দ্বিতীয়ত ভেরিয়েবলের মধ্যে কী তথ্য রয়েছে তা জানা গুরুত্বপূর্ণ। -1।
বাঁকানো

4

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

 public class MyPair : Tuple<string, string>

আমি এটি পছন্দ করি কারণ MyPairটিপল মানগুলি কী এবং সেগুলির জন্য কী ব্যবহৃত হয় তা সংজ্ঞায়িত করে।
IAbstract

2
কিন্তু তখন আপনার সম্পত্তি বলা হবে Item1এবং Item2! পুরো ক্লাসটি সংজ্ঞায়িত করা কি এতটা সহজ নয়? public class SideStrings { public string Left { get; set; } public string Right { get; set; } }
কনফিগার

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

2
@ সাইন: তবে কী কথা? আপনার নিজের ক্লাস তৈরি করা টিউপল মোড়ানোর চেয়ে কম কাজ
কনফিগারকারী

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

4

এস। লট লিখেছেন

কোনও ভাল কারণ ছাড়াই নতুন ক্লাস চালু করবেন না। বা যতটা সম্ভব প্রাক-বিল্ট ক্লাস ব্যবহার করুন। যতটা সম্ভব উদ্ভাবন করুন।

প্রাক-বিল্ট ক্লাসে সংজ্ঞায়িত না হওয়া অবজেক্টটির জন্য যদি আপনাকে কিছু অনন্য দায়িত্ব অর্পণ করতে হয় তবে আপনি একটি প্রাক-নির্মিত শ্রেণি ব্যবহার করতে পারবেন না।

আমাকে কেন এটি নিয়ে গুরুতর সমস্যা আছে তা বলি। থেকে

কীভ্যালিউপায়ার [স্ট্রিং, স্ট্রিং]

মনে হচ্ছে ঠিক আছে .... কী কিভ্যালু [স্ট্রিং, কীভ্যালু [স্ট্রিং, কীভ্যালিউপায়ার [স্ট্রিং, স্ট্রিং]]] ঠিক আছে? আমি জানি না এস.লোট এটিকে কী বলবে, তবে আমার বস এটি ঠিক আছে বলে মনে করেন ।

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

পিএস আমি একটি আল্ট্রা_নুব তাই আমি ভুল হলে আমাকে বলুন।


2
আমি মনে করি যে KeyValuePair<string,string>এটি ঠিক আছে, ধরে নেওয়া জিনিসগুলি কী এবং মানগুলি বলে। আপনি লেখার কোড সংরক্ষণ করেন এবং আন্তঃআকক্ষীয়তা অর্জন করেন তাই এখানে একটি বিদ্যমান শ্রেণীর পুনরায় ব্যবহার করা একটি জয় ওটো, জটিল কিছু হিসাবে ব্যবহার KeyValuePair<string,KeyValuePair<string,string>>করা বেশিরভাগ সময় ব্যবহারিক হওয়া খুব জটিল too কখনও কখনও এটি সঠিক হতে পারে - যখন আপনার কোনও অতিরিক্ত কার্যকারিতা প্রয়োজন হয় না, যখন অর্থটি সুস্পষ্ট হয় এবং যখন এটি অন্যান্য শ্রেণীর সাথে সুন্দরভাবে কাজ করে। ওয়াইএমএমভি, এটি কেবল পেশাদার এবং বৈপরীত্যগুলির ওজন করছে।
maarartinus

আপনি যদি সি # ব্যবহার করছেন তবে এখানে টিপল বনাম কীভ্যালু পেয়ারের পারফর্মেন্স । কিছু আপনি নিজের বসের সাথে ভাগ করতে চান?
বেন

3

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

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

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

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


3

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


2

আমি সম্ভবত এখানে ওয়াইল্ডিংয়ের সাথে একমত হব , তবে তারপরেও আমি এই ধরণের জিনিসটিতে কিছুটা নুয়ে আছি।

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

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

সুতরাং আসল প্রশ্ন: আপনি কি ডেটা উপস্থাপন করছেন বা আপনি কোনও ব্যবস্থায় ডেটা ব্যবহার করছেন? (এবং আমি এই ধারণাগুলি একসাথে মিশ্রিত করার পরামর্শ দেব না)।

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

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