কেন ডিওএম / বিল্ট-ইন অবজেক্ট প্রোটোটাইপগুলি প্রসারিত করা খারাপ ধারণা?


15

জেএস বিকাশকারী সম্প্রদায়তে অন্তর্নির্মিত প্রোটোটাইপগুলিকে কেন এত বেশি শাস্তি দেওয়া হয়েছে তার একটি নির্দিষ্ট উত্তর আমি খুঁজছি। আমি কিছুক্ষণের জন্য প্রোটোটাইপ জেএস কাঠামোটি ব্যবহার করছি এবং আমার কাছে [1,2,3].each(doStuff)করাটি এর চেয়ে অনেক বেশি মার্জিত বলে মনে হচ্ছে $.each([1,2,3], doStuff)। আমি জানি যে এটি "নেমস্পেস দূষণ" তৈরি করে, তবে কেন এটি খারাপ জিনিস বলে বিবেচিত হবে তা আমি বুঝতে পারছি না। এছাড়াও অন্তর্নির্মিত প্রোটোটাইপগুলি বাড়ানোর সাথে কি কোনও বাস্তব পারফরম্যান্স অবক্ষয় যুক্ত? ধন্যবাদ!


1
একটি বিষয় হ'ল for(var ... in ...)প্রোটোটাইপ ফাংশনগুলি অতিবাহিত হওয়ায় লুপগুলি বিভ্রান্ত হয়।
pimvdb

4
"গুরুতরভাবে শাস্তি দেওয়া", সত্যিই ?! ভাল ,শ্বর, মানুষ:] আপনি ঠিক আছেন?
পিক্সেলবিবি

উত্তর:


12

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

সংক্ষেপে:

স্পেসিফিকেশন অভাব

"প্রোটোটাইপ অবজেক্টস" এর এক্সপোজার কোনও নির্দিষ্টকরণের অংশ নয়। [...] বাস্তবায়নের জন্য ডিওএম লেভেল 2 সম্পূর্ণরূপে মেনে চলার জন্য, এই গ্লোবাল নোড, এলিমেন্ট, এইচটিএমলেমেন্ট, ইত্যাদি বিষয়গুলি প্রকাশ করার দরকার নেই।

হোস্ট অবজেক্টগুলির কোনও বিধি নেই

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

[...] অভ্যন্তরীণ পদ্ধতির আচরণ বাস্তবায়ন নির্ভর। [...] সংজ্ঞা অনুসারে, আপনি এমন কোনও কিছু নিয়ে কাজ করছেন যা অনুমানযোগ্য এবং সম্পূর্ণরূপে অনিচ্ছাকৃত আচরণ করতে অনুমোদিত।

সংঘর্ষের সম্ভাবনা

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

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

কোনও ধরণের উপসর্গ কৌশল প্রয়োগ করা সমস্যাটি দূর করতে পারে। তবে সম্ভবত অতিরিক্ত আওয়াজও আনবে।

পারফরম্যান্স ওভারহেড

[...] ব্রাউজারগুলি যা উপাদান এক্সটেনশনগুলি যেমন আই 6, 7, সাফারি 2.x ইত্যাদি সমর্থন করে না - ম্যানুয়াল অবজেক্ট এক্সটেনশন প্রয়োজন। সমস্যাটি হ'ল ম্যানুয়াল এক্সটেনশন ধীর, অসুবিধাগুলি এবং স্কেল হয় না।

আপনি ... ফলস্বরূপ, like জাতীয় অনুসন্ধান পদ্ধতিগুলি কোয়েরিতে প্রতিটি একক উপাদানকে বাড়িয়ে দিতে পারে।

আইই ডোম একটি জগাখিচুড়ি

পূর্ববর্তী বিভাগে প্রদর্শিত হিসাবে, ম্যানুয়াল DOM এক্সটেনশন একটি জগাখিচুড়ি। তবে আই-তে ম্যানুয়াল ডিওএম এক্সটেনশন আরও খারাপ [...]

বোনাস: ব্রাউজার বাগ


9

আর একটি কারণ কোড পাঠযোগ্যতা / রক্ষণাবেক্ষণযোগ্যতা। যদি অন্য কোনও বিকাশকারী (বিশেষত একজন নবাগত) আমার কোডটি পড়ছেন এবং দেখেন [0, 1, 2].foo(...), তারা foo পদ্ধতিটি কী তা জানেন না বা এর জন্য নথি / উত্স কোথায় পাবেন। প্রুোটাইপ.জেএস, বা ব্যবহৃত অন্য লাইব্রেরি দ্বারা বা অন্য কোনও ফাইলে আমার কোডের অন্য কোনও অংশের দ্বারা সংযুক্ত ভাষায় ফু কি একটি এক্সটেনশান, বা এটি কোন জাভাস্ক্রিপ্ট পদ্ধতি যা তারা জানে না? তাদের এটির জন্য অনুসন্ধান করতে হবে এবং এটি এখনই খুঁজে পেতে পারে না (বা যদি কোনও বিরোধ হয় তবে তারা সঠিকটি নাও পেতে পারে)।

JQuery পদ্ধতির সাথে, যদি আপনি দেখতে পান $.foo(...), foo পদ্ধতির নাম স্থানটি এটি সুস্পষ্ট করে তোলে যেখানে এটি কী করে তা আপনি যদি না জানেন তবে তার সংজ্ঞা / ডকুমেন্টেশন কোথায় পাওয়া যায়।


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

4

এখানে মূল সমস্যাটি রয়েছে: আপনার কাছে যদি দুটি সরঞ্জাম থাকে যা বেমানান উপায়ে প্রোটোটাইপগুলি প্রসারিত করে, বা সাধারণভাবে তথাকথিত পদ্ধতিগুলিতে প্রসারিত করে যেগুলি বিভিন্ন ফলাফল দেয় (এটি for...inজাভাস্ক্রিপ্টের জন্য একটি নির্দিষ্ট সমস্যা ), ফলে কোড নির্ভর করে যা নির্ভর করে তাদের স্বাভাবিক আচরণ ভাঙ্গতে?

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

অবশ্যই প্রোটোটাইপ.জেএস বেশ সুপরিচিত এবং বেশিরভাগ সরঞ্জাম এটি যা করে তা নিয়ে কাজ করে। একইভাবে, আমি নিশ্চিত যে বেস কে প্রোটোটাইপগুলি প্রসারিত করা সঠিক জিনিস। তবে, এটি সাবধানতার সাথে যোগাযোগ করার কিছু।


1

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


1

এখানে দুটি পৃথক ইস্যু রয়েছে। প্রথমটি হ'ল বিল্ট-ইন প্রোটোটাইপগুলির সাধারণ বর্ধন এবং অন্যটি বিশেষত ডিওএম প্রোটোটাইপগুলি প্রসারিত করে। অন্তর্নির্মিত প্রোটোটাইপগুলি বাড়ানোর বিরুদ্ধে যুক্তিগুলি:

  • সম্ভাব্য সংঘর্ষ: বিভিন্ন উত্স থেকে দুটি টুকরা কোড উভয় একই প্রোটোটাইপে একই সম্পত্তি সংজ্ঞা দেয়
  • পার্শ্ব-প্রতিক্রিয়া: প্রসারিত Array.prototypeবা Object.prototypeনক-অন এফেক্টস থাকতে পারে যেমন এক্সটেনশন পদ্ধতিগুলি একটি for...inলুপে গণনা করা হচ্ছে

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

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