প্রোটোটাইপ ভিত্তিক বনাম ক্লাস ভিত্তিক উত্তরাধিকার


208

জাভাস্ক্রিপ্টে, প্রতিটি বস্তু একই সাথে একটি উদাহরণ এবং একটি বর্গ হয়। উত্তরাধিকারটি করতে, আপনি কোনও বিষয়বস্তুর উদাহরণ প্রোটোটাইপ হিসাবে ব্যবহার করতে পারেন।

পাইথন, সি ++ ইত্যাদিতে পৃথক ধারণা হিসাবে শ্রেণি এবং উদাহরণ রয়েছে। উত্তরাধিকার করার জন্য, আপনাকে একটি নতুন বর্গ তৈরি করতে বেস ক্লাসটি ব্যবহার করতে হবে, যা পরে উত্পন্ন উদাহরণগুলি উত্পাদন করতে ব্যবহৃত হতে পারে।

জাভাস্ক্রিপ্ট কেন এই দিকটিতে চলে গেল (প্রোটোটাইপ-ভিত্তিক অবজেক্ট অরিয়েন্টেশন)? প্রথাগত, বর্গ-ভিত্তিক ওও সম্পর্কিত প্রোটোটাইপ-ভিত্তিক ওওর সুবিধা (এবং অসুবিধাগুলি) কী কী?


10
জাভাস্ক্রিপ্ট স্ব দ্বারা প্রভাবিত হয়েছিল যা প্রোটোটাইপাল উত্তরাধিকারের সাথে প্রথম ভাষা ছিল। সেই সময়ে ধ্রুপদী উত্তরাধিকার ছিল সমস্ত ক্রোধ, প্রথম সিমুলায় চালু হয়েছিল। তবে শাস্ত্রীয় উত্তরাধিকারটি অত্যন্ত জটিল ছিল। তারপরে ডেভিড উঙ্গার এবং র্যান্ডল স্মিথ জিইবি পড়ার পরে একটি এপিফানি করেছিলেন - "সর্বাধিক সুনির্দিষ্ট ঘটনাটি একটি শ্রেণির ইভেন্টের সাধারণ উদাহরণ হিসাবে কাজ করতে পারে।" তারা বুঝতে পেরেছিল যে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য ক্লাসের প্রয়োজন নেই। তাই স্ব জন্মগ্রহণ করেছিলেন। কিভাবে প্রটোটাইপ ইনহেরিটেন্স ভাল এর চেয়ে ধ্রুপদি উত্তরাধিকার এই পড়া হয়: stackoverflow.com/a/16872315/783743 =)
Aadit এম শাহ

@ অদিতএমশাহ কী / কে GEB?
অ্যালেক্স

3
@ অ্যালেক্স জিইবি ডগলাস হাফস্ট্যাডারের লেখা একটি বই is এটি গডেল এসচার বাচের একটি সংক্ষেপণ। কার্ট গুডেল ছিলেন একজন গণিতবিদ। এসচার ছিলেন একজন শিল্পী। বাচ ছিলেন পিয়ানোবাদক।
অদিত এম শাহ

উত্তর:


201

এখানে প্রায় শতাধিক পরিভাষা সম্পর্কিত সমস্যা রয়েছে, বেশিরভাগই কারও চারপাশে নির্মিত (আপনি নন) তাদের ধারণাটি সেরাের মতো করে দেওয়ার চেষ্টা করছে।

সমস্ত অবজেক্ট ওরিয়েন্টেড ভাষাগুলি বেশ কয়েকটি ধারণাকে মোকাবেলা করতে সক্ষম হতে হবে:

  1. ডেটা সম্পর্কিত সম্পর্কিত ক্রিয়াকলাপ সহ ডেটা এনক্যাপসুলেশন, বিভিন্নভাবে ডেটা সদস্য এবং সদস্য ফাংশন, বা অন্যান্য জিনিসগুলির মধ্যে ডেটা এবং পদ্ধতি হিসাবে পরিচিত।
  2. উত্তরাধিকার, এই বিষয়বস্তু ঠিক এই পরিবর্তনের জন্য বাদ দেওয়া অন্যান্য অবজেক্টের মতোই বলার ক্ষমতা
  3. পলিমারফিজম ("অনেকগুলি আকৃতি") যাতে কোনও অবজেক্ট নিজেই সিদ্ধান্ত নেয় কী কী পদ্ধতি চালানো উচিত, যাতে আপনি আপনার অনুরোধগুলি সঠিকভাবে রুট করতে ভাষার উপর নির্ভর করতে পারেন।

এখন যতটা তুলনা করা যায়:

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

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

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

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

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


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

1
এই পরিবর্তন কি আরও ভাল বলে?
চার্লি মার্টিন

2
দুঃখিত, কোন, Clos প্রয়াত 80 এর থেকে dreamsongs.com/CLOS.html 1980 থেকে স্মলটক en.wikipedia.org/wiki/Smalltalk এবং Simula পূর্ণ বস্তুর স্থিতিবিন্যাস সঙ্গে 1967-68 থেকে en.wikipedia.org/wiki/Simula
চার্লি মার্টিন

3
@ স্টাফানো, এগুলি এতটা আলাদা নয়: পাইথন, রুবি, স্মলটাল্ক পদ্ধতি অনুসন্ধানের জন্য অভিধান ব্যবহার করে এবং জাভাস্ক্রিপ্ট এবং স্বের ক্লাস রয়েছে। কিছুটা হলেও, আপনি তর্ক করতে পারেন যে পার্থক্যটি কেবলমাত্র প্রোটোটাইপ-ভিত্তিক ভাষাগুলি তাদের প্রয়োগগুলি প্রকাশ করছে। সুতরাং এটি সম্ভবত একটি বড় চুক্তিতে পরিণত না করা ভাল: এটি সম্ভবত EMACS এবং vi এর মধ্যে যুক্তির মতো।
চার্লি মার্টিন

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

40

প্রোটোটাইপ ভিত্তিক পদ্ধতির দিকে সামান্য পক্ষপাতদুষ্ট একটি তুলনা পেপার সেল্ফ: সরলতার ক্ষমতা । কাগজ প্রোটোটাইপের পক্ষে নিম্নলিখিত যুক্তিগুলি তোলে:

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

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

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

মেটা-রিগ্রেশন নির্মূল । শ্রেণিভিত্তিক ব্যবস্থায় কোনও বস্তু স্বয়ংসম্পূর্ণ হতে পারে না; এর কাঠামো এবং আচরণ প্রকাশের জন্য আরেকটি অবজেক্ট (এর শ্রেণি) প্রয়োজন। এটি ধারণামূলকভাবে অসীম মেটা-রিগ্রাসের দিকে পরিচালিত করে: একটি pointশ্রেণীর Pointউদাহরণ Point, যা মেটাক্লাসের উদাহরণ , যা মেটমেটাক্লাসের একটি উদাহরণ Point, বিজ্ঞাপন অন্তর্নিহিত । অন্যদিকে, প্রোটোটাইপ-ভিত্তিক সিস্টেমে কোনও বস্তুর নিজস্ব আচরণ অন্তর্ভুক্ত থাকতে পারে; এর মধ্যে জীবন নিঃশ্বাস ত্যাগ করার জন্য অন্য কোনও বস্তুর দরকার নেই। প্রোটোটাইপগুলি মেটা-রিগ্রেশনকে দূর করে।

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


5
আরই: মেটা-রিগ্রাসের নির্মূলকরণ: সাধারণ লিস্প অবজেক্ট সিস্টেমে, যা শ্রেণিভিত্তিক , একটি pointশ্রেণীর Pointউদাহরণ standard-class, যা মেটাক্লাসের একটি উদাহরণ , যা নিজেই একটি উদাহরণ, বিজ্ঞাপনের ফাইনম um
সর্বাধিক ন্যানসি

একটি স্ব পেপার লিঙ্ক মারা গেছে। কাজের লিংক: স্ব: সরলতার শক্তি | একটি
স্বতঃ

24

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

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

সুতরাং আমি মনে করি যে জাভাস্ক্রিপ্টে প্রয়োগ করা হয়েছে প্রোটোটাইপ-ভিত্তিক ওওর জন্য কিছু পেশাদার রয়েছে:

  1. আলগাভাবে টাইপ করা পরিবেশে উপযুক্ত, সুস্পষ্ট ধরণের সংজ্ঞা দেওয়ার দরকার নেই।
  2. এটি সিঙ্গলটন প্যাটার্ন বাস্তবায়নে অবিশ্বাস্যভাবে সহজ করে তোলে (এই ক্ষেত্রে জাভাস্ক্রিপ্ট এবং জাভা তুলনা করুন, এবং আমি কী সম্পর্কে বলছি তা আপনি জানবেন)।
  3. কোনও ভিন্ন বস্তুর প্রসঙ্গে কোনও বস্তুর পদ্ধতি প্রয়োগের উপায় সরবরাহ করে, কোনও বস্তু ইত্যাদি থেকে গতিময় পদ্ধতি যুক্ত করা এবং প্রতিস্থাপন ইত্যাদি (যে বিষয়গুলি দৃ a়ভাবে টাইপ করা ভাষায় সম্ভব নয়)।

প্রোটোটাইপাল ওওর কয়েকটি কনস এখানে রয়েছে:

  1. ব্যক্তিগত ভেরিয়েবল কার্যকর করার সহজ উপায় নেই easy তার সম্ভাব্য ব্যক্তিগত Vars ব্যবহার করে বাস্তবায়ন করতে Crockford এর মায়াবিদ্যা ব্যবহার বন্ধ , কিন্তু তার স্পষ্টভাবে যেমন বলে জাভা বা C # ব্যক্তিগত ভেরিয়েবল ব্যবহার তুচ্ছ নয়।
  2. আমি এখনও জাভাস্ক্রিপ্টে একাধিক উত্তরাধিকার (এটির জন্য কীভাবে) প্রয়োগ করব তা জানি না।

2
পাইথনের মতো কেবল প্রাইভেট ওয়ারগুলির জন্য নামকরণের সম্মেলনটি ব্যবহার করুন।
এহেলকে

1
জেএসে প্রাইভেট ওয়ারগুলি করার উপায়টি ক্লোজারগুলির সাথে হয় এবং এটি আপনি যে উত্তরাধিকার চয়ন করেন তার থেকে আলাদা।
বেনজা

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