পারফরম্যান্সের পরিবর্তনগুলি কি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন করে?


14

বলুন আমার আছে:

interface Thing
{
    GetThing();
}

class FastThing : Thing 
{
    public int GetThing()
    {
        return 1;
    }
}

class SlowThing : Thing
{
    public int GetThing()
    {
        return GetThingFromDatabase();
    }
}

এটি কি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন?


GetThingFromDatabase()এই বিতর্কিত করতে যথেষ্ট ধীর নয়। Factor4096BitPublicKey();return 1;জিনিসগুলিকে কিছুটা আকর্ষণীয় করে তুলবে।
প্যাট্রিক


1
আপনি যদি এর সাথে প্রতিস্থাপন FastThingকরেন SlowThingতবে এলএসপি প্রয়োগ হয় না। যদি আপনি একটি মন্তব্য যুক্ত করেন Thing::GetThingযা "খুব দ্রুত" বলে মন্তব্য করে তবে প্রশ্নটি আলোচনা করা যেতে পারে।
সেফালপড

উত্তর:


14

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

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


3
পারফরম্যান্স কোনও প্রকার চেকের মাধ্যমে প্রয়োগযোগ্য কিছু নয়। এটি প্রয়োগকারী / গ্রন্থাগার রক্ষণাবেক্ষণকারীদের প্রতিশ্রুতি।
ডায়েটবুদ্ধ

3
আমি আমার জবাব স্পষ্টভাবে বলেছি?
ডেড এমএমজি

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

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

8

টিএল; ডিআর: না

মতে "ব্যবহারিক Subtyping Invariants এবং সীমাবদ্ধতাসমূহ ব্যবহার" (নীতির formalization) এটা প্রাথমিকভাবে একটি টাইপ বস্তুর "নিরাপত্তা" বৈশিষ্ট্য সাথে সংশ্লিষ্ট হয়। বৈশিষ্ট্য যা কেবলমাত্র তথ্যের প্রসঙ্গেই পরিবর্তনযোগ্যতা পরিচালনা করে। একটি অবজেক্টের ধরণটি তার পারফরম্যান্সের জন্য অর্থগোনাল। কাজেই পারফরম্যান্সের পার্থক্য লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন নয়।


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

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

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

6

ইন্টারফেসটি কী গ্যারান্টি দেয়? যেহেতু GetThingকোনও গ্যারান্টি দেয় না তাই সাব টাইপগুলির এটি সম্মানের দরকার নেই।

যদি ইন্টারফেসটি এমন কিছু ছিল GetThingInLinearTimeবা যদি বেস টাইপটি ভার্চুয়াল হয় এবং ডিফল্ট বাস্তবায়ন এক জটিলতা হয়, তবে সেই অ্যালগরিদমিক জটিলতা এলএসপি লঙ্ঘন করবে


4

সফটওয়্যারটির পারফরম্যান্সটির লিসকভ সাবস্টিটিউশন নীতিমালার সাথে কোনও সম্পর্ক নেই।

নীতিটি উপ-প্রকারের প্রতিস্থাপনের সাথে সম্পর্কিত এবং কেবলমাত্র ওওপি শর্তাবলী object বস্তুকে প্রতিস্থাপনের আচরণগত প্রভাবের সাথে।

getThing()উভয় ক্ষেত্রেই ইনপুট এবং আউটপুট একই থাকে এবং ধীর এবং দ্রুত উভয়ই একই স্থানে বস্তুগুলিকে রাখে।


1

লিসকভ সাবস্টিটিউশন নীতিমালা নিজেই বিশেষভাবে যা বলে তাতে কী আসে যায়? কোনও সাব টাইপ যদি সুপারটাইপের গ্রাহকের প্রত্যাশা লঙ্ঘন করে তবে এলএসপি আরও সীমাবদ্ধ কিনা তা বিবেচনা না করে খারাপ জিনিস বলে মনে হচ্ছে।

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

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


2
যতদূর আমি বলতে পারি, পোস্ট করা উদাহরণ জাভা নয়
gnat

0

চাচা বব খুব অনুরূপ প্রশ্নের উত্তর দিয়েছেন যেখানে তিনি বলেছেন যে এলএসপি লঙ্ঘনের জন্য তিনটি পক্ষ প্রয়োজন:

টাইপ টি, সাব টাইপ এস, এবং প্রোগ্রাম টি পি ব্যবহার করে তবে এস এর উদাহরণ দেওয়া হয় is

আমি একটি অনুমান venture যে এই প্রশ্নের এক তিনি উত্তর দিয়েছিলেন, যে এটা উল্লেখ করে না একটি অনুরূপ গঠন হয়েছে হবে পি যে ব্যবহার করছে টি এবং কি আচরণ পি প্রত্যাশা করে।

আপনি তার উত্তর এখানে পেতে পারেন । (আপনাকে কিছুটা নিচে স্ক্রোল করে রবার্ট মার্টিন নামের ব্যবহারকারীর কাছ থেকে উত্তর খুঁজতে হবে)


1
এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

@gnat প্রশ্ন যেমন জিজ্ঞাসা করা হয়েছে, অসম্পূর্ণ কারণ। এলএসপি লঙ্ঘন নির্ধারণ করতে 3 টি পক্ষের প্রয়োজন। যার মধ্যে তিনি কেবল দুটি দলের সরবরাহ করেছিলেন।
টিএমসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.