প্রয়োগের পরিবর্তে ইন্টারফেস (উদাহরণস্বরূপ মানচিত্র) ব্যবহার করে একটি জাভা অবজেক্টকে কেন সংজ্ঞায়িত করুন (হ্যাশম্যাপ)


17

বেশিরভাগ জাভা কোডে, আমি দেখি লোকেরা জাভা অবজেক্টগুলি এই জাতীয়ভাবে ঘোষণা করে:

Map<String, String> hashMap = new HashMap<>();
List<String> list = new ArrayList<>();

পরিবর্তে:

HashMap<String, String> hashMap = new HashMap<>();
ArrayList<String> list = new ArrayList<>();

বাস্তবায়িতভাবে ব্যবহার করা যাচ্ছে না তার পরিবর্তে কেন ইন্টারফেসটি ব্যবহার করে জাভা অবজেক্টকে সংজ্ঞায়িত করার জন্য অগ্রাধিকার দেওয়া হচ্ছে?


উত্তর:


26

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

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

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


যখন আপনি একটি মানচিত্র অনুসারে বাছাই করা হয় প্রয়োজন, প্যারামিটার প্রকার হওয়া উচিত SortedMap, তাই না TreeMap
সেফালপড

@ আরিয়ান SortedMapহ'ল কয়েকটি বাস্তবায়নগুলির মধ্যে একটি যা অর্ডার দেওয়ার ক্ষেত্রে কাজ করে। এটি বিন্দু ছাড়াও। TreeMapকীটির প্রয়োগ Comparableবা Comparatorইন্টারফেস দেওয়া অনুসারে আইটেমগুলি অর্ডার করে ।
নীল

না, সোর্টার্ড ম্যাপ কোনও বাস্তবায়ন নয়, এটাই মূল বিষয়। এটি মানচিত্রের ইন্টারফেস যা কী অনুসারে বাছাই করে।
সেফালপড

1
@ আরিয়ান আহ আমি আপনার অর্থ বোঝাতে চাই। সত্য, এর চেয়ে ভাল সোর্টার্ড ম্যাপ যেহেতু এটি কার্যকর করার জন্য জোর করে না। আমি সঠিক সমন্বয় করব।
নীল

আসলে, একটি LinkedHashMapবাস্তবায়ন করে না SortedMap। একমাত্র উপশ্রেণী SortedMapহয় ConcurrentSkipListMapএবং TreeMap
bcorso

10

লেম্যানের কথায়:

একই কারণে বৈদ্যুতিক অ্যাপ্লিকেশন নির্মাতারা কেবল ছাঁকানো কেবলগুলি না দিয়ে বৈদ্যুতিক প্লাগগুলি দিয়ে তাদের পণ্যগুলি তৈরি করে এবং ঘরগুলি প্রাচীরের বাইরে ছিটিয়ে থাকা কেবলগুলি ছুলার পরিবর্তে প্রাচীরের সকেটগুলির সাথে আসে।

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

প্রাচীর সকেটের দৃষ্টিকোণ থেকে, আপনি কোনও টিভি সেট বা স্টেরিও প্লাগ করেন কিনা তা বিবেচ্য নয়।

এটি সরঞ্জাম এবং সকেট উভয়কে আরও দরকারী করে তোলে।

উদাহরণস্বরূপ এমন একটি পদ্ধতি গ্রহণ করুন যা মানচিত্রকে আর্গুমেন্ট হিসাবে গ্রহণ করে।

পদ্ধতিটি আপনাকে কোনও হ্যাশম্যাপ বা লিংকডহ্যাশম্যাপটি পাস না করেই কাজ করবে, যতক্ষণ না এটি মানচিত্রের একটি সাবক্লাস।

এটি লিসকভের প্রতিস্থাপনের নীতি

আপনার দেওয়া নমুনা কোডটিতে, এর অর্থ হল আপনি পরে কোনও কারণে হ্যাশের কংক্রিট বাস্তবায়ন পরিবর্তন করতে পারেন এবং আপনাকে বাকী কোডটি পরিবর্তন করতে হবে না।

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


4

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

উদাহরণস্বরূপ, আপনি যদি পরে জানতে পারেন যে আপনার সত্যিই একটি প্রয়োজন LinkedHashMap, তবে আপনি অন্য কোনও কোডকে প্রভাবিত না করে নিরাপদে সেই পরিবর্তন করতে পারেন।

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


3

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

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

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

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