লিসকভ প্রতিস্থাপনের নীতি লঙ্ঘন করা হলে কী ভুল হতে পারে?


27

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


6
আপনি যদি এলএসপি অনুসরণ না করেন তবে কী ভুল হতে পারে? সবচেয়ে খারাপ পরিস্থিতি: আপনি কোড-থুলহুকে তলব করবেন! ;)
হতাশ

1
মূল প্রশ্নটির লেখক হিসাবে, আমাকে যুক্ত করতে হবে যে এটি বেশ একাডেমিক প্রশ্ন ছিল। যদিও লঙ্ঘন কোডে ত্রুটি ঘটাতে পারে, তবে আমার কোনও গুরুতর ত্রুটি বা রক্ষণাবেক্ষণের সমস্যা হয়নি যা আমি এলএসপি লঙ্ঘন করতে পারি।
পল টি ডেভিস

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

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

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

উত্তর:


31

আমি মনে করি যে এই প্রশ্নটিতে এটি খুব ভালভাবে বলা হয়েছে যা একটি কারণ যে এত বেশি ভোট হয়েছিল।

এখন ক্লাস () কে কোন টাস্কে কল করার সময়, কলটি ব্যর্থ হয়ে যাওয়ার সম্ভাবনা রয়েছে যদি এটি প্রজেক্টটাস্কের সাথে শুরু করা স্ট্যাটাসযুক্ত থাকে, যখন এটি বেস টাস্ক না থাকলে তা না করে।

আপনি যদি কল্পনা করুন:

public void ProcessTaskAndClose(Task taskToProcess)
{
    taskToProcess.Execute();
    taskToProcess.DateProcessed = DateTime.Now;
    taskToProcess.Close();
}

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

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


এর অর্থ কি এই যে কোনও শিশু শ্রেণির নিজস্ব জনসাধারণ পদ্ধতি থাকতে পারে না যা অভিভাবক শ্রেণিতে ঘোষিত হয় না?
গানগো

@ সাঙ্গো: অগত্যা: এটি সম্ভব নয়, তবে এই পদ্ধতিগুলি বেস পয়েন্টার থেকে "অ্যাক্সেসযোগ্য" (বা রেফারেন্স বা ভেরিয়েবল বা আপনি যে ভাষা ব্যবহার করেন না কেন) এটি ব্যবহার করতে আপনার রান-টাইম টাইপের কিছু তথ্য দরকার আপনি যে ফাংশন কল করতে পারেন আগে। তবে এটি এমন একটি বিষয় যা ভাষার বাক্য গঠন এবং শব্দার্থবিদ্যার সাথে দৃ .়ভাবে সম্পর্কিত।
এমিলিও গারাভাগলিয়া

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

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

1
@ user949300 কোনও কাজই সফল করতে সফটওয়্যারটির সাফল্য তার মান, দীর্ঘমেয়াদী বা স্বল্প-মেয়াদী ব্যয়ের কোনও পরিমাপ নয়। নকশার নীতিগুলি সফ্টওয়্যারটির "কর্ম" না করার জন্য সফ্টওয়্যারটির দীর্ঘমেয়াদি ব্যয় হ্রাস করার জন্য নির্দেশিকা আনার চেষ্টা করা হয়। কোনও কাজের সমাধান প্রয়োগ করতে ব্যর্থ হওয়ার পরেও লোকেরা তার সমস্ত নীতিগুলি অনুসরণ করতে পারে, বা কোনওটিকে অনুসরণ না করে এবং একটি কার্যকর সমাধান বাস্তবায়ন করতে পারে। যদিও জাভা সংগ্রহগুলি অনেক লোকের পক্ষে কাজ করতে পারে, তার অর্থ এই নয় যে দীর্ঘমেয়াদে তাদের সাথে কাজ করার জন্য ব্যয় করা যতটা সস্তা হতে পারে।
জিমি হোফা

13

আপনি যদি বেস ক্লাসে সংজ্ঞায়িত চুক্তিটি পূরণ না করেন, ফলাফলগুলি বন্ধ হয়ে গেলে জিনিসগুলি নীরবে ব্যর্থ হতে পারে।

উইকিপিডিয়া রাজ্যে এলএসপি

  • পূর্ব শর্তগুলি উপ-টাইপে শক্তিশালী করা যায় না।
  • উপ-টাইপে পোস্টকন্ডিশনগুলি দুর্বল করা যায় না।
  • সুপারটাইপের আক্রমণকারীদের অবশ্যই একটি সাব টাইপে সংরক্ষণ করতে হবে।

এর মধ্যে যদি কেউ না ধরে থাকে তবে কলার এমন ফলাফল পাবেন যা তিনি আশা করেন না।


1
আপনি এটি প্রমাণ করতে কোন দৃ concrete় উদাহরণ চিন্তা করতে পারেন?
মার্ক বুথ

1
@ মার্কবুথ বৃত্ত-উপবৃত্ত / স্কোয়ার-আয়তক্ষেত্রের সমস্যা এটি প্রদর্শিত হতে পারে; : উইকিপিডিয়া নিবন্ধ একটি ভাল জায়গা শুরু করার en.wikipedia.org/wiki/Circle-ellipse_problem
এড হেস্টিংস

7

সাক্ষাত্কারের প্রশ্নগুলির ইতিহাস থেকে একটি ক্লাসিক কেস বিবেচনা করুন: আপনি উপবৃত্ত থেকে বৃত্তটি পেয়েছেন। কেন? কারণ অবশ্যই একটি চেনাশোনা IS-AN উপবৃত্তাকার, অবশ্যই!

ব্যতীত ... উপবৃত্তের দুটি ফাংশন রয়েছে:

Ellipse.set_alpha_radius(d)
Ellipse.set_beta_radius(d)

স্পষ্টতই, এগুলি অবশ্যই বৃত্তের জন্য পুনরায় সংজ্ঞায়িত করা উচিত, কারণ একটি বৃত্তের অভিন্ন ব্যাসার্ধ রয়েছে। আপনার দুটি সম্ভাবনা রয়েছে:

  1. Set_alpha_radius বা set_beta_radius কল করার পরে, উভয়ই একই পরিমাণে সেট করা আছে।
  2. Set_alpha_radius বা set_beta_radius কল করার পরে, অবজেক্টটি আর একটি বৃত্ত নয়।

বেশিরভাগ ওও ভাষাগুলি দ্বিতীয়টি সমর্থন করে না, এবং একটি ভাল কারণে: এটি অবাক করে অবাক হবেন যে আপনার বৃত্তটি আর একটি বৃত্ত নয়। সুতরাং প্রথম বিকল্পটি সেরা। তবে নিম্নলিখিত ফাংশনটি বিবেচনা করুন:

some_function(Ellipse byref e)

কল্পনা করুন যে কোনও_ফানশন কল করে e.set_alpha_radius। তবে যেহেতু ই সত্যই একটি বৃত্ত ছিল, এটি আশ্চর্যজনকভাবে এর বিটা ব্যাসার্ধটিও সেট করেছে।

এবং এর মধ্যে প্রতিস্থাপনের নীতি রয়েছে: একটি সাবক্লাস অবশ্যই একটি সুপারক্লাসের জন্য পরিবর্তনযোগ্য হতে হবে। অন্যথায় অবাক করা জিনিস হয়।


1
আমি মনে করি আপনি পরিবর্তনীয় জিনিসগুলি ব্যবহার করতে পারলে আপনি সমস্যার মধ্যে পড়তে পারেন। একটি বৃত্তও একটি উপবৃত্ত হয়। তবে আপনি যদি একটি উপবৃত্ত প্রতিস্থাপন করেন যা অন্য একটি উপবৃত্তের সাথে একটি বৃত্তও রয়েছে (যা আপনি সেটার পদ্ধতিটি ব্যবহার করে যা করছেন) নতুন উপবৃত্তটিও একটি বৃত্ত হবে এমন কোনও গ্যারান্টি নেই (বৃত্তগুলি উপবৃত্তের একটি উপযুক্ত উপসেট)।
জর্জিও

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

@ জর্জিও হ্যাঁ, আমার উল্লেখ করা উচিত ছিল যে এই সমস্যাটি কেবল পরিবর্তনীয় বস্তুর সাথেই ঘটে।
কাজ ড্রাগন

@ কাজড্রাগন: যখনই আমরা জানি যে উপবৃত্তটি একটি বৃত্ত নয়, তখন কেন কেউ একটি বৃত্তের সাথে একটি উপবৃত্তের বিকল্প রাখবেন? যদি কেউ এটি করে তবে তাদের যে মডেলগুলির মডেল করার চেষ্টা করছে সেগুলি সম্পর্কে তাদের সঠিক ধারণা নেই। কিন্তু এই প্রতিস্থাপনের অনুমতি দিয়ে, আমরা আমাদের সফ্টওয়্যারটিতে মডেল করার চেষ্টা করছি এবং এইভাবে খারাপ সফ্টওয়্যার কার্যকরভাবে তৈরি করতে আমরা অন্তর্নিহিত সিস্টেমটি সম্পর্কে looseিলে বুঝতে উত্সাহিত করছি না?
ম্যাভেরিক

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

6

সাধারণ মানুষের কথায়:

আপনার কোডে CASE / স্যুইচ ক্লজগুলির প্রচুর পরিমাণে ভয়ঙ্কর পরিমাণ থাকবে ।

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

এলএসপি কোডটিকে হার্ডওয়ারের মতো আরও কাজ করার অনুমতি দেয়:

আপনাকে আপনার আইপডটি পরিবর্তন করতে হবে না কারণ আপনি একটি নতুন জোড়া বাহ্যিক স্পিকার কিনেছেন, যেহেতু পুরানো এবং নতুন বহিরাগত স্পিকার উভয়ই একই ইন্টারফেসকে সম্মান করে, তারা আইপডটি পছন্দসই কার্যকারিতা হারাতে না পারার পরিবর্তে পরিবর্তনযোগ্য।


2
-1: চারপাশে খারাপ উত্তর
থমাস এডিং

3
@ থমাস আমি একমত নই এটি একটি ভাল উপমা। তিনি প্রত্যাশা ভঙ্গ না করার বিষয়ে কথা বলেন, এটিই এলএসপি সম্পর্কে। (যদিও কেস / স্যুইচ সম্পর্কে অংশটি কিছুটা দুর্বল, আমি সম্মত)
আন্দ্রেস এফ।

2
এবং তারপরে অ্যাপল সংযোগকারীগুলি পরিবর্তন করে এলএসপি ভেঙেছে। এই উত্তর বেঁচে আছে।
ম্যাগাস

এলএসপিতে স্যুইচ স্টেটমেন্টগুলির কী কী আছে তা আমি পাই না। typeof(someObject)আপনি যদি "কি করতে" অনুমোদিত তা স্থির করতে আপনি যদি স্যুইচিংয়ের কথা উল্লেখ করছেন, তবে নিশ্চিত, তবে এটি সম্পূর্ণরূপে অন্য একটি অ্যান্টি-প্যাটার্ন।
সারা

স্যুইচ স্টেটমেন্টের পরিমাণে একটি কঠোর হ্রাস হ'ল এলএসপির একটি পছন্দসই পার্শ্ব প্রতিক্রিয়া। যেহেতু বস্তুগুলি একই ইন্টারফেসটি প্রসারিত অন্য যে কোনও অবজেক্টের পক্ষে দাঁড়াতে পারে, তাই বিশেষ কেসগুলির যত্ন নেওয়ার প্রয়োজন নেই।
তুলাইনস কর্ডোভা

1

জাভা এর UndoManager সঙ্গে একটি বাস্তব জীবনের উদাহরণ দিতে

এটি AbstractUndoableEditযার উত্তরাধিকার সূত্রে উত্তরাধিকার সূত্রে উল্লেখ করে যে এটিতে 2 টি রাজ্য রয়েছে (পূর্বাবস্থায় ফেরানো হয়েছে) এবং একক কল করে undo()এবং তাদের মধ্যে যেতে পারেredo()

তবে UndoManager এর আরও রাজ্য রয়েছে এবং পূর্বাবস্থায় বাফারের মতো কাজ করে (প্রতিটি কল undoকিছুকে পূর্বাবস্থায় ফেলা যায় না তবে সমস্ত সম্পাদনা নয়, পোস্টকন্ডিশনকে দুর্বল করে দেয়)

এটি অনুমানমূলক পরিস্থিতির দিকে নিয়ে যায় যেখানে আপনি কোনও কম্পাউন্ডএডিতে একটি UndoManager যুক্ত করে তারপরে যেকোন কম্বাউন্ডএডিট-এ end()পূর্বাবস্থায় কল করার আগে এটি undo()আপনার সম্পাদনাগুলিকে আংশিকভাবে পূর্বাবস্থায় ফেলে রাখার পরে প্রতিটি সম্পাদনায় ডাকতে নেতৃত্ব দেয় will

UndoManagerএটি এড়াতে আমি আমার নিজের ঘূর্ণিত করেছি (আমার সম্ভবত এটির নতুন নামকরণ হওয়া উচিত UndoBuffer)


1

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

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


0

আপনি এটিকে মডেলিং দৃষ্টিকোণ থেকেও দেখতে পারেন। আপনি যখন বলেন যে ক্লাসের উদাহরণটিও বর্গের Aএকটি উদাহরণ, Bআপনি বোঝাচ্ছেন যে "শ্রেণীর উদাহরণের Aপর্যবেক্ষণযোগ্য আচরণকেও শ্রেণীর উদাহরণের পর্যবেক্ষণযোগ্য আচরণ হিসাবে শ্রেণিবদ্ধ করা যেতে পারে B" (ক্লাসের Bতুলনায় শ্রেণি কম নির্দিষ্ট থাকলে এটি কেবল সম্ভব ক্লাস A।)

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

কোনও ট্যাগ দিয়ে একটি বাক্স তৈরি করার মতো: "এই বাক্সটিতে কেবল নীল রঙের বল রয়েছে" এবং তারপরে একটি লাল বল ছুঁড়ে দেওয়া। ভুল তথ্য দেখায় যদি এই জাতীয় ট্যাগটির ব্যবহার কী?


0

আমি সম্প্রতি একটি কোডবেস উত্তরাধিকার সূত্রে পেয়েছি যাতে এতে কিছু বড় লিসকভ লঙ্ঘনকারী রয়েছে। গুরুত্বপূর্ণ ক্লাসে। এটি আমাকে প্রচুর পরিমাণে ব্যথা করেছে। কেন আমাকে ব্যাখ্যা করুন।

আমি Class Aযার থেকে উদ্ভব Class BClass Aএবং এমন Class Bএকটি গুচ্ছ ভাগ করে নিন Class Aযা এর নিজস্ব প্রয়োগের সাথে ওভাররাইড করে। সেট বা পেয়ে Class Aসম্পত্তি সেটিং বা থেকে সঠিক একই সম্পত্তি পেয়ে একটি ভিন্ন প্রভাব রয়েছে Class B

public Class A
{
    public virtual string Name
    {
        get; set;
    }
}

Class B : A
{
    public override string Name
    {
        get
        {
            return TranslateName(base.Name);
        }
        set
        {
            base.Name = value;
            FunctionWithSideEffects();
        }
    }
}

.NET এ অনুবাদ করার এটি সম্পূর্ণ ভয়ঙ্কর উপায় এই বিষয়টিকে একদিকে রেখে, এই কোডটি সহ আরও বেশ কয়েকটি সমস্যা রয়েছে।

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

কোডটি উভয়ের অবজেক্ট ব্যবহার করে Class Aএবং Class Bতাই আমি Class Aলোককে ব্যবহার করতে বাধ্য করার জন্য কেবল বিমূর্ততা তৈরি করতে পারি না Class B

কিছু খুব দরকারী ইউটিলিটি ফাংশন রয়েছে যা অপারেট করে Class Aএবং অন্যান্য খুব দরকারী ইউটিলিটি ফাংশন যা কাজ করে Class B। মূলত আমি কোনো ইউটিলিটি ফাংশন যা উপর কাজ করতে পারে ব্যবহার করতে সক্ষম হতে চাই Class Aউপর Class B। এটি কার্যকর করে এমন অনেকগুলি ফাংশন Class Bসহজেই গ্রহণ করতে পারে Class Aযদি এটি এলএসপি লঙ্ঘনের জন্য না হয়।

এর মধ্যে সবচেয়ে খারাপ বিষয়টি হ'ল এই বিশেষ কেসটি রিফ্যাক্টর করা সত্যিই শক্ত কারণ পুরো অ্যাপ্লিকেশনটি এই দুটি ক্লাসের উপর নির্ভর করে, উভয় ক্লাসে সমস্ত সময় পরিচালিত হয় এবং আমি যদি এটি পরিবর্তন করি তবে একশ উপায়ে ভেঙে যাব (যা আমি যা করতে যাচ্ছি) যাহাই হউক না কেন)।

এটি ঠিক করার জন্য আমাকে NameTranslatedযা করতে হবে তা হ'ল একটি সম্পত্তি তৈরি করা , যা সম্পত্তির Class Bসংস্করণ হবে Nameএবং খুব Nameনতুনভাবে আমার নতুন NameTranslatedসম্পত্তি ব্যবহার করার জন্য উত্পন্ন সম্পত্তিটির প্রতিটি রেফারেন্স পরিবর্তন করবে । যাইহোক, এমনকি এই উল্লেখগুলির মধ্যে একটিরও ভুল পাওয়া পুরো অ্যাপ্লিকেশনটি ফুরিয়ে যেতে পারে।

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


কি হবে যদি উদ্ভূত বর্গ আপনি যে একই নামের [যেমন একটি নেস্টেড বর্গ] এবং নতুন শনাক্তকারী নির্মিত ছিল জিনিস একটি ভিন্ন ধরনের সঙ্গে উত্তরাধিকারসূত্রে সম্পত্তি ছায়াবৃত্ত মধ্যে ঘটতে পারে BaseNameএবং TranslatedNameঅ্যাক্সেস করতে উভয় শ্রেণী-একটি শৈলী Nameএবং ক্লাস-বি মানে? তারপরে কোনও Nameবৈকল্পিকের অ্যাক্সেসের যে কোনও প্রয়াস Bসংকলক ত্রুটির সাথে প্রত্যাখ্যান করা হবে, যাতে আপনি নিশ্চিত করতে পারেন যে সমস্ত উল্লেখগুলি অন্য ফর্মগুলির মধ্যে একটিতে রূপান্তরিত হয়েছে।
সুপারক্যাট

আমি আর সেই জায়গায় কাজ করি না। এটি ঠিক করতে খুব বিশ্রী হত। :-)
স্টিফেন

-4

আপনি যদি এলএসপি লঙ্ঘন করার সমস্যাটি অনুভব করতে চান তবে ভাবেন যে আপনার যদি কেবল বেস ক্লাসের .dll / .jar থাকে (সোর্স কোড নেই) এবং আপনাকে নতুন উত্পন্ন শ্রেণি তৈরি করতে হবে। আপনি এই কাজটি কখনই শেষ করতে পারবেন না।


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