এমন কোনও ভাষা বা নকশার প্যাটার্ন রয়েছে যা কোনও শ্রেণিবদ্ধ শ্রেণিতে অবজেক্ট আচরণ বা বৈশিষ্ট্যগুলিকে * অপসারণ * করতে দেয়?


28

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

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

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

আরও চিন্তাভাবনা করার পরে, আমি বুঝতে পারি যে আমি লিসকভ সাবস্টিটিউশন নীতি সম্পর্কে ভুলে গেছি। এজন্য আপনি এটি করতে পারবেন না। ধরে নিই যে আপনি সমস্ত প্রধান "বৈশিষ্ট্য গোষ্ঠী" এর জন্য "বৈশিষ্ট্য / ইন্টারফেস" সংজ্ঞায়িত করেছেন, আপনি ক্রমবর্ধমান শ্রেণীর বিভিন্ন শাখায় নির্দ্বিধায় বৈশিষ্ট্যগুলি প্রয়োগ করতে পারেন, যেমন ফ্লাইডিং বৈশিষ্ট্যটি পাখি দ্বারা প্রয়োগ করা যেতে পারে এবং কিছু বিশেষ ধরনের কাঠবিড়ালি এবং মাছ ছিল।

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

এটি করার একটি উপায় হ'ল শুরু থেকেই আপনার সমস্ত বৈশিষ্ট্যকে জোড়ায় সংজ্ঞায়িত করা: ফ্লাইং এবং নটফ্লাইং (যা যদি অসমর্থিত অপারেশন এক্সেক্সশনকে নিক্ষেপ করে তবে এর বিরুদ্ধে পরীক্ষা করা না থাকলে)। নোট-বৈশিষ্ট্যটি কোনও নতুন ইন্টারফেস সংজ্ঞায়িত করবে না এবং কেবল এটির জন্য পরীক্ষা করা যেতে পারে। একটি "সস্তা" সমাধানের মতো মনে হয়, বিশেষত যদি শুরু থেকে ব্যবহৃত হয়।


3
'সর্বত্র কিছু ভয়ঙ্কর হ্যাক ব্যবহার না করে': আচরণকে অক্ষম করা একটি ভয়াবহ হ্যাক: এটি বোঝায় যে এটি function save_yourself_from_crashing_airplane(Bird b) { f.fly() }আরও অনেক জটিল হয়ে উঠবে। (পিটার তারেক যেমন বলেছিলেন, এটি এলএসপি লঙ্ঘন করে)
কেপলা

কৌশল প্যাটার্ন এবং উত্তরাধিকারের সংমিশ্রণ আপনাকে নির্দিষ্ট সুপার ধরণের জন্য উত্তরাধিকারসূত্রে প্রাপ্ত আচরণকে "রচনা ওভার" করতে দেয়? আপনি যখন বলেন: " it would be nice if one could define "exceptions" afterward, without having to use some horrible hacks everywhere"আপনি আচরণের নিয়ন্ত্রণের কোনও কারখানা পদ্ধতি হ্যাকি বিবেচনা করবেন?
স্টুপারউজার

1
একটি অবশ্যই একটি NotSupportedExceptionথেকে নিক্ষেপ করতে পারে Penguin.fly()
ফেলিক্স ডমব্যাক

যতদূর পর্যন্ত ভাষা যায়, আপনি অবশ্যই একটি শিশু শ্রেণিতে কোনও পদ্ধতি আন-প্রয়োগ করতে পারেন । উদাহরণস্বরূপ, রুবি মধ্যে: class Penguin < Bird; undef fly; end;। আপনার অন্য প্রশ্ন করা উচিত কিনা ।
নাথান লং

এটি লিসকোভ নীতিটি ভঙ্গ করবে এবং তাত্ক্ষণিকভাবে OOP এর পুরো পয়েন্টটি ভঙ্গ করবে।
ডেডালনিক্স

উত্তর:


17

অন্যরা যেমন উল্লেখ করেছে আপনাকে এলএসপির বিরুদ্ধে যেতে হবে।

তবে এটি যুক্তিযুক্ত হতে পারে যে একটি সাবক্লাসটি কেবল একটি সুপার ক্লাসের একটি স্বেচ্ছাসেবক এক্সটেনশন। এটি নিজস্ব অধিকারে একটি নতুন অবজেক্ট এবং সুপার ক্লাসের সাথে একমাত্র সম্পর্ক এটি একটি ভিত্তি ব্যবহার করেছে।

এই যৌক্তিক অর্থে করতে পারেন, বরং তারপর বলছে পেঙ্গুইন হয় একটি পাখি। আপনার বলা পেঙ্গুইন পাখির কাছ থেকে আচরণের কিছু উপসেট উত্তরাধিকার সূত্রে পেয়েছে।

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

var Penguin = Object.create(Bird);
Penguin.fly = undefined;
Penguin.swim = function () { ... };

এই বিশেষ ক্ষেত্রে, অবজেক্টের মান সহ একটি সম্পত্তি লিখে এটি উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিটিকে Penguinসক্রিয়ভাবে ছায়া দিচ্ছে ।Bird.flyflyundefined

এখন আপনি বলতে পারেন যে এটি আর Penguinসাধারণ হিসাবে বিবেচনা করা যায় Birdনা। তবে যেমনটি উল্লেখ করা হয়েছে, বাস্তব বিশ্বে এটি সহজভাবে পারে না। কারণ আমরা Birdএকটি উড়ন্ত সত্তা হিসাবে মডেলিং করছি ।

বিকল্পটি হল বার্ডের উড়ে যেতে পারে এমন বিস্তৃত ধারণা না করা not এটি একটি Birdবিমূর্ততা রাখা বোধগম্য হবে যা সমস্ত পাখিকে ব্যর্থতা ছাড়াই এখান থেকে উত্তরাধিকারী করে তোলে। এর অর্থ কেবল অনুমান করা যা সমস্ত সাবক্লাসই ধরে রাখতে পারে।

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

উদাহরণ:

// for some value of Object.make
var Penguin = Object.make(
  /* base class: */ Bird,
  /* mixins: */ Swimmer, ...
);
var Hawk = Object.make(
  /* base class: */ Bird,
  /* mixins: */ Flyer, Carnivore, ...
);

যদি আপনার কৌতূহলী হয়, আমার একটি বাস্তবায়ন আছেObject.make

সংযোজন:

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

আপনি একটি বৈশিষ্ট্য "আন-বাস্তবায়ন" করবেন না। আপনি কেবল আপনার উত্তরাধিকারের শ্রেণিবিন্যাস ঠিক করুন। হয় আপনি আপনার সুপার ক্লাসের চুক্তিটি পূরণ করতে পারেন বা আপনার ধরণের এমন ভান করা উচিত নয়।

এখানেই বস্তু রচনা জ্বলজ্বল করে।

একদিকে যেমন, সিরিয়ালাইজেবলের অর্থ এই নয় যে সমস্ত কিছু সিরিয়াল করা উচিত, এর অর্থ কেবল "আপনার নিজের যত্ন নেওয়া রাষ্ট্র" এর ক্রমিক ক্রমিক হওয়া উচিত।

আপনার "নটএক্স" বৈশিষ্ট্য ব্যবহার করা উচিত নয়। এটি কেবল ভয়াবহ কোড ফুলে। যদি কোনও ফাংশন কোনও উড়ন্ত বস্তুর প্রত্যাশা করে, আপনি যখন এটি একটি ম্যামথ দেবেন তখন এটি ক্রাশ এবং বার্ন হওয়া উচিত।


10
"বাস্তব বিশ্বে এটি সহজভাবে পারে না।" হ্যাঁ আমি পারি. একটি পেঙ্গুইন একটি পাখি। উড়ে যাওয়ার ক্ষমতা পাখির সম্পত্তি নয়, এটি বেশিরভাগ প্রজাতির পাখির একটি কাকতালীয় সম্পত্তি। পাখিদের সংজ্ঞা দেয় এমন বৈশিষ্ট্যগুলি "পালকযুক্ত, ডানাযুক্ত, বাইপিডাল, এন্ডোথেরমিক, ডিম পাড়া, মেরুদণ্ডের প্রাণী" (উইকিপিডিয়া) - সেখানে উড়ন্ত সম্পর্কে কিছুই নেই।
পিডিআর

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

2
@ রায়নোস: পেঙ্গুইনরা আসলেই পালকযুক্ত। তাদের পালক অবশ্যই খুব ছোট এবং ঘন।
জন পুর্ডি

@ জোনপুর্ডি মেলা যথেষ্ট, আমি সবসময়ই ভাবি তাদের পশম ছিল।
রায়নস

+1 সাধারণভাবে এবং বিশেষত "ম্যামথ" এর জন্য। হাঃ হাঃ হাঃ!
সেবাস্তিয়ান ডিয়ট

28

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

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


1
এলএসপি ধরণের জন্য, ক্লাসের জন্য নয় ।
Jörg ডব্লু মিট্টাগ

2
@ পেটারট্রিক: এই প্রশ্নটি অন্যথায় উপস্থিত থাকবে না :-) আমি রুবির দুটি উদাহরণ বিবেচনা করতে পারি। IS-NOT-A সত্ত্বেও Classএটি একটি সাবক্লাস । এটি এখনও একটি সাবক্লাস হিসাবে বোধগম্য হয়, যেহেতু এটি প্রচুর কোড পুনরায় ব্যবহার করে। ওটো, আইএস-এ , তবে দুজনের কোনও উত্তরাধিকারের সম্পর্ক নেই ( অবশ্যই উভয়টির উত্তরাধিকার সূত্রে পৃথক হওয়া ), কারণ তারা কোনও কোড ভাগ করে না। ক্লাসগুলি কোড ভাগ করে নেওয়ার জন্য, প্রোটোকলগুলি বর্ণনা করার জন্য প্রকারগুলি। এবং একই প্রোটোকল রয়েছে, সুতরাং একই ধরণের, তবে তাদের ক্লাসগুলি সম্পর্কিত নয়। ModuleClassModuleStringIOIOObjectIOStringIO
Jörg ডব্লু মিট্টাগ

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

2
লোকেরা এই উত্তরটিকে অগ্রাহ্য করে: মনে রাখবেন যে এটি সত্যই প্রশ্নের উত্তর দেয় না, বিশেষত সম্পাদিত স্পষ্টতার পরে। আমি মনে করি না যে এই উত্তরটি একটি ডাউনটাউটের যোগ্য, কারণ তিনি যা বলেছেন তা খুব সত্য এবং জেনে রাখা গুরুত্বপূর্ণ, তবে তিনি সত্যই এই প্রশ্নের উত্তর দেননি।
ঝাঁকুনি দিচ্ছেন

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

15

Fly()এতে প্রথম উদাহরণটিতে রয়েছে: কৌশল প্যাটার্নের জন্য প্রথম ফার্স্ট ডিজাইনের প্যাটার্নস এবং আপনার কেন "উত্তরাধিকারের তুলনায় রচনা পছন্দ করা উচিত " এটি একটি ভাল পরিস্থিতি

কারখানার সুপারটাইপসের সাথে সঠিক রচনা থাকতে পারে FlyingBird, FlightlessBirdযেগুলি যথাযথ সাব টাইপগুলি যেমন Penguin : FlightlessBirdস্বয়ংক্রিয়ভাবে আসে এবং অন্য যে কোনও কিছু সত্যই নির্দিষ্টভাবে কারখানার দ্বারা পরিচালিত হয় এর সুপারটাইপসের সাথে আপনি রচনা এবং উত্তরাধিকার মিশ্রিত করতে পারেন ।


1
আমি আমার উত্তরে ডেকরেটর প্যাটার্নটি উল্লেখ করেছি, তবে কৌশল প্যাটার্নটিও বেশ ভালভাবে কাজ করে।
ঝাঁকুনি দিচ্ছেন

1
"উত্তরাধিকারের উপরে পছন্দসই রচনা" এর জন্য +1। তবে, স্ট্যাটিক্যালি টাইপ করা ভাষাগুলিতে রচনা প্রয়োগের জন্য বিশেষ নকশার নিদর্শনগুলির প্রয়োজনীয়তা রুবির মতো গতিশীল ভাষার প্রতি আমার পক্ষপাতিত্বকে শক্তিশালী করে।
রায় টিঙ্কার

11

আপনি ধরে নিচ্ছেন Birdএমন আসল সমস্যাটি কি কোনও Flyপদ্ধতি আছে? কেন না:

class Bird
{
    // features that all birds have
}

class BirdThatCanSwim : Bird
{
    public void Swim() {...};
}

class BirdThatCanFly : Bird
{
    public void Fly() {...};
}


class Penguin : BirdThatCanSwim { }
class Sparrow : BirdThatCanFly { }

এখন স্পষ্ট সমস্যা হ'ল একাধিক উত্তরাধিকার ( Duck), সুতরাং আপনার যা সত্যই প্রয়োজন তা হল ইন্টারফেসগুলি:

interface IBird { }
interface IBirdThatCanSwim : IBird { public void Swim(); }
interface IBirdThatCanFly : IBird { public void Fly(); }
interface IBirdThatCanQuack : IBird { public void Quack(); }

class Duck : BirdThatCanFly, IBirdThatCanSwim, IBirdThatCanQuack
{
    public void Swim() {...};
    public void Quack() {...};
}

3
সমস্যাটি হ'ল বিবর্তনটি লিসকভ সাবস্টিটিউশন নীতি অনুসরণ করে না, এবং বৈশিষ্ট্য অপসারণের সাথে উত্তরাধিকার করে।
ডোনাল ফেলো

7

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

কিন্তু পেটার টারিক যেমন বলেছিলেন, এটি এলএসপিকে লঙ্ঘন করবে


এই অংশে, আমি এলএসপিকে ভুলে যাব এবং ধরে নিই:

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

তুমি বলেছিলে :

একদিকে, আপনি প্রতিটি সম্পত্তি এবং আচরণের জন্য কিছু পতাকা সংজ্ঞায়িত করতে চান না যা এটি বর্তমানে উপস্থিত রয়েছে কিনা তা নির্দিষ্ট করে এবং সেই আচরণ বা সম্পত্তি অ্যাক্সেস করার আগে প্রতিবার এটি পরীক্ষা করে দেখুন

দেখে মনে হচ্ছে আপনি কী চান পাইথনের " অনুমতি চেয়ে ক্ষমা চাওয়া "

কেবলমাত্র আপনার পেঙ্গুইন একটি ব্যতিক্রম ছুঁড়ে ফেলুন বা একটি ননফ্লাইটিংবার্ড শ্রেণি থেকে উত্তরাধিকারী হন যা একটি ব্যতিক্রম ছদ্ম হয় (সিউডো কোড):

class Penguin extends Bird {
     function fly():void {
          throw new Exception("Hey, I'm a penguin, I can't fly !");
     }
}

যাইহোক, আপনি যা যা চয়ন করুন: ব্যতিক্রম বা কোনও পদ্ধতি মুছে ফেলা, শেষ পর্যন্ত নীচের কোডগুলি (মনে করুন যে আপনার ভাষা পদ্ধতি অপসারণকে সমর্থন করে):

var bird:Bird = new Penguin();
bird.fly();

একটি রানটাইম ব্যতিক্রম নিক্ষেপ করবে।


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

@pdr: এটা পরামর্শ হয় না যে একটি পেঙ্গুইন করতে উড়ে, কিন্তু এটি করা উচিত উড়ে (এটা একটি চুক্তি এর)। ব্যতিক্রম আপনাকে বলবে যে এটি পারে না । যাইহোক, আমি দাবি করছি না এটি একটি ভাল ওওপি অনুশীলন, আমি কেবল প্রশ্নের একটি অংশের উত্তর দিচ্ছি
ডেভিড

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

@ পিডিআর "আমাকে আপনার সংস্করণে একটি চেষ্টা / ধরার চেষ্টা করতে হবে" -> এটি অনুমতিের পরিবর্তে ক্ষমা চাওয়ার পুরো বিষয়টি (কারণ এমনকি কোনও হাঁসের ডানাও ভেঙে যেতে পারত এবং উড়তে পারত না)। আমি শব্দটি ঠিক করব।
ডেভিড

"এটাই অনুমতিের চেয়ে ক্ষমা চাওয়ার পুরো বিষয়টি।" হ্যাঁ, এটি বাদে এটি কাঠামোটি কোনও অনুপস্থিত পদ্ধতির জন্য একই ধরণের ব্যতিক্রম ছুঁড়ে ফেলতে দেয়, তাই পাইথনের "চেষ্টা করুন: অ্যাট্রিবিউটআরার ব্যতীত:" যদি সি এক্স এর সমতুল্য হয় (X হ'ল)}} অন্য {} "এবং তাত্ক্ষণিকরূপে সনাক্তযোগ্য যেমন. তবে আপনি যদি ইচ্ছাকৃতভাবে বার্ডে ডিফল্ট ফ্লাই () কার্যকারিতা ওভাররাইড করতে একটি CannotFlyException ছুঁড়ে ফেলেছেন তবে এটি কম স্বীকৃত হয়ে ওঠে।
পিডিআর

7

যেমন কেউ মন্তব্যগুলিতে উপরে উল্লেখ করেছেন, পেঙ্গুইনরা পাখি, পেঙ্গুইনগুলি উড়ে যায় না, তবে সব পাখি উড়ে যায় না।

সুতরাং বার্ড.ফ্লাই () এর অস্তিত্ব থাকা উচিত নয় বা কাজ করার অনুমতি দেওয়া উচিত নয়। আমি আগের পছন্দ।

ফ্লাইংবার্ডের প্রসারিত পাখির একটি ফ্লাই () পদ্ধতি অবশ্যই থাকবে, অবশ্যই।


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

6

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

সুতরাং, এর পরিবর্তে:

class Bird {
public:
   virtual void fly()=0;
};

আপনি ভালো কিছু থাকতে হবে:

   class Bird {
   public:
      virtual float fly(float x) const=0;
   };

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

প্রকৃত আচরণ ধরণেরগুলিতে এনকোড করা কঠিন হতে পারে তবে আপনার ইন্টারফেসগুলি সঠিকভাবে নির্দিষ্ট করার একমাত্র উপায়।

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


1
আমি আপনার উত্তর বেশ পছন্দ। আমি মনে করি এটি আরও ভোটের দাবিদার।
সেবাস্তিয়ান ডিয়ট

2
দুর্দান্ত উত্তর। সমস্যাটি হ'ল প্রশ্নটি কেবল উড়ে যায় () আসলে কী করে তা নিয়ে তার হাত waves ফ্লাইয়ের যে কোনও বাস্তবায়ন খুব কম সময়েই একটি গন্তব্য - ফ্লাই (স্থানাঙ্ক গন্তব্য) থাকতে পারে যা পেঙ্গুইনের ক্ষেত্রে current বর্তমানের বর্তমান অবস্থান বাস্তবায়নে অগ্রাহ্য করা যেতে পারে)}
ক্রিস কুডমোর

4

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

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


3

পিটার লিসকোভ সাবস্টিটিউশন নীতিটি উল্লেখ করেছেন, তবে আমি মনে করি যে এটি ব্যাখ্যা করা দরকার।

Q (x) টি ধরণের টি টাইপের অবজেক্ট সম্পর্কে প্রবেশনযোগ্য সম্পত্তি হিসাবে ধরা যাক। তবে Q (y) টি টাইপ S এর অবজেক্টের জন্য প্রবণতাযোগ্য হওয়া উচিত যেখানে এস টি এর টিউপের একটি টাইপ is

সুতরাং, যদি কোনও পাখি (টাইপের টির x অবজেক্ট) উড়তে পারে (q (x)) তবে একটি পেনগুইন (ধরণের এস এর অবজেক্ট y) সংজ্ঞা অনুসারে উড়তে পারে (q (y))। তবে এটি স্পষ্টভাবে কেস নয়। এছাড়াও অন্যান্য প্রাণী রয়েছে যা উড়তে পারে তবে টাইপ বার্ডের নয়।

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

তবে একটি সুপারক্লাসের প্রতিটি সম্পত্তি তার সমস্ত সাবক্লাসে প্রয়োগ করা উচিত।

[সম্পাদনার জবাবে]

ক্যানফ্লাইয়ের একটি "বৈশিষ্ট্য" বার্ডে প্রয়োগ করা আরও ভাল নয়। এটি এখনও কোডিংয়ের পরামর্শ দিচ্ছে যে সমস্ত পাখি উড়ে যেতে পারে।

আপনি যে সংজ্ঞাটিকে সংজ্ঞায়িত করেছেন তার মধ্যে একটি বৈশিষ্ট্য হ'ল লিসকভ যখন "সম্পত্তি" বলছিলেন তখন ঠিক কী বোঝানো হয়েছিল।


2

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

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

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


0

এ জাতীয় পরিস্থিতি পরিচালনা করার সাধারণ উপায় হ'ল UnsupportedOperationException(জাভা) শ্রমের মতো কিছু ফেলে দেওয়া । NotImplementedException(গ #)।


যতক্ষণ আপনি পাখিতে এই সম্ভাবনাটি নথিভুক্ত করবেন।
ডিজেক্লেওয়ার্থ

0

অনেক মন্তব্য সহ অনেক ভাল উত্তর, কিন্তু তারা সব একমত হয় না, এবং আমি শুধুমাত্র একটি একক চয়ন করতে পারেন, তাই আমি এখানে আমি সম্মত সমস্ত মতামত সংক্ষিপ্ত করব।

0) "স্ট্যাটিক টাইপিং" ধরে নিবেন না (আমি যখন জিজ্ঞাসা করেছি তখন করেছি, কারণ আমি প্রায় একচেটিয়াভাবে জাভা করি)। মূলত, সমস্যাটি কোনওরকমের ভাষার ব্যবহারের উপর নির্ভর করে dependent

1) ডিজাইনে এবং কারও মাথার মধ্যে কোডটি পুনঃব্যবস্থা হায়ারার্কি থেকে টাইপ-হায়ারার্কি আলাদা করা উচিত, যদিও তারা বেশিরভাগই ওভারল্যাপ করে। সাধারণত, পুনরায় ব্যবহারের জন্য ক্লাস এবং প্রকারের জন্য ইন্টারফেস ব্যবহার করুন।

২) সাধারণত পাখি IS-A ফ্লাই করার কারণ হ'ল বেশিরভাগ পাখি উড়তে পারে, তাই এটি কোড-রিউজ পয়েন্ট অফ ভিউ থেকে বাস্তব, তবে বার্ড আইএস-এ ফ্লাই বলতে আসলে ভুল যেহেতু কমপক্ষে একটি ব্যতিক্রম রয়েছে (পেঙ্গুইন)।

3) উভয় স্থিতিশীল এবং গতিশীল ভাষায়, আপনি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন। তবে এটি কেবল তখনই ব্যবহার করা উচিত যখন শ্রেণি / ইন্টারফেসের কার্যকারিতা ঘোষণা করার "চুক্তি" এ এটি স্পষ্টভাবে ঘোষণা করা হয়, অন্যথায় এটি "চুক্তি লঙ্ঘন"। এর অর্থ হ'ল আপনাকে এখন যে কোনও জায়গায় ব্যতিক্রম ধরতে প্রস্তুত থাকতে হবে, তাই আপনি কল সাইটে আরও কোড লিখুন এবং এটি কুৎসিত কোড।

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

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

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

)) আপনার ফ্লাই বৈশিষ্ট্যটি এমনভাবে সংজ্ঞায়িত করুন যে এটি এমন কোনও কিছুতে উড়তে পারে না তার জন্য একটি সুস্পষ্ট উপায় অফার করে। Fly.getNumberOfWings () ০. ফিরে আসতে পারে যদি ফ্লাই.ফ্লাই (দিকনির্দেশ, কারেন্টপটিনিয়ন) বিমানের পরে নতুন অবস্থানটি ফিরিয়ে আনতে পারে তবে পেঙ্গুইনফ্লাই () কেবল পরিবর্তন না করেই বর্তমান অবস্থানটি ফিরিয়ে দিতে পারে। আপনি প্রযুক্তিগতভাবে কার্যকর কোড সহ শেষ হতে পারে, কিন্তু কিছু সতর্কতা আছে। প্রথমত, কিছু কোডের স্পষ্টত "কিছুই না" আচরণ নাও হতে পারে। এছাড়াও, যদি কেউ x.fly () কে কল করে তবে তারা এটিকে কিছু করার প্রত্যাশা করবে , যদিও মন্তব্যে উড়ে () কিছুই করার অনুমতি দেওয়া হয়নি । অবশেষে, পেঙ্গুইন আইএস-এ ফ্লাইংটি এখনও সত্য ফিরে আসবে, যা প্রোগ্রামারের জন্য বিভ্রান্তি পেতে পারে।

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


0

বেস শ্রেণিতে একটি ডিফল্ট আচরণ (এটি ভার্চুয়াল হিসাবে চিহ্নিত করুন) সংজ্ঞায়িত করুন এবং এটি প্রয়োজনীয় হিসাবে ওভাররাইড করুন। এইভাবে প্রতিটি পাখি "উড়ে" যেতে পারে।

এমনকি পেঙ্গুইনগুলি উড়ে যায়, এটি শূন্য উচ্চতায় বরফ জুড়ে গিয়ার করে!

উড়ানের আচরণটি প্রয়োজনীয় হিসাবে ওভাররাইড করা যেতে পারে।

আরেকটি সম্ভাবনা একটি ফ্লাই ইন্টারফেস হচ্ছে। সমস্ত পাখি সেই ইন্টারফেসটি প্রয়োগ করবে না।

class eagle : bird, IFly
class penguin : bird

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


-1

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

  • কিছু না
  • একটি ব্যতিক্রম নিক্ষেপ
  • পরিবর্তে পেঙ্গুইন :: সাঁতার () পদ্ধতি কল করে
  • জোর দিয়েছিল যে পেঙ্গুইনটি পানির নীচে রয়েছে (তারা পানির মধ্য দিয়ে "উড়ান" দেয়)

আপনি যদি পরিকল্পনা করেন তবে সম্পত্তি যুক্ত করা এবং অপসারণ করা সহজ হবে be উদাহরণস্বরূপ ভেরিয়েবলগুলি ব্যবহার না করে আপনি মানচিত্র / অভিধান / এসোসিয়েটিভ অ্যারে বৈশিষ্ট্যগুলি সংরক্ষণ করতে পারেন। আপনি এই জাতীয় কাঠামোর মানক দৃষ্টান্ত তৈরি করতে কারখানার প্যাটার্নটি ব্যবহার করতে পারেন, তাই বার্ডফ্যাক্টরি থেকে আসা একটি পাখি সর্বদা একই সংখ্যার সেট দিয়ে শুরু হবে। অবজেক্টিভ-সি এর মূল মান কোডিং এই ধরণের জিনিসটির একটি ভাল উদাহরণ।

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

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


2
এমনকি পেঙ্গুইন :: সাঁতার () কল করার পরামর্শ দেওয়ার জন্য 1 এটি অন্তত বিস্ময়ের নীতি লঙ্ঘন করে এবং সর্বত্র রক্ষণাবেক্ষণ প্রোগ্রামারদের আপনার নামে অভিশাপ দেবে।
ডিজেক্লেওয়ার্থ

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

1
আমি সম্মত হই যে প্রশ্নটি নিরীহ ছিল তবে সমস্যাটি হ'ল লোকেরা বাস্তব জীবনে এই কাজটি করতে দেখেছি - বিরল কার্যকারিতা বাস্তবায়নের জন্য বিদ্যমান কলগুলি ব্যবহার করুন যা "সত্যিই কিছু করবেন না" ব্যবহার করুন। এটি কোডটি সত্যই স্ক্রু আপ করে এবং সাধারণত "যদি (! (মাইবার্ড উদাহরণস্বরূপ পেনগুইন)) ফ্লাই (); অনেক জায়গায়, আশা করার সময় কেউই কোনও ওস্ট্রিচ ক্লাস তৈরি করে না।
ডিজেক্লেওয়ার্থ

জোর আরও খারাপ। আমার যদি পাখির একটি অ্যারে থাকে, যা সবার কাছে ফ্লাই () পদ্ধতি রয়েছে, আমি যখন তাদের উপরে ফ্লাই () কল করি তখন আমি দৃ failure় ব্যর্থতা চাই না।
ডিজেক্লেওয়ার্থ

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