এপিআই ডিজাইনে, অ্যাডহক পলিমারফিজমটি কখন ব্যবহার / এড়ানো হবে?


14

সু জাভাস্ক্রিপ্ট লাইব্রেরি ডিজাইন করছে Magician.js,। এর লঞ্চপিনটি এমন একটি ফাংশন যা Rabbitপাস হওয়া যুক্তির বাইরে বের করে।

তিনি জানেন যে এর ব্যবহারকারীরা একটি খরগোশকে এ String, ক Number, এ Function, সম্ভবত এমনকি একটি থেকেও টেনে আনতে চাইতে পারে HTMLElement। এই বিষয়টি মাথায় রেখেই তিনি তার এপিআই এর মতো ডিজাইন করতে পারলেন :

কঠোর ইন্টারফেস

Magician.pullRabbitOutOfString = function(str) //...
Magician.pullRabbitOutOfHTMLElement = function(htmlEl) //...

উপরের উদাহরণে প্রতিটি ফাংশন ফাংশন নাম / প্যারামিটার নামের মধ্যে নির্দিষ্ট টাইপের আর্গুমেন্ট কীভাবে পরিচালনা করতে হবে তা জানতে হবে।

বা, তিনি এটি যেমন নকশা করতে পারে:

"অ্যাডহক" ইন্টারফেস

Magician.pullRabbit = function(anything) //...

pullRabbitবিভিন্ন প্রত্যাশিত ধরণের বিভিন্ন কারণে যে anythingযুক্তি হতে পারে, সেই সাথে (অবশ্যই) একটি অপ্রত্যাশিত প্রকারের জন্য অ্যাকাউন্ট করতে হবে:

Magician.pullRabbit = function(anything) {
  if (anything === undefined) {
    return new Rabbit(); // out of thin air
  } else if (isString(anything)) {
    // more
  } else if (isNumber(anything)) {
    // more
  }
  // etc.
};

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

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


উত্তর:


7

কিছু ভাল এবং কনস

পলিমারফিকের জন্য পেশাদার:

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

অ্যাড-হক জন্য পেশাদাররা:

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

কিছু বিকল্প সমাধান:

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

আমি ভাবতে পারি এমন দুটি দুর্দান্ত সমাধান রয়েছে:

  • বস্তুগুলিকে উঁচু করে তোলা, অবজেক্টগুলিকে "টেনে তোলা" করা, এগুলি রান-টাইমে ইন্টারফেসের সাথে সামঞ্জস্য করা, তারপরে ম্যাজিশিয়ানকে টানা যায় এমন বস্তুগুলিতে কাজ করা।
  • কৌশল প্যাটার্ন ব্যবহার করে যাদুকরকে বিভিন্ন ধরণের অবজেক্টগুলি কীভাবে পরিচালনা করতে হবে তা গতিময়ভাবে শেখানো।

সমাধান 1: উত্থাপনকারী বিষয়গুলি

এই সমস্যার একটি সাধারণ সমাধান হ'ল খরগোশগুলি এড়িয়ে যাওয়ার ক্ষমতা সহ বস্তুগুলিকে 'উন্নত' করা।

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

function makePullable(obj){
   obj.pullOfHat = function(){
       return new Rabbit(obj.toString());
   }
}

আমি makePullableঅন্যান্য অবজেক্টের জন্য এই জাতীয় ফাংশন তৈরি করতে পারি, আমি একটি তৈরি করতে makePullableStringপারি ইত্যাদি। আমি প্রতিটি ধরণের রূপান্তরকে সংজ্ঞায়িত করছি। যাইহোক, আমি আমার জিনিসগুলি উন্নত করার পরে, এগুলি জেনেরিক উপায়ে ব্যবহার করার মতো আমার কোনও প্রকার নেই। জাভাস্ক্রিপ্ট মধ্যে একটি ইন্টারফেস একটি হাঁস টাইপিং দ্বারা নির্ধারিত হয়, যদি এটি একটি হয়েছে pullOfHatপদ্ধতি আমি করতে যাদুকরের পদ্ধতি সঙ্গে এটি টান।

তারপরে যাদুকর এটি করতে পারে:

Magician.pullRabbit = function(pullable) {
    var rabbit = obj.pullOfHat();
    return {rabbit:rabbit,text:"Tada, I pulled a rabbit out of "+pullable};
}

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

এই জাতীয় কোডটি কেমন দেখতে পারে তার একটি উদাহরণ এখানে

সমাধান 2: কৌশল প্যাটার্ন

স্ট্যাকওভারফ্লোতে জেএস চ্যাট রুমে এই প্রশ্নটি নিয়ে আলোচনা করার সময় আমার বন্ধু ফিনোমোনমোনমিনাল কৌশল প্যাটার্নটি ব্যবহারের পরামর্শ দিয়েছিল ।

এটি আপনাকে রান সময়গুলিতে খরগোশগুলিকে রান করার সময় বিভিন্ন সময় টানতে সক্ষম করার সুযোগ দেয় এবং খুব জাভাস্ক্রিপ্ট'এ কোড তৈরি করে। একজন যাদুকর শিখতে পারেন কীভাবে বিভিন্ন ধরণের জিনিসগুলি টুপিগুলির বাইরে টানতে হয় এবং এটি সেই জ্ঞানের উপর ভিত্তি করে এগুলিকে টান দেয়।

কফিস্ক্রিপ্টে এটি কীভাবে দেখাবে তা এখানে:

class Magician
  constructor: ()-> # A new Magician can't pull anything
     @pullFunctions = {}

  pullRabbit: (obj) -> # Pull a rabbit, handler based on type
    func = pullFunctions[obj.constructor.name]
    if func? then func(obj) else "Don't know how to pull that out of my hat!"

  learnToPull: (obj, handler) -> # Learns to pull a rabbit out of a type
    pullFunctions[obj.constructor.name] = handler

আপনি এখানে সমান জেএস কোড দেখতে পারেন ।

এইভাবে, আপনি উভয় দুনিয়া থেকে উপকৃত হন, কীভাবে টানবেন তার ক্রিয়াটি কোনও বস্তুর সাথে শক্তভাবে মিলিত হয় না, বা যাদুকর এবং আমি মনে করি এটি খুব সুন্দর সমাধানের জন্য তৈরি করে।

ব্যবহার এমন কিছু হবে:

var m = new Magician();//create a new Magician
//Teach the Magician
m.learnToPull("",function(){
   return "Pulled a rabbit out of a string";
});
m.learnToPull({},function(){
   return "Pulled a rabbit out of a Object";
});

m.pullRabbit(" Str");


2
আমি এটির খুব সূক্ষ্ম উত্তরের জন্য এটি +10 করতাম, যা থেকে আমি অনেক কিছু শিখেছি, তবে, এসই নিয়ম অনুসারে, আপনাকে +1 ... :-) স্থির করতে হবে
মার্জান ভেনেমা

@ মারজানভেনেমা অন্যান্য উত্তরগুলিও ভাল, সেগুলিও পড়তে ভুলবেন না। আমি আনন্দিত আপনি এটি উপভোগ করেছেন। দ্বিধা বোধ এবং আরও নকশা প্রশ্ন জিজ্ঞাসা করুন।
বেনিয়ামিন গ্রুইনবাউম

4

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

সেরা এপিআই তৈরি করতে উত্তরটি হ'ল আপনার উভয়ই প্রয়োগ করা উচিত। এটি কিছুটা বেশি টাইপিং, তবে আপনার API এর ব্যবহারকারীদের জন্য দীর্ঘমেয়াদে অনেক কাজ বাঁচাবে।

pullRabbitকেবল একটি সালিশ পদ্ধতি হওয়া উচিত যা প্রকারগুলি পরীক্ষা করে এবং সেই বস্তুর প্রকারের সাথে সম্পর্কিত যথাযথ ফাংশনকে কল করে (যেমন pullRabbitOutOfHtmlElement)।

এইভাবে, প্রোটোটাইপ করার সময় ব্যবহারকারীরা ব্যবহার করতে পারেন pullRabbit, তবে যদি তারা মন্দা দেখেন তবে তারা প্রান্তটি পরীক্ষা করে তাদের শেষের দিকে (সম্ভবত দ্রুততর উপায়) প্রয়োগ করতে পারেন এবং কেবল pullRabbitOutOfHtmlElementসরাসরি কল করতে পারেন ।


2

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

সুতরাং আপনার কেক রাখুন এবং এটিও খান এবং সবকিছুকে সত্যই, সত্যই স্পষ্ট করে যেমন নামী রেখে এবং সমস্ত সঠিক জায়গায় সঠিক সঠিক বিবরণ দিয়ে টাইপ বিভ্রান্তি এবং অপ্রয়োজনীয় ভাঙ্গন এড়াতে শিখুন।

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

String.prototype.pullRabbit = function(){
    //do something string-relevant
}

HTMLElement.prototype.pullRabbit = function(){
    //do something HTMLElement-relevant
}

Magician.pullRabbitFrom = function(someThingy){
    return someThingy.pullRabbit();
}

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

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

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

var rabbitPullMap = {
    String: ( function pullRabbitFromString(){
        //do stuff here
    } ),
    //parens so we can assign named functions if we want for helpful debug
    //yes, I've been inconsistent. It's just a nice unrelated trick
    //when you want a named inline function assignment

    HTMLElement: ( function pullRabitFromHTMLElement(){
        //do stuff here
    } )
}

Magician.pullRabbitFrom = function(someThingy){
    return rabbitPullMap[someThingy.constructor.name]();
}

বা একই মানচিত্রের পদ্ধতির ব্যবহার করে আপনি যদি বিভিন্ন অবজেক্টের ধরণের 'এই' উপাদানটিতে তাদের ব্যবহার করতে ব্যবহার করতে চান তবে তাদের উত্তরাধিকার সূত্রে প্রাপ্ত প্রোটোটাইপগুলিকে স্পর্শ না করেই তারা পদ্ধতি ছিল:

var rabbitPullMap = {
    String: ( function(obj){

    //yes the anon wrapping funcs would make more sense in one spot elsewhere.

        return ( function pullRabbitFromString(obj){
            var rabbitReach = this.match(/rabbit/g);
            return rabbitReach.length;
        } ).call(obj);
    } ),

    HTMLElement: ( function(obj){
        return ( function pullRabitFromHTMLElement(obj){
            return this.querySelectorAll('.rabbit').length;
        } ).call(obj);
    } )
}

Magician.pullRabbitFrom = function(someThingy){

    var
        constructorName = someThingy.constructor.name,
        rabbitCnt = rabbitPullMap[constructorName](someThingy);

    console.log(
        [
            'The magician pulls ' + rabbitCnt,
            rabbitCnt === 1 ? 'rabbit' : 'rabbits',
            'out of her ' + constructorName + '.',
            rabbitCnt === 0 ? 'Boo!' : 'Yay!'
        ].join(' ');
    );
}

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

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


1

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

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

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

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


0

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

  • স্ট্রিংস?
  • অ্যারেগুলির?
  • মানচিত্র?
  • প্রবাহের?
  • কার্যাবলী?
  • ডেটাবেস?

অস্পষ্টতা বুঝতে সময় লাগে। আমি এমনকি দৃ convinced় বিশ্বাস করি না যে এটি দ্রুত লেখার পক্ষে:

Magician.pullRabbit = function(anything) {
  if (anything === undefined) {
    return new Rabbit(); // out of thin air
  } else if (isString(anything)) {
    // more
  } else if (isNumber(anything)) {
    // more
  } else {
      throw new Exception("You can't pull a rabbit out of that!");
  }
  // etc.
};

বনাম:

Magician.pullRabbitFromAir = fromAir() {
    return new Rabbit(); // out of thin air
}
Magician.pullRabbitFromStr = fromString(str)) {
    // more
}
Magician.pullRabbitFromInt = fromInt(int)) {
    // more
};

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


কেবল আপনাকে
জানাতেই

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