অ্যারের "প্রত্যেক" বা "কিছু" এর পার্শ্ব প্রতিক্রিয়াগুলি কি খারাপ?


9

আমাকে সবসময় শেখানো হয়েছে যে কোনও ifঅবস্থায় পার্শ্ব প্রতিক্রিয়াগুলি খারাপ are আমি কি মানে হয়;

if (conditionThenHandle()) {
    // do effectively nothing
}

... উল্টোদিকে;

if (condition()) {
    handle();
}

... এবং আমি তা বুঝতে পেরেছি, এবং আমার কলেজগুলি খুশী কারণ আমি এটি করি না, এবং আমরা সবাই শুক্রবার 17:00 এ বাড়িতে যাই এবং প্রত্যেকের একটি আনন্দময় উইকএন্ড হয়।

এখন, ECMAScript5 চালু মত পদ্ধতি every()এবং some()করতে Array, এবং আমি তাদের খুব দরকারী খুঁজে। এগুলির চেয়ে তারা আরও পরিষ্কার for (;;;), আপনাকে অন্য একটি সুযোগ দেয় এবং ভেরিয়েবলের মাধ্যমে উপাদানটি অ্যাক্সেসযোগ্য করে তোলে।

তবে যখন ইনপুট যাচাই, আমি আরো-প্রায়ই তুলনায়-না নিজেকে ব্যবহার খুঁজে every/ someঅবস্থায় ইনপুট যাচাই করতে, তারপর ব্যবহার every/ some আবার শরীরে একটি ব্যবহারযোগ্য মডেল মধ্যে ইনপুট রূপান্তর করতে;

if (input.every(function (that) {
    return typeof that === "number";
})) {
    input.every(function (that) {
        // Model.findById(that); etc
    }
} else {
    return;
}

... যখন আমি যা করতে চাই তা হ'ল;

if (!input.every(function (that) {
    var res = typeof that === "number";

    if (res) {
        // Model.findById(that); etc.
    }

    return res;
})) {
    return;
}

... যা আমাকে ifখারাপ অবস্থার মধ্যে পার্শ্ব-প্রতিক্রিয়া দেয় ।

তুলনায়, এই কোডটি একটি পুরানো সাথে দেখা হবে for (;;;);

for (var i=0;i<input.length;i++) {
    var curr = input[i];

    if (typeof curr === "number") {
        return;
    }

    // Model.findById(curr); etc.
}

আমার প্রশ্নগুলি হ'ল:

  1. এটি অবশ্যই একটি খারাপ অভ্যাস?
  2. আমি কি (ভুল | আব) ব্যবহার করছি someএবং every( আমি কি এর জন্য একটি ব্যবহার করা উচিতfor(;;;) ?)
  3. একটি ভাল পদ্ধতির আছে কি?

3
প্রতিটি এবং কিছু পাশাপাশি ফিল্টার, মানচিত্র এবং হ্রাস অনুসন্ধানগুলি রয়েছে তবে তাদের কোনও পার্শ্ব প্রতিক্রিয়া নেই, যদি তারা তাদেরকে আপত্তিজনক আচরণ করে।
বেনজামিন গ্রুইনবাউম

@ বেনজামিন গ্রুয়েনবাউম: সুতরাং এগুলি কি তাদের চেয়ে বেশি বার দাঁতবিহীন করে তোলে? 9/10, যদি আমি ব্যবহার করি তবে আমি উপাদানটি দিয়ে কিছুsome করতে চাই , যদি আমি ব্যবহার করি তবে আমি everyসেই সমস্ত উপাদানগুলির জন্য কিছু করতে চাই ... someএবং everyআমাকে সেই তথ্যটি অ্যাক্সেস করতে দেবে না, তাই হয় আমি পারি না এগুলি ব্যবহার করুন, বা আমার পার্শ্ব প্রতিক্রিয়া যুক্ত করতে হবে।
আইজাক

না I আমি যখন পার্শ্ব প্রতিক্রিয়াগুলি উল্লেখ করি তখন বোঝায় শরীরের না থাকলে the দেহের অভ্যন্তরে আপনি এটি যেভাবে চান তা পরিবর্তন করতে পারেন। আপনি কলব্যাকের ভিতরে থাকা অবজেক্টটিকে কেবল কিছু / কখন পাস করবেন না।
বেনজামিন গ্রুয়েনবাউম

@ বেনজামিন গ্রুয়েনবাউম: তবে এটাই আমার বক্তব্য। যদি আমি ব্যবহার someআমার মধ্যে ifশর্ত নির্ধারণ অ্যারের মধ্যে একটি নির্দিষ্ট উপাদান একটি নির্দিষ্ট সম্পত্তি, 9/10 আমি কাজ চালানোর জন্য প্রয়োজন প্রদর্শণ কিনা উপর আমার যে উপাদান ifশরীর; এখন, someআমাকে বলুন না যা উপাদানের সম্পত্তি (ঠিক "এক করেনি") বিকশিত, আমি হয় ব্যবহার করতে পারেন some আবার শরীরের (হে (2n)), বা আমি শুধু অপারেশন ভিতরে সম্পাদন করতে পারবেন যদি শর্ত ( যা খারাপ, কারণ এটি মাথার মধ্যে একটি পার্শ্ব-প্রতিক্রিয়া)।
ইসহাক

... অবশ্যই এটি একই জন্য প্রযোজ্য every
ইসহাক

উত্তর:


9

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

আসুন আপনার প্রথম উদাহরণটি ধরুন (কিছুটা সংশোধিত)

if (input.every(function (that) {
    return typeof that === "number";
})) {
    input.every(function (that) {
        that.foo();
    }
} else {
    return;
}

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

var filtered = array.filter(function(item) {
    return typeof item === "number";
});

var mapped = filtered.map(function(item) {
    return item.foo(); //provided foo() has no side effects and returns a new object of item's type instead.  See note about foreach below.
});

বিকল্পভাবে, আপনি foreachজায়গাগুলি আইটেমগুলি সংশোধন করতে মানচিত্রের পরিবর্তে ব্যবহার করতে পারেন ।

someমূলত: একই যুক্তি প্রযোজ্য

  • everyঅ্যারের সমস্ত উপাদান যদি কিছু পরীক্ষা পাস করে তবে আপনি পরীক্ষার জন্য ব্যবহার করেন।
  • someঅ্যারেতে অন্তত একটি উপাদান যদি কিছু পরীক্ষা পাস করে তবে আপনি পরীক্ষার জন্য ব্যবহার করেন।
  • আপনি mapএকটি ইনপুট অ্যারেতে প্রতিটি উপাদান জন্য 1 টি উপাদান (যা আপনার পছন্দসই একটি ফাংশন ফলাফল) সমন্বিত একটি নতুন অ্যারে ফিরে ব্যবহার করুন।
  • আপনি এই ব্যবহার filterদৈর্ঘ্য হল 0 <একটি অ্যারের ফিরে যাওয়ার length< initial array lengthউপাদান, সব মূল অ্যারের মধ্যে অন্তর্ভুক্ত এবং সব সরবরাহকৃত সম্পৃক্ত পরীক্ষা পাশ করার।
  • আপনি foreachযদি মানচিত্র চান তবে স্থানটিতে থাকেন তবে আপনি ব্যবহার করুন
  • আপনি reduceযদি কোনও একরের ফলাফলের জন্য অ্যারের ফলাফলগুলি একত্র করতে চান তবে আপনি ব্যবহার করুন (যা অ্যারে হতে পারে তবে তা করতে হবে না)।

আপনি এগুলি যত বেশি ব্যবহার করেন (এবং যত বেশি আপনি এলআইএসপি কোড লিখবেন) তত বেশি আপনি বুঝতে পারবেন যে সেগুলি কীভাবে সম্পর্কিত এবং অন্যের সাথে একটির অনুকরণ / বাস্তবায়ন কীভাবে সম্ভব। এই প্রশ্নের সাথে কী শক্তিশালী এবং সত্যই আকর্ষণীয় তা হ'ল তাদের শব্দার্থকতা এবং কীভাবে তারা আপনাকে আপনার কোডের ক্ষতিকারক পার্শ্ব-প্রতিক্রিয়াগুলি দূরীকরণের দিকে ঠেলে দেয়।

সম্পাদনা করুন (মন্তব্যের আলোকে): সুতরাং আসুন আমরা বলি যে আপনি প্রতিটি উপাদানই একটি বস্তু যাচাই করতে চান এবং সেগুলি বৈধ হলে তারা একটি অ্যাপ্লিকেশন মডেলে রূপান্তর করতে চান। একক পাসে এটি করার একটি উপায় হ'ল:

var dirty = false;
var app_domain_objects = input.map(function(item) {
    if(validate(item)) {
        return new Model(item);
    } else {
        dirty = true; //dirty is captured by the function passed to map, but you know that :)
    }
});
if(dirty) {
    //your validation test failed, do w/e you need to
} else {
    //You can use app_domain_objects
}

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

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

function apply_to_every(arr, predicate, func) {
    var passed = true;
    for(var i = 0; i < array.length; ++i) {
        if(predicate(arr[i])) {
            func(arr[i]);
        } else {
            passed = false;
            break;
        }
    }
    return passed;
}

যদিও এটি জায়গায় অ্যারে পরিবর্তন করতে হবে।

আমি আশা করি এটি সাহায্য করে, এটি লিখতে খুব মজা পেয়েছিল। চিয়ার্স!


আপনার উত্তরের জন্য ধন্যবাদ. অগত্যা আমি প্রতি সেয়ে স্থানে থাকা উপাদানগুলিকে সংশোধন করার চেষ্টা করছি না ; আমার প্রকৃত কোডে, আমি তাই আমি প্রথম করছি বস্তুর একটি JSON- বিন্যস্ত অ্যারের গ্রহণ করছি, যাচাই ইনপুট if (input.every()), চেক করতে প্রতিটি উপাদান হল একটি বস্তু ( typeof el === "object && el !== null) ইত্যাদি তারপর যদি যাচাই, আমি প্রতিটি উপাদান রূপান্তর করতে চান নিজ নিজ অ্যাপ্লিকেশন মডেল (যা, এখন আপনি উল্লেখ map()আমি ব্যবহার করতে পারে input.map(function (el) { return new Model(el); });কিন্তু অগত্যা জায়গায়
ইসহাক

.. তবে দেখুন যে এমনকি map()আমাকে দুবার অ্যারে দিয়ে পুনরাবৃত্তি করতে হচ্ছে; একবার যাচাই করতে হবে, এবং অন্য রূপান্তর করতে। যাইহোক, একটি প্রমিত ব্যবহার for(;;;)লুপ, আমি এক পুনরাবৃত্তির ব্যবহার করে এই কাজ করতে পারে, কিন্তু আমি আবেদন করতে একটি উপায় খুঁজে পাচ্ছি না every, some, mapবা filterএই দৃশ্যকল্প মধ্যে, এবং শুধুমাত্র সঞ্চালন এক পাস, অবাঞ্ছিত-পার্শ্ব প্রতিক্রিয়া থাকার বা অন্যথায়-যুক্ত উপস্থাপক ছাড়া অনুশীলন করা.
ইসহাক

@ ইসহাক ঠিক আছে, বিলম্বের জন্য দুঃখিত, আমি এখন আপনার পরিস্থিতি আরও স্পষ্টভাবে বুঝতে পারি। আমি আমার উত্তর সম্পাদনা করব কিছু জিনিস যুক্ত করতে।
pwny

দুর্দান্ত উত্তরের জন্য ধন্যবাদ; এটা সত্যিই সহায়ক হয়েছে :)।
ইসহাক

-1

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


হাই, আপনার উত্তরের জন্য ধন্যবাদ। দুঃখিত, কিন্তু পারেন আমি তোমার উত্তর ভুল বুঝে ভাবেন থাকেন, অথবা আপনি কোড ভুল ব্যাখ্যা পেয়েছেন ... আমার কোড স্নিপেট সবকিছু মধ্যে ifএকমাত্র এই শর্তে returnভিতরে হচ্ছে ifএর শরীর; স্পষ্টতই আমি কোড নমুনার কথা বলে যাচ্ছি "" যা করতে চাই তা হচ্ছে ... ...
আইজাক

1
দুঃখিত, @ ইস্যাকের পার্শ্ব প্রতিক্রিয়াগুলি প্রকৃতপক্ষে ifঅবস্থায় রয়েছে।
রস প্যাটারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.