স্মুশ কি হয়েছে?!
Array.prototype.flatten
নামে একটি জাভাস্ক্রিপ্ট ভাষার বৈশিষ্ট্যের জন্য একটি প্রস্তাব ওয়েব-বেমানান হতে দেখা যাচ্ছে। ফায়ারফক্স নাইটলিতে ফিচার পাঠানোর ফলে অন্তত একটি জনপ্রিয় ওয়েবসাইট ভেঙে গেছে। প্রদত্ত যে সমস্যাযুক্ত কোডটি ব্যাপক MooTools লাইব্রেরির অংশ, এটি সম্ভবত আরও অনেক ওয়েবসাইট প্রভাবিত হয়েছে৷ (যদিও 2018 সালে নতুন ওয়েবসাইটের জন্য MooTools সাধারণত ব্যবহার করা হয় না, এটি খুব জনপ্রিয় ছিল এবং এখনও অনেক উত্পাদন ওয়েবসাইটে উপস্থিত রয়েছে।)
প্রস্তাবের লেখক রসিকতার সাথে সামঞ্জস্যের সমস্যা এড়াতে smoosh
করার জন্য flatten
নাম পরিবর্তন করার পরামর্শ দিয়েছেন। কৌতুকটি সবার কাছে পরিষ্কার ছিল না, কিছু লোক ভুলভাবে বিশ্বাস করতে শুরু করেছিল যে নতুন নামটি ইতিমধ্যেই সিদ্ধান্ত নেওয়া হয়েছে এবং জিনিসগুলি দ্রুত বেড়েছে।
Array.prototype.flatten
কি করে?
Array.prototype.flat
, মূলত Array.prototype.flatten
হিসাবে প্রস্তাবিত, নির্দিষ্ট depth
পর্যন্ত অ্যারেগুলিকে বারবার সমতল করে, যা ডিফল্ট 1
করে।
// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]
// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]
একই প্রস্তাবের মধ্যে রয়েছে Array.prototype.flatMap
, যা Array.prototype.map
এর মত, এটি ফলাফলটিকে একটি নতুন অ্যারেতে সমতল করে।
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
MooTools কি করছে যা এই সমস্যার কারণ?
MooTools Array.prototype.flatten
এর নিজস্ব অ-মানক সংস্করণ সংজ্ঞায়িত করে:
Array.prototype.flatten = /* non-standard implementation */;
MooTools এর flatten
বাস্তবায়ন প্রস্তাবিত মান থেকে পৃথক। যাইহোক, এই সমস্যা না! যখন ব্রাউজারগুলি স্থানীয়ভাবে Array.prototype.flatten
পাঠায়, তখন MooTools নেটিভ বাস্তবায়নকে ওভাররাইড করে। এটি নিশ্চিত করে যে MooTools আচরণের উপর নির্ভরশীল কোড নেটিভ flatten
উপলব্ধ কিনা তা বিবেচনা না করেই উদ্দেশ্য অনুযায়ী কাজ করে। এই পর্যন্ত, এত ভাল!
দুর্ভাগ্যক্রমে, তারপর অন্য কিছু ঘটে। MooTools এর সমস্ত কাস্টম অ্যারে পদ্ধতি Elements.prototype
এ কপি করে (যেখানে Elements
হল MooTools-নির্দিষ্ট API):
for (var key in Array.prototype) {
Elements.prototype[key] = Array.prototype[key];
}
for
- "গণনাযোগ্য" বৈশিষ্ট্যগুলির উপর পুনরাবৃত্তি in
, যেটিতে Array.prototype.sort
এর মতো নেটিভ পদ্ধতিগুলি অন্তর্ভুক্ত নয়, তবে এটি Array.prototype.foo = whatever
নিয়মিতভাবে নির্ধারিত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে। কিন্তু — এবং এখানে কিকার — যদি আপনি একটি অ-গণনাযোগ্য সম্পত্তি ওভাররাইট করেন, যেমন Array.prototype.sort = whatever
, এটি অ-গণনাযোগ্য থেকে যায়।
বর্তমানে, Array.prototype.flatten = mooToolsFlattenImplementation
একটি গণনাযোগ্য flatten
সম্পত্তি তৈরি করে, তাই এটি পরে Elements
অনুলিপি করা হয়। কিন্তু যদি ব্রাউজারগুলি flatten
এর একটি নেটিভ সংস্করণ পাঠায়, তবে এটি অ-গণনাযোগ্য হয়ে যায় এবং Elements
অনুলিপি করা হয় না । MooTools' Elements.prototype.flatten
এর উপর নির্ভরশীল যেকোন কোড এখন ভাঙা।
যদিও মনে হচ্ছে নেটিভ Array.prototype.flatten
কে গণনাযোগ্য হিসাবে পরিবর্তন করলে সমস্যাটি সমাধান হবে, এটি সম্ভবত আরও বেশি সামঞ্জস্যের সমস্যা সৃষ্টি করবে। একটি অ্যারের (যা একটি খারাপ অভ্যাস, তবে এটি ঘটে) for
- in
এর উপর নির্ভরশীল প্রতিটি ওয়েবসাইট হঠাৎ করে flatten
সম্পত্তির জন্য একটি অতিরিক্ত লুপ পুনরাবৃত্তি পাবে।
এখানে বড় অন্তর্নিহিত সমস্যা হল অন্তর্নির্মিত বস্তুগুলি সংশোধন করা। নেটিভ প্রোটোটাইপ প্রসারিত করা আজকাল একটি খারাপ অভ্যাস হিসাবে গৃহীত হয়, কারণ এটি অন্যান্য লাইব্রেরি এবং তৃতীয় পক্ষের কোডের সাথে সুন্দরভাবে রচনা করে না। আপনার মালিকানাধীন না বস্তু পরিবর্তন করবেন না!
কেন আমরা শুধু বিদ্যমান নাম রাখি না এবং ওয়েব ভাঙব না?
1996 সালে, CSS ব্যাপক হওয়ার আগে এবং "HTML5" একটি জিনিস হয়ে ওঠার অনেক আগে, Space Jam ওয়েবসাইটটি লাইভ হয়ে গিয়েছিল। আজ, ওয়েবসাইটটি 22 বছর আগে একইভাবে কাজ করে।
কিভাবে যে ঘটল? কেউ কি এই সমস্ত বছর ধরে সেই ওয়েবসাইটটি বজায় রেখেছিল, প্রতিবার ব্রাউজার বিক্রেতারা একটি নতুন বৈশিষ্ট্য প্রেরণ করার সময় এটি আপডেট করে?
এটি দেখা যাচ্ছে, "ওয়েব ভাঙবেন না" হল এইচটিএমএল, সিএসএস, জাভাস্ক্রিপ্ট এবং ওয়েবে ব্যাপকভাবে ব্যবহৃত অন্য যেকোন স্ট্যান্ডার্ডের জন্য এক নম্বর ডিজাইন নীতি ৷ যদি একটি নতুন ব্রাউজার বৈশিষ্ট্য শিপিংয়ের কারণে বিদ্যমান ওয়েবসাইটগুলি কাজ করা বন্ধ করে দেয়, তবে এটি সবার জন্য খারাপ:
- ক্ষতিগ্রস্ত ওয়েবসাইটের দর্শকরা হঠাৎ করে একটি ভাঙা ব্যবহারকারীর অভিজ্ঞতা পান;
- ওয়েবসাইটের মালিকরা কোনো কিছু পরিবর্তন না করেই একটি নিখুঁতভাবে কাজ করা ওয়েবসাইট থেকে একটি অ-কার্যকর ওয়েবসাইটে চলে যান;
- নতুন বৈশিষ্ট্য শিপিং ব্রাউজার বিক্রেতারা বাজারের শেয়ার হারায়, কারণ ব্যবহারকারীরা "এটি ব্রাউজার X-এ কাজ করে" লক্ষ্য করার পরে ব্রাউজার পরিবর্তন করে;
- একবার সামঞ্জস্যের সমস্যা জানা গেলে, অন্যান্য ব্রাউজার বিক্রেতারা এটি পাঠাতে অস্বীকার করে। বৈশিষ্ট্যের স্পেসিফিকেশন বাস্তবতার সাথে মেলে না ( "কল্পকাহিনীর কাজ ছাড়া কিছুই নয়" ), যা মানককরণ প্রক্রিয়ার জন্য খারাপ।
অবশ্যই, রেট্রোস্পেক্টে MooTools ভুল কাজ করেছে — কিন্তু ওয়েব ভাঙ্গা তাদের শাস্তি দেয় না, এটি ব্যবহারকারীদের শাস্তি দেয়। এই ব্যবহারকারীরা জানেন না একটি moo টুল কি। বিকল্পভাবে, আমরা অন্য সমাধান খুঁজে পেতে পারি, এবং ব্যবহারকারীরা ওয়েব ব্যবহার চালিয়ে যেতে পারেন। পছন্দ করা সহজ.
এর মানে কি খারাপ API গুলি কখনই ওয়েব প্ল্যাটফর্ম থেকে সরানো যাবে না?
এটা নির্ভর করে। বিরল ক্ষেত্রে, ওয়েব থেকে খারাপ বৈশিষ্ট্যগুলি সরানো যেতে পারে । এমনকি কেবলমাত্র একটি বৈশিষ্ট্য অপসারণ করা সম্ভব কিনা তা খুঁজে বের করা একটি অত্যন্ত জটিল প্রচেষ্টা, কতগুলি ওয়েব পৃষ্ঠাগুলি তাদের আচরণ পরিবর্তন করবে তা পরিমাপ করার জন্য ব্যাপক টেলিমেট্রির প্রয়োজন৷ কিন্তু যখন বৈশিষ্ট্যটি যথেষ্ট অনিরাপদ, ব্যবহারকারীদের জন্য ক্ষতিকর, বা খুব কমই ব্যবহার করা হয়, তখন এটি করা যেতে পারে।
<applet>
, <keygen>
, এবং showModalDialog()
হল সব খারাপ API-এর উদাহরণ যা সফলভাবে ওয়েব প্ল্যাটফর্ম থেকে সরানো হয়েছে।
কেন আমরা শুধু MooTools ঠিক করব না?
MooTools প্যাচ করা যাতে এটি আর অন্তর্নির্মিত বস্তুগুলিকে প্রসারিত না করে একটি ভাল ধারণা৷ যাইহোক, এটি হাতে সমস্যার সমাধান করে না। এমনকি যদি MooTools একটি প্যাচ করা সংস্করণ প্রকাশ করে, তবে এটি ব্যবহার করে বিদ্যমান সমস্ত ওয়েবসাইটগুলিকে সামঞ্জস্য সমস্যা দূর করার জন্য আপডেট করতে হবে।
লোকেরা কি তাদের MooTools এর অনুলিপি আপডেট করতে পারে না?
একটি নিখুঁত বিশ্বে, MooTools একটি প্যাচ প্রকাশ করবে, এবং MooTools ব্যবহার করে প্রতিটি ওয়েবসাইট জাদুকরীভাবে পরের দিন আপডেট হবে। সমস্যা সমাধান, তাই না?!
দুর্ভাগ্যক্রমে, এটি অবাস্তব। এমনকি যদি কেউ কোনোভাবে প্রভাবিত ওয়েবসাইটের সম্পূর্ণ সেট শনাক্ত করতে পারে, তাদের প্রত্যেকের যোগাযোগের তথ্য খুঁজে বের করতে পারে, সফলভাবে সমস্ত ওয়েবসাইটের মালিকদের সাথে যোগাযোগ করতে পারে এবং তাদের সবাইকে আপডেটটি সম্পাদন করতে রাজি করাতে পারে (যার অর্থ হতে পারে তাদের রিফ্যাক্টরিং সম্পূর্ণ কোড বেস), পুরো প্রক্রিয়াটি সর্বোত্তমভাবে কয়েক বছর সময় নেবে।
মনে রাখবেন যে এই ওয়েবসাইটগুলির মধ্যে অনেকগুলি পুরানো এবং সম্ভবত অপরিবর্তিত। এমনকি রক্ষণাবেক্ষণকারী এখনও আশেপাশে থাকলেও, তারা আপনার মতো উচ্চ-দক্ষ ওয়েব ডেভেলপার নাও হতে পারে। আমরা আশা করতে পারি না যে ওয়েব সামঞ্জস্যের সমস্যার কারণে সবাই গিয়ে তাদের 8 বছর বয়সী ওয়েবসাইট পরিবর্তন করবে।
TC39 প্রক্রিয়া কিভাবে কাজ করে?
TC39 হল ECMAScript স্ট্যান্ডার্ডের মাধ্যমে জাভাস্ক্রিপ্ট ভাষা বিকশিত করার দায়িত্বে থাকা কমিটি।
#SmooshGate এর কারণে কেউ কেউ বিশ্বাস করে যে “TC39 flatten
টু smoosh
নাম পরিবর্তন করতে চায়”, কিন্তু এটি এমন একটি রসিকতা ছিল যা বাহ্যিকভাবে ভালভাবে যোগাযোগ করা হয়নি। একটি প্রস্তাবের নাম পরিবর্তন করার মতো প্রধান সিদ্ধান্তগুলি হালকাভাবে নেওয়া হয় না, একক ব্যক্তি দ্বারা নেওয়া হয় না এবং একটি একক GitHub মন্তব্যের ভিত্তিতে রাতারাতি নেওয়া হয় না।
TC39 বৈশিষ্ট্য প্রস্তাবের জন্য একটি পরিষ্কার স্টেজিং প্রক্রিয়ার উপর কাজ করে। ECMAScript প্রস্তাবনা এবং তাদের মধ্যে যে কোন বড় পরিবর্তন (পদ্ধতি পরিবর্তন সহ) TC39 মিটিংয়ে আলোচনা করা হয়, এবং তারা অফিসিয়াল হওয়ার আগে সম্পূর্ণ কমিটির দ্বারা অনুমোদিত হতে হবে। Array.prototype.flatten
এর ক্ষেত্রে, প্রস্তাবটি ইতিমধ্যেই চুক্তির বিভিন্ন ধাপ অতিক্রম করেছে, পর্যায় 3 পর্যন্ত, এই বৈশিষ্ট্যটি ওয়েব ব্রাউজারে প্রয়োগ করার জন্য প্রস্তুত। বাস্তবায়নের সময় অতিরিক্ত বিশেষ সমস্যাগুলি আসা সাধারণ। এই ক্ষেত্রে, এটি পাঠানোর চেষ্টা করার পরে সবচেয়ে গুরুত্বপূর্ণ প্রতিক্রিয়া এসেছে: বৈশিষ্ট্যটি, তার বর্তমান অবস্থায়, ওয়েবকে ভেঙে দেয়। এই ধরনের ভবিষ্যদ্বাণী করা কঠিন সমস্যাগুলি ব্রাউজারগুলি একটি বৈশিষ্ট্য পাঠালে TC39 প্রক্রিয়াটি শেষ হয় না কেন তার একটি অংশ।
TC39 ঐকমত্যের ভিত্তিতে কাজ করে, যার অর্থ কমিটিকে যেকোনো নতুন পরিবর্তনের বিষয়ে সম্মত হতে হবে। এমনকি যদি smoosh
একটি গুরুতর পরামর্শ হয়ে থাকে, তাহলে মনে হচ্ছে কমিটির সদস্য compact
বা chain
মতো আরও সাধারণ নামের পক্ষে এটিতে আপত্তি করবেন।
flatten
থেকে smoosh
নামকরণ (এমনকি যদি এটি একটি রসিকতা নাও হতো) TC39 মিটিংয়ে কখনোই আলোচনা করা হয়নি। যেমন, এই বিষয়ে অফিসিয়াল TC39 অবস্থান বর্তমানে অজানা। পরবর্তী মিটিংয়ে ঐকমত্য না হওয়া পর্যন্ত কোনো একক ব্যক্তি TC39-এর সকলের পক্ষে কথা বলতে পারবে না।
TC39 সভাগুলি সাধারণত অত্যন্ত বৈচিত্র্যময় ব্যাকগ্রাউন্ডের লোকেরা অংশগ্রহণ করে: কারও কারও কয়েক বছরের প্রোগ্রামিং ভাষা ডিজাইনের অভিজ্ঞতা রয়েছে, অন্যরা একটি ব্রাউজার বা জাভাস্ক্রিপ্ট ইঞ্জিনে কাজ করে এবং জাভাস্ক্রিপ্ট বিকাশকারী সম্প্রদায়ের প্রতিনিধিত্ব করার জন্য ক্রমবর্ধমান সংখ্যক পরিচারক রয়েছে।
কিভাবে SmooshGate শেষ পর্যন্ত সমাধান করা হয়েছিল?
মে 2018 TC39 মিটিং চলাকালীন, #SmooshGate আনুষ্ঠানিকভাবে flatten
-এ flat
নামকরণ করে সমাধান করা হয়েছিল।
Array.prototype.flat
এবং Array.prototype.flatMap
V8 v6.9 এবং Chrome 69 এ পাঠানো হয়েছে।