পাবলিক পদ্ধতি থেকে হ্যাশ টেবিল ফিরিয়ে দেওয়ার ক্ষেত্রে কী সমস্যা এবং কখন তা করার অর্থ আসে?


9

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

যদি এটির কোনও সমস্যা থাকে তবে কোন পরিস্থিতিতে এটি করা বুদ্ধিমান?

ভাষা গতিশীল কিনা তার উপর নির্ভর করে এই প্রশ্নের উত্তর কীভাবে পরিবর্তিত হবে?

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

উত্তর:


11

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

  1. প্রথম এবং সর্বাধিক গুরুত্বপূর্ণ পয়েন্টটি হ'ল - রক্ষণাবেক্ষণ। কোডটি দেখে, কোনও নতুন প্রোগ্রামার কখনই বলতে পারবেন না যে পদ্ধতিটি কী কী মান ফিরে আসছে। যদি কোনও নতুন ব্যক্তি কোডটি দেখে এটি বুঝতে না পারে, যখনই কেউ সেই ডেটাতে আরও কী / মান যুক্ত করতে বা অ্যাপ্লিকেশনটি বাড়িয়ে তুলছে তখন কোডটি কার্যকর হবে না এবং ত্রুটিগুলির ঝুঁকিতে পড়বে না।

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

  3. আপনি HashMap<String,String>রিটার্নের বিবৃতিতে কোনও সংখ্যা (বয়স বলতে) যোগ করতে চান তবে আপনি জেনেরিকগুলি ব্যবহার করতে পারবেন না । আপনি যদি জেনেরিক ব্যবহার না করেন তবে আপনাকে বস্তুর মধ্যে প্রকৃত প্রকারের মধ্যে পিছনে পিছনে ফেলে দিতে হবে। আপনি যদি গতিশীল টাইপিং ব্যবহার করেন তবে এটি সংরক্ষণ করতে পারেন।

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

  5. যদি আপনি হ্যাশম্যাপটি রিটার্ন টাইপ হিসাবে ব্যবহার করতে চান এবং অপরিবর্তনীয় টাইপ ফিরিয়ে দেওয়া কঠিন হবে। তবে আপনি যদি কোনও ব্যবহারকারী নিজের ধরণের সংজ্ঞায়িত করেন তবে আপনি এটি নিয়ন্ত্রণ করতে পারেন।

রিটার্ন টাইপ হিসাবে হ্যাশম্যাপ ব্যবহার করা লোভনীয় হবে কারণ আপনি শুরুতে বেশ কয়েকটি ক্লাস তৈরি করা এড়াতে পারবেন তবে ভবিষ্যতে কোড বজায় রাখা এটি একটি দুঃস্বপ্ন হবে। অবজেক্ট ওরিয়েন্টেড !!!!


1
আপনি প্রশ্নটি সঠিকভাবে বুঝতে পেরেছেন বলে মনে হচ্ছে। ধন্যবাদ।
মুহাম্মদ হাসান খান

8

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

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

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

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

সম্পাদনা করুন - আপনি যখন গতিশীল ভাষার কথা বলছেন তখন এই উত্তরে উত্থাপিত বেশিরভাগ পয়েন্ট প্রয়োগ করা বন্ধ হয়ে যায় :)


ভাষা গতিশীল হলে কী হবে?
মুহাম্মদ হাসান খান

আমি গতিশীল ভাষাগুলিতে বিশেষজ্ঞ নই তাই সম্ভবত এর জন্য আরও ভাল উত্তর সরবরাহ করতে পারে অন্য কেউ। তবে আমি জানি যে গতিশীল ভাষাগুলি যে কোনওভাবেই টাইপ পরীক্ষা করে সংকলন করে না। তবে
সেক্ষেত্রে

3
@ হাসান খান: সেক্ষেত্রে হ্যাশটেবল এবং শ্রেণির উদাহরণের মধ্যে আসলে কোনও পার্থক্য নাও থাকতে পারে। উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট মধ্যে সমস্ত বস্তু হয় hashtables এবং object.property ঠিক অবজেক্ট হিসেবে একই কথা [ 'সম্পত্তি']
মাইকেল Borgwardt

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

7

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

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

সম্পাদনা :

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


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

অভিধানে ফেরার উদ্দেশ্য ছিল না। কীগুলি ডেটা নয় কোডের অংশ ছিল।
মুহাম্মদ হাসান খান

আসল প্রশ্নটি হ'ল 'আপনার সঠিক ধরন তৈরি করা উচিত' এর পিছনে যুক্তি। প্রশ্ন কেন?
মুহাম্মদ হাসান খান

2

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


প্রকৃতপক্ষে আপনার পরামর্শটি সঠিক তবে প্রশ্নটি হ্যাশ টেবিল ব্যবহার করার জন্য পছন্দ করার সাথে কী ভুল যখন শ্রেণিটি আরও ভাল পছন্দ হয়।
মুহাম্মদ হাসান খান

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