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


17

এই চিত্রটি ডোমেন-চালিত ডিজাইন এবং প্যাটার্নগুলি প্রয়োগ করা থেকে নেওয়া হয়েছে : সি # এবং .NET এর উদাহরণ সহ

এখানে চিত্র বর্ণনা লিখুন

এটি স্টেট প্যাটার্নের শ্রেণীর চিত্র যা যেখানে কোনও SalesOrderতার জীবনকালে বিভিন্ন রাজ্য থাকতে পারে। বিভিন্ন রাজ্যের মধ্যে কয়েকটি নির্দিষ্ট স্থানান্তরের অনুমতি রয়েছে।

এখন OrderStateক্লাসটি একটি abstractশ্রেণি এবং এর সমস্ত পদ্ধতি তার সাবক্লাসে উত্তরাধিকার সূত্রে প্রাপ্ত। যদি আমরা সাবক্লাসটি বিবেচনা করি Cancelledযা একটি চূড়ান্ত রাষ্ট্র যা অন্য কোনও রাজ্যে কোনও রূপান্তর করার অনুমতি দেয় না, তবে আমাদের overrideএই শ্রেণীর সমস্ত পদ্ধতি অবলম্বন করতে হবে।

এখন এটি লিসকভের প্রতিস্থাপনের নীতি লঙ্ঘন করে না কেন যেহেতু একটি sublcass পিতামাতার আচরণ পরিবর্তন করতে পারে না? অ্যাবস্ট্রাক্ট ক্লাসটি কোনও ইন্টারফেসে পরিবর্তন করা কি এটি সংশোধন করে?
কিভাবে এই সংশোধন করা যেতে পারে?


অর্ডারস্টেটকে একটি কংক্রিট শ্রেণি হিসাবে পরিবর্তন করুন যা ডিফল্টরূপে তার সমস্ত পদ্ধতিতে "নটসপোর্টার্ড" ব্যতিক্রম ছুঁড়ে দেয়?
জেমস

আমি এই বইটি পড়িনি, তবে এটি আমার কাছে অদ্ভুত বলে মনে হয় যে অর্ডারস্টেটে বাতিল () রয়েছে এবং তারপরে বাতিল হওয়া অবস্থা রয়েছে, এটি আলাদা সাব টাইপ।
ইওফোরিক

@ ইউফোরিক কেন এটা অদ্ভুত? কলিং cancel()রাজ্যটিকে বাতিল করে দেয়।
সানগো

কিভাবে? অর্ডারস্টেটে আপনি বাতিলকে কীভাবে কল করতে পারেন, যখন সেলস অর্ডারতে রাষ্ট্রের উদাহরণ পরিবর্তিত হওয়ার কথা। আমার মনে হয় পুরো মডেলটি ভুল। আমি সম্পূর্ণ বাস্তবায়ন দেখতে চাই।
ইওফোরিক

উত্তর:


3

এই বিশেষ বাস্তবায়ন, হ্যাঁ। আপনি যদি বিমূর্ত প্রয়োগকারীদের পরিবর্তে রাজ্যগুলিকে কংক্রিট ক্লাস করেন তবে আপনি এ থেকে দূরে চলে যাবেন।

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

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

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

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

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


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

3
@ জিমি হোফা দুঃখিত, তবে আপনার সঠিক অর্থটি কী "আপনি যদি রাষ্ট্রগুলি বিমূর্ত বাস্তবায়নকারীদের পরিবর্তে কংক্রিট শ্রেণি তৈরি করেন তবে আপনি এ থেকে দূরে চলে যাবেন।" ?
সানগো

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

8

একটি sublcass পিতামাতার আচরণ পরিবর্তন করা উচিত নয়?

এটি এলএসপির একটি সাধারণ ভুল ব্যাখ্যা। একটি সাবক্লাস পিতামাতার আচরণের পরিবর্তন করতে পারে, যতক্ষণ না এটি পিতামাতার ধরণের ক্ষেত্রে সত্য থাকে।

উইকিপিডিয়ায় একটি দীর্ঘ দীর্ঘ ব্যাখ্যা আছে , যা এলএসপিকে লঙ্ঘন করবে এমন জিনিসগুলির পরামর্শ দিচ্ছে:

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

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

ব্যক্তিগতভাবে, আমি এটি মনে রাখা সহজতর বলে মনে করি: আমি যদি এমন পদ্ধতিতে প্যারামিটারটির দিকে তাকান যেটি টাইপ করে থাকে, তবে কি উপ-টাইপ বি পাশ করা কেউ আমার বিস্ময় প্রকাশ করবে? তারা যদি থাকে তবে এলএসপি লঙ্ঘন হচ্ছে।

একটি ব্যতিক্রম নিক্ষেপ করা কি অবাক? আসলে তা না. এটি এমন কিছু যা কোনও সময়ে ঘটতে পারে, আমি অর্ডারস্টেটে শিপ পদ্ধতিটি কল করছি বা মঞ্জুরিপ্রাপ্ত বা শিপড whether সুতরাং আমি এটির জন্য অ্যাকাউন্ট করতে হবে এবং এটি আসলে এলএসপির লঙ্ঘন নয়।

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

তবে আমি তখনও এই বিশেষ পরিস্থিতির জন্য রাজ্য প্যাটার্নটি ব্যবহার করব না। এর মতো কোনও ডোমেন অবজেক্টের অবস্থার চেয়ে কোনও অ্যাপ্লিকেশনের অবস্থার চেয়ে রাষ্ট্রীয় প্যাটার্ন অনেক বেশি উপযুক্ত।

সুতরাং, সংক্ষেপে বলতে গেলে, এটি স্টেট প্যাটার্নের একটি দুর্বল স্বীকৃতিযুক্ত উদাহরণ এবং আদেশের রাজ্য পরিচালনা করার জন্য বিশেষভাবে ভাল উপায় নয়। তবে এটি যুক্তিযুক্তভাবে এলএসপিকে লঙ্ঘন করে না। এবং রাষ্ট্রের প্যাটার্নটি এবং নিজেই, অবশ্যই তা করে না।


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

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

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

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

1
আমি CircleWithFixedCenterButMutableRadiusসম্ভাব্য এলএসপি লঙ্ঘন হিসাবে বিবেচনা করব যদি ভোক্তা চুক্তির জন্য ImmutablePointউল্লেখ করে যে X.equals(Y), গ্রাহকগণ যদি অবাধে ওয়াইয়ের জন্য এক্স এবং তার বিপরীতে থাকতে পারে, এবং অবশ্যই এইরকম শ্রেণিটি এমনভাবে ব্যবহার করা থেকে বিরত থাকতে হবে যাতে এই ধরনের প্রতিস্থাপন সমস্যার কারণ হতে পারে। প্রকারটি বৈধভাবে এটি সংজ্ঞায়িত করতে সক্ষম হতে পারে equalsযে সমস্ত দৃষ্টান্ত স্বতন্ত্র হিসাবে তুলনা করতে পারে, তবে এই জাতীয় আচরণ সম্ভবত এর কার্যকারিতা সীমাবদ্ধ করবে।
সুপারকেট

2

(এটি সি # এর দৃষ্টিকোণ থেকে লেখা হয়েছে, তাই কোনও পরীক্ষিত ব্যতিক্রম নেই))

এলএসপি সম্পর্কে উইকিপিডিয়া নিবন্ধ অনুসারে , এলএসপির অন্যতম শর্ত হ'ল:

সাব-টাইপের পদ্ধতিতে কোনও নতুন ব্যতিক্রম ছোঁড়া উচিত নয়, যেখানে ব্যতিক্রমগুলি নিজেই সুপারটাইপের পদ্ধতিগুলি দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমগুলির সাব-টাইপ।

এটা আপনার কীভাবে বোঝা উচিত? সুপারটাইপের পদ্ধতিগুলি বিমূর্ত হলে "সুপারটাইপের পদ্ধতিগুলি দ্বারা ব্যতীত ব্যতিক্রমগুলি" ঠিক কী? আমি মনে করি সেগুলি ব্যতিক্রমগুলিই নথিভুক্ত are ব্যতিক্রম যে supertype পদ্ধতি দ্বারা নিক্ষিপ্ত পারে।

এর অর্থ কী এটি যদি OrderState.Ship()"নিক্ষেপ করার মতো কিছু হিসাবে নথিভুক্ত হয়InvalidOperationException যদি এই ক্রিয়াকলাপটি বর্তমান অবস্থার দ্বারা সমর্থিত না হয় তবে তবে আমি মনে করি এই নকশাটি এলএসপি ভেঙে না। অন্যদিকে, যদি সুপারটাইপ পদ্ধতিগুলি এভাবে নথিভুক্ত না করা হয় তবে এলএসপি লঙ্ঘিত হয়।

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


আসলে এটিই আমাকে ভাবতে পাঠিয়েছিল। সাব ক্লাসগুলি যদি পিতামাতার মধ্যে সংজ্ঞায়িত ব্যতিক্রমগুলি ফেলে দেয় তবে এটি অবশ্যই এলএসপির লঙ্ঘন হতে হবে।
গানগো

আমি মনে করি যে এমন ভাষায় যেখানে ব্যতিক্রমগুলি পরীক্ষা করা হয় না, সেখানে নিক্ষেপ করা এলএসপির লঙ্ঘন নয়। এটি কেবল একটি ভাষার নিজস্ব ধারণা, যে কোনও সময় যে কোনও ব্যতিক্রম ছোঁড়া যায়। সুতরাং যে কোনও ক্লায়েন্ট কোড এর জন্য প্রস্তুত হওয়া উচিত।
জ্যাপাডলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.