প্রথম যুক্তি হিসাবে ত্রুটি বা ত্রুটির জন্য বিভিন্ন কলব্যাক?


12

ত্রুটি পরিচালনার বিষয়ে আমাদের লিটল-এক্সএইচআর লাইব্রেরি সম্পর্কে আমরা (এবং জেএস এসও চ্যাট রুম) কিছুদিন আগে @ রলেমনের সাথে আলাপ করেছি ।

মূলত, আমরা সিদ্ধান্ত নিতে চেয়েছিলাম যে কোন ত্রুটি পরিচালনার ধরণটি ব্যবহার করা উচিত:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

বা:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

একটি হ'ল আরও jQuery- মত, অন্যটি আরও নোড-মত। কেউ কেউ বলেন যে প্রথম প্যাটার্নটি আপনাকে ত্রুটি পরিচালনা করার বিষয়ে আরও ভাবতে বাধ্য করে। আমি বিপরীত মনে করি, যেহেতু আপনি অন্যান্য কলব্যাক ফাংশনটি ভুলে যেতে পারেন, তবে যুক্তিটি সর্বদা দ্বিতীয় প্যাটার্নে থাকে।

এই উভয় নিদর্শন সম্পর্কে কোন মতামত / সুবিধা / অপূর্ণতা?


xhr.get({ ... }, function (err, data) {})কমপক্ষে প্যাটার্নটি সঠিকভাবে পান
রায়নস

উত্তর:


5

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

আমি ব্যক্তিগতভাবে পছন্দ করি

(err, data)কারণ এটি জিনিসগুলি পরিচালনা করার একটি আদর্শ উপায় way এটি ফাংশন রচনা জন্য অনুমতি দেয়।

উদাহরণস্বরূপ after.mapএই প্যাটার্নটি ব্যবহার করে। কোড পছন্দ

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

সরলীকরণ করা যেতে পারে

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

আরেকটি সুবিধা হ'ল আপনি একটি সর্বশেষ প্যারামিটার হিসাবে কলব্যাকে পাস করতে পারেন

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

কলব্যাক শেষ পদ্ধতির একটি দুর্দান্ত এপিআই পরিচিতি পন্থা।

আরও একটি সুবিধা হ'ল আপনি সহজেই errorআপনার অবজেক্টকে আক্ষরিক মধ্যে হ্যান্ডলারটি সেট করতে ভুলে যেতে পারেন বা এটি কোনও ধরণের ডিফল্ট ত্রুটি হ্যান্ডলারের সাথে সেট করতে পারেন।

আপনি যখন (err, data)এটি ব্যবহার করছেন আপনাকে প্রতিবার কীভাবে এই ত্রুটিটি দক্ষতার সাথে পরিচালনা করতে হবে তা ভাবতে মনে করিয়ে দেয়।


2

সাধারণত, আমি মনে রাখতে চাই যে স্পষ্টত সর্বদা অন্তর্নিহিতের চেয়ে ভাল।

এটি ব্যবহার করে, আমি সাধারণত স্পষ্ট successএবং failureফাংশনগুলির সাথে থাকি - আপনি জানেন যে আপনি সেই কোডটি খোলার মুহুর্তের সাথে ঠিক কীভাবে কাজ করছেন - সাফল্য কলগুলি সফলভাবে শেষ হয়েছে, যখন ত্রুটি একটি কল রয়েছে যা কল করেছিল deals

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

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

এবং এই ধরণের বয়লারপ্লেট বিরক্তিকর হয়ে ওঠে, দ্রুত।

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


আপনার হারিয়ে যাওয়া ত্রুটি কলব্যাক এবং আপনার প্রথম errপ্যারামিটারটি পরিচালনা না করা দেখতে আরও সহজ
রায়নোস

2

কলব্যাক পৃথক করুন

যদি xhr.get()কলটি সফল হয় তবে errতা অনর্থক। কল ব্যর্থ হলে। dataঅপ্রয়োজনীয়। এক বা অন্যের অবস্থা যাচাই করতে ক্লায়েন্ট কোডকে জোর করার পরিবর্তে উভয়কেই পাস করবেন না।

যদি এটি সক্রিয় হয় যে সাফল্য আংশিক সাফল্যের প্রতিনিধিত্ব করতে পারে, তবে আলাদাভাবে এটি নির্দেশ করুন। ব্যর্থতা সাধারণত জামিন-আউট বিকল্প।

আমি এমন বিকাশকারীদের সাথে কাজ করেছি যা কেবলমাত্র সাফল্যের কেসটিকেই পরিচালনা করে এবং অনেক পরিস্থিতিতে কেবল একটি সাফল্য কলব্যাক প্রয়োগ করা এই ক্ষেত্রে যথেষ্ট। সাফল্যের ধারনা হওয়ায় একটি স্টাইল প্রোগ্রামিংয়ের জন্য একটি মাল্টি-স্টেট কলব্যাক বিপর্যয়কর বিকল্প হবে।

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