লিংকডলিস্ট প্রসারিত স্ট্যাক। লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন?


13

অ্যাড_ফেষ্ট (), অ্যাড_লাস্ট (), অ্যাড_ফর্টার (), রিলিজ_ফার্স্ট (), রিমুভালস্ট () এবং রিমুভ () অপসারণের মতো ফাংশনগুলির সাথে একটি শ্রেণিবদ্ধ লিঙ্কলিস্ট বিদ্যমান রয়েছে

এখন এখানে একটি শ্রেণিবদ্ধ স্ট্যাক রয়েছে যা পুশ (), পপ (), পিক () বা শীর্ষ () শীর্ষক কার্যকারিতা সরবরাহ করে এবং এই পদ্ধতিগুলি বাস্তবায়নের জন্য এটি লিংকডলিস্ট শ্রেণির পদ্ধতিগুলি প্রসারিত করে। এটি কি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন?

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

এছাড়াও, লঙ্ঘন না হলে, এই খারাপ নকশা? এবং কীভাবে আপনি লিংকডলিস্ট ক্লাস ব্যবহার করে স্ট্যাক কার্যকারিতা বাস্তবায়ন করবেন?


6
প্রশ্নটি কোনও শ্রেণীর নিজের তালিকার একটি সাবক্লাস হিসাবে সংজ্ঞায়িত করার অসুবিধা কী হবে? কিছুটা ভিন্ন সমস্যা সম্পর্কে জিজ্ঞাসা করে, তবে বেশিরভাগ উত্তর এখানেও প্রয়োগ হয়: আপনি তালিকা থেকে উত্তরাধিকারী হওয়ার চেয়ে ব্যক্তিগত সদস্য হিসাবে একটি তালিকা দিয়ে স্ট্যাক তৈরি করা ভাল of
আমন

7
হ্যাঁ এটি একটি খারাপ নকশা কারণ এটি আপনাকে স্ট্যাকের অভ্যন্তরীণ উপস্থাপনাটিকে লিঙ্কযুক্ত তালিকার বাইরে অন্য কোনও কিছুতে (যেমন একটি অ্যারে) পরিবর্তন করতে বাধা দেবে। আপনি অপারেশনগুলিও প্রকাশ করছেন যা স্ট্যাকগুলি সাধারণত সমর্থন করে না। উত্তরাধিকারের পরিবর্তে রচনা ব্যবহার করুন।
লি

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

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

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

উত্তর:


31

এখন এখানে একটি শ্রেণিবদ্ধ স্ট্যাক রয়েছে যা পুশ (), পপ (), পিক () বা শীর্ষ () শীর্ষক কার্যকারিতা সরবরাহ করে এবং এই পদ্ধতিগুলি বাস্তবায়নের জন্য এটি লিংকডলিস্ট শ্রেণির পদ্ধতিগুলি প্রসারিত করে। এটি কি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন?

না। এটি একটি উপ-টাইপ পদ্ধতি যুক্ত করা পুরোপুরি জরিমানা।

উদাহরণস্বরূপ, লিঙ্কযুক্ত তালিকার নবম অবস্থানে নোড যুক্ত করতে কেস add_ after () কে বিবেচনা করুন। এটি বেস ক্লাসে করা যেতে পারে তবে স্ট্যাক ক্লাসে নয়।

এই হল LSP লঙ্ঘন। এলএসপি বলেছে যে কোনও প্রোগ্রামের পছন্দসই বৈশিষ্ট্যগুলি পরিবর্তন না করে সুপার টাইপের উদাহরণগুলির জন্য একটি উপ-টাইপের উদাহরণগুলি পরিবর্তিত হতে হবে। যদি উপ-প্রকারটি কোনও পদ্ধতি অপসারণ করে, তবে যে পদ্ধতিটি কল করে সেই কোডটি ক্র্যাশ হয়ে যাবে (বা NoMethodErrorসেই লাইন বরাবর একটি ব্যতিক্রম বা কিছু পেয়ে যাবে)। স্পষ্টতই, "ক্র্যাশ না করা" একটি পছন্দসই সম্পত্তি।

পোস্টকন্ডিশনগুলি কি এখানে দুর্বল হচ্ছে বা আপনি স্ট্যাকের শীর্ষে যুক্ত করতে add_ after () পদ্ধতিটি সংশোধন করছেন?

এই add_after()পদ্ধতিতে পদ্ধতিটি পরিবর্তন করা ইতিহাসের বিধি লঙ্ঘন (নিয়মের সবচেয়ে গুরুত্বপূর্ণ!) এবং এভাবে এলএসপির লঙ্ঘন স্থির করতে সহায়তা করে না।

এবং কীভাবে আপনি লিংকডলিস্ট ক্লাস ব্যবহার করে স্ট্যাক কার্যকারিতা বাস্তবায়ন করবেন?

রচনা ব্যবহার করে।

দ্রষ্টব্য: আমি উপরে যা কিছু লিখেছি তা কেবলমাত্র সেই ভাষাগুলিতে প্রযোজ্য যা সাব টাইপিং এবং সাবক্লাসিং বিভ্রান্ত করে! এলএসপি সাব- ক্লাসিং নয়, সাব টাইপিংয়ের বিষয়ে । একটি ভাষা যা দুই গুলান না করে, এটা পুরোপুরি করতে গ্রহণযোগ্য হবে Stackএকটি উপশ্রেণী LinkedList, যতদিন আপনি এটি একটি না উপপ্রকার এর LinkedList


9
ইতিহাসের বিধি কী? আমি এটি ইন্টারনেটে খুঁজে পেতে ব্যর্থ হয়েছি।
জাপাডলো

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

2
আমি মনে করি উইকিপিডিয়া নিবন্ধের ব্যাখ্যাটি যুক্তিসঙ্গতভাবে ভাল: উইকিপিডিয়া.org / উইকি / লিসকো_সুবিস্টিটিউশন_প্রিন্সিপাল তবে বরাবরের মতো, আপনার সত্যিকারের মূল উত্সটি পড়া উচিত।
জার্গ ডব্লু মিটাগ

@ জার্গডব্লিউমিটাগ: আমি যদিও "ইতিহাস" কী করবে বা কীভাবে পর্যবেক্ষণ করা হবে না সে সম্পর্কে তাদের চুক্তিতে গ্যারান্টি অন্তর্ভুক্ত করা যুক্তিসঙ্গত বলে মনে করব, তবে আমি মনে করি না যে প্রতিটি সুপারটাইপ পর্যবেক্ষণের প্রতিটি অনুক্রম তৈরি করতে সক্ষম হওয়া উচিত এটি উপ-টাইপের কোনও অবজেক্টে সম্ভব হতে পারে - কেবলমাত্র সুপারটাইপের নথিগুলি সম্ভবত এই সুপারটাইপের গ্রাহকরা এই ধরণের ক্রমগুলি পর্যবেক্ষণ করতে পারে document
সুপারক্যাট

1

যেহেতু সবকিছুই ইতিমধ্যে জার্গ ডব্লু মিটাগ দ্বারা সম্বোধন করা হয়েছিল, তাই আমি নিম্নলিখিত অংশটি সম্পর্কে কিছুটা বিশদভাবে জানিয়েছি:

পোস্টকন্ডিশনগুলি কি এখানে দুর্বল হচ্ছে বা আপনি স্ট্যাকের শীর্ষে যুক্ত করতে add_ after () পদ্ধতিটি সংশোধন করছেন?

মূলত, যখন কোনও প্রশ্নক্রমটি এলএসপি লঙ্ঘন করে কিনা এমন প্রশ্ন যখন আসে তখন এটি নির্ভর করে যে আপনি কোন চুক্তি পোষণ করেছেন তার উপর। সুতরাং, কি চুক্তি add_afterআছে? যদি এটি উত্তেজনাপূর্ণ শোনায় তবে "এন-তম অবস্থানে বা শীর্ষে নোড যুক্ত করুন", আপনি ভাল হওয়ার চেয়ে পোস্ট-শর্তটি পূরণ করা হয়, এলএসপি লঙ্ঘন হয় না। অন্যথায় এটি একটি এলএসপি লঙ্ঘন।

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