জাভাস্ক্রিপ্টে ইনক্রিমেন্ট ("++") এবং হ্রাস ("-") অপারেটরগুলি এড়ানো কেন?


357

Jslint সরঞ্জামের জন্য একটি পরামর্শ :

++ এবং -
++ (ইনক্রিমেন্ট) এবং - (হ্রাস) অপারেটররা অত্যধিক কৌতূহলকে উত্সাহিত করে খারাপ কোডে অবদান রাখে বলে পরিচিত। তারা ভাইরাস এবং অন্যান্য সুরক্ষা সমস্যাগুলিতে সক্রিয় করার ক্ষেত্রে ত্রুটিপূর্ণ আর্কিটেকচারের পরে দ্বিতীয়। একটি প্লাসপ্লাস বিকল্প রয়েছে যা এই অপারেটরগুলির ব্যবহার নিষিদ্ধ করে।

আমি জানি পিএইচপি নির্মান যে ভালো $foo[$bar++]হয়েছে সহজে বন্ধ-বাই-এক ত্রুটিযুক্ত হতে পারে, কিন্তু আমি একটি চেয়ে লুপ নিয়ন্ত্রণ করতে একটি ভাল উপায় জিনিসটা করতে পারেনি while( a < 10 ) do { /* foo */ a++; }বা for (var i=0; i<10; i++) { /* foo */ }

Jslint তাদের হাইলাইট কারণ কিছু কিছু অনুরূপ ভাষা আছে যা "++ " এবং " --" সিনট্যাক্সের পরিচালনা করে, বা " ++" এবং " --" এড়িয়ে যাওয়ার জন্য অন্যান্য যুক্তি রয়েছে যা আমি অনুপস্থিত হতে পারি?


59
সুতরাং একটিকে অ্যারের পরিবর্তে [সূচক = সূচক + 1] করা উচিত [++ সূচক] [যদি পূর্বের এমনকি অনুমতি দেওয়া হয়!)। কি বোঝা hooey।
লরেন্স ডল

34
আমি ক্রকফোর্ডকে সূচক = সূচক + 1 করতে দেখিনি। আমি তাকে ইনডেক্স + = 1 করতে দেখেছি। আমি মনে করি এটি একটি যুক্তিসঙ্গত বিকল্প। এবং আপনি যখন 1 এর বাইরে কিছুতে পরিবর্তন আনতে চান এটির জন্য দুর্দান্ত
নসরেডা

124
ব্যক্তিগতভাবে আমি ক্রকফোর্ডের কোনও বড় অনুরাগী নই। তিনি এমন কোনও বিষয় বিবেচনা করছেন যা তার কোডে কোনও বাগটি খারাপ করেছে।
পাওলো বার্গান্টিনো

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

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

উত্তর:


408

আমার দৃষ্টিভঙ্গি হ'ল সর্বদা ++ এবং - নিজেরাই একক লাইনে ব্যবহার করতে হবে, যেমন:

i++;
array[i] = foo;

পরিবর্তে

array[++i] = foo;

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


3
হ্যাঁ, আমিও তাই করি। অন্যায় করা কঠিন এবং আপনি কী করছেন তা নির্ধারণ করা অন্য লোকের পক্ষে সহজ।
নসরেডনা

65
বিষয়টি ইস্যুটির মূল বিষয় এবং আমার বিভ্রান্তির বিষয়টি মনে হচ্ছে। একা ব্যবহৃত হয়, আমি ++; স্ফটিক পরিষ্কার। আপনি যে মিনিটটি সেই বেসিক এক্সপ্রেশনটির চারপাশে অন্যান্য কোড যুক্ত করেন, পঠনযোগ্যতা এবং স্পষ্টতা ভুগতে শুরু করে।
আর্টলং

2
সম্মত হন, তবে এটি কেবল জাভাস্ক্রিপ্ট সম্পর্কিত নয়
টোবিয়াস

5
আপনি সি বা সি ++ লিখছেন কিনা তা আপনি বলবেন না। তাত্ক্ষণিকভাবে আপনার সি ++ এ প্রিফিক্স ইনক্রিমেন্ট অপারেটরটি ব্যবহার করা উচিত, যদি iভেরিয়েবলটি পরবর্তীকালে একটি সমন্বিত শ্রেণিতে পরিণত হয়, সেই ক্ষেত্রে আপনি অযথাই একটি অস্থায়ী বস্তু তৈরি করতে চাইছেন। যদিও আমি পোস্টফিক্স অপারেটরটিকে আরও নান্দনিকভাবে আনন্দদায়ক বলে মনে করি।
এমসি 01 ই

2
আমি 1-লাইন সংস্করণ পছন্দ করি। এটি স্ট্যাক অপারেশনের স্মরণ করিয়ে দেয়। পুশ হ'ল অ্যারে [++ i] = ফু, পপ বার = অ্যারে [i--]। (তবে 0-ভিত্তিক অ্যারে, অ্যারে [i ++] = foo এবং বার = অ্যারে [- i] এখনও আরও ভাল দেখাচ্ছে)। আরেকটি বিষয়, যদি কেউ আই ++ এর মধ্যে অতিরিক্ত কোড যুক্ত করে তবে আমি এটিকে ঘৃণা করব; এবং অ্যারে [i] = foo ;.
ফ্লোরিয়ান এফ

257

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

আমি দেখতে পাচ্ছি যে কেউ কেউ কিছু নমুনা কোডের "হ্যাকিং" দূরে কীভাবে ++ এবং - এর মাধ্যমে একটি নির্দোষ ভুল করতে পারে, তবে কেন আমি অভিজ্ঞ পেশাদাররা এড়ানো উচিত তা আমি দেখতে পাই না।


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

14
@ আর্টলুং সম্ভবত "একটি অলস এবং অমনোযোগী অনভিজ্ঞ হ্যাকার" এর সাথে আরও কাজ করার ফলে সম্ভবত এই কোডটি বিভ্রান্ত হবে এবং আমি তাকে বিভ্রান্ত করতে চাই না।
ক্রিস চুদমোর

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

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

1
আমি সম্পূর্ণভাবে রাজী. ভাষার অংশ না ব্যবহার করে কেন নিজেকে প্রতিবন্ধী করবেন? পোস্ট এবং প্রাক-বৃদ্ধি এবং হ্রাস উভয়ই ব্যবহারের জন্য আমি ভাল কারণগুলি খুঁজে পাই। আমার কাছে, এর মতো একটি লাইন স্পষ্ট এবং সংক্ষিপ্ত ... যদি (--imagesLoading === 0) শুরু (); আপনি যদি মনে করেন যে আপনার কোডটি অস্পষ্ট, মন্তব্যগুলি ব্যবহার করুন!
xtempore

69

সিগুলিতে এই জাতীয় কাজ করার ইতিহাস রয়েছে:

while (*a++ = *b++);

একটি স্ট্রিং অনুলিপি করতে, সম্ভবত এটি অতিরিক্ত জালিয়াতির কারণ যার দ্বারা তিনি উল্লেখ করছেন।

এবং সবসময় কি আছে প্রশ্ন আছে

++i = i++;

অথবা

i = i++ + ++i;

আসলে কি। এটি কয়েকটি ভাষায় সংজ্ঞায়িত করা হয়েছে, এবং অন্যান্যতে কী হবে তার কোনও গ্যারান্টি নেই।

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


104
i = i ++ + ++ i; আমার চোখকে কিছুটা আঘাত করেছে - :)
হুগোয়ার

3
আমারও. এমনকি যদি সেগুলি সমস্ত একই পরিবর্তনশীল না হয়, তবে বলুন যে আমার কাছে x = a ++ + ++ বি ছিল; - এই সংমিশ্রণটি তাত্ক্ষণিকভাবে আমার মাথায় এক্স, এ এবং বি রাখা শক্ত করে তোলে। এখন, যদি প্রত্যেকে আলাদা লাইনে পৃথক স্টেটমেন্ট থাকত, যেমন - একটি ++; ++, বি; এক্স = এ + বি; এটি প্রথম দর্শনে অনুধাবন করা সহজ হবে।
আর্টলং

10
হায়, (a ++; b ++; x = a = b) এর মান (a ++ + ++ বি) এর সমান নয়।
টমাস এল Holaday

8
@ মারিয়াস: x = a+++b-> x = (a++)+b-> x = a + b; a++। টোকেনাইজারটি লোভী।
কলম রজার্স

14
অতিরিক্ত কাজের সুরক্ষার জন্য, আপনার শেষ উদাহরণের শূন্যস্থানগুলি সরিয়ে ফেলুন।
mc0e

48

আপনি যদি জাভাস্ক্রিপ্ট দ্য গুড পার্টস পড়ে থাকেন তবে দেখতে পাবেন ক্রোকফোর্ডের i ++ এর জন্য লুপের জন্য প্রতিস্থাপন i + = 1 (i = i + 1 নয়)। এটি বেশ পরিষ্কার এবং পঠনযোগ্য এবং কিছু "জটিল" তে রূপান্তরিত হওয়ার সম্ভাবনা কম।

ক্রকফোর্ড স্বতঃসিদ্ধকরণ এবং স্বতঃসংশোধনকে অস্বীকার করে জেএসলিন্টে একটি বিকল্প তৈরি করেছে। আপনি পরামর্শ অনুসরণ করবেন কিনা তা বেছে নিন।

আমার নিজস্ব ব্যক্তিগত নিয়ম স্বায়ত্তশাসন বা স্ব-স্বীকৃতিতে মিলিত কিছু না করা।

আমি সি-এর বহু বছরের অভিজ্ঞতা থেকে শিখেছি যে আমি যদি এটির ব্যবহার সহজ রাখি তবে আমি বাফারকে ছাড়িয়ে যাব (বা অ্যারে সূচকটি সীমা ছাড়িয়ে নেই)। তবে আমি আবিষ্কার করেছি যে আমি যদি একই বিবৃতিতে অন্যান্য জিনিস করার "অত্যধিক কৌতূহলী" অনুশীলনে পড়ে যাই তবে আমি বাফারকে ছাড়িয়ে যাব।

সুতরাং, আমার নিজের নিয়মের জন্য, লুপের ইনক্রিমেন্ট হিসাবে আই ++ ব্যবহার ভাল।


"প্লসপ্লাস" বিকল্প সম্পর্কে দুর্দান্ত পয়েন্টটি কেবল এটিই একটি বিকল্প। আপনার এবং অন্যান্য উত্তরের উপর ভিত্তি করে আমার মনে হয় যে আমি এই ধারণাটি পেয়ে যাচ্ছি যে ++ নিজেই বা একটি লুপের মধ্যে নেই এবং তারা নিজেরাই বিভ্রান্ত করছে। দ্বিতীয়টি যে আপনি ++ কে অন্য বিবৃতিতে মিশ্রিত করেন আপনি তার স্টেটমেন্টটি প্রসঙ্গে পড়তে ও বুঝতে আরও কঠিন হয়ে উঠেন।
আর্টলং

6
প্রত্যেকে বাফার উপচে পড়ে। এমনকি ওপেনএসএসএইচ ওপেন সোর্স এবং তাদের পুনর্বিবেচনার একাধিক কমিটিকে
এরিক

11
@ এরিক আপনার পাঁচ বছরের পুরানো মন্তব্যটির পুনর্বিবেচনা: ওহ, আপনি কতটা সঠিক ছিলেন!
wchargin

27

একটি লুপে এটি ক্ষতিকারক নয়, তবে একটি কার্যবিজ্ঞানের বিবৃতিতে এটি অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে:

var x = 5;
var y = x++; // y is now 5 and x is 6
var z = ++x; // z is now 7 and x is 7

চলক এবং অপারেটরের মধ্যে শ্বেত স্পেস অপ্রত্যাশিত ফলাফলও ডেকে আনতে পারে:

a = b = c = 1; a ++ ; b -- ; c; console.log('a:', a, 'b:', b, 'c:', c)

বন্ধের সময়, অপ্রত্যাশিত ফলাফলগুলিও একটি সমস্যা হতে পারে:

var foobar = function(i){var count = count || i; return function(){return count++;}}

baz = foobar(1);
baz(); //1
baz(); //2


var alphabeta = function(i){var count = count || i; return function(){return ++count;}}

omega = alphabeta(1);
omega(); //2
omega(); //3

এবং এটি একটি নতুন লাইনের পরে স্বয়ংক্রিয় সেমিকোলন সন্নিবেশকে ট্রিগার করে:

var foo = 1, bar = 2, baz = 3, alpha = 4, beta = 5, delta = alpha
++beta; //delta is 4, alpha is 4, beta is 6

প্রিনক্রেনমেন্ট / পোস্ট-ইনক্রিমেন্ট বিভ্রান্তি একের পর এক ত্রুটি তৈরি করতে পারে যা নির্ণয় করা অত্যন্ত কঠিন are ভাগ্যক্রমে, এগুলিও সম্পূর্ণ অপ্রয়োজনীয়। ভেরিয়েবলে 1 যুক্ত করার আরও ভাল উপায় রয়েছে।

তথ্যসূত্র


13
আপনি যদি অপারেটরটি বুঝতে পারেন তবে সেগুলি "অপ্রত্যাশিত" নয়। এটি কখনও ব্যবহার না করার মতো ==কারণ আপনি ==এবং এর মধ্যে পার্থক্য বুঝতে পারেন না ===
গ্রেগ 84

1
যথাযথভাবে। একটি সি # প্রশ্ন রয়েছে যা মিথ্যা অনুমানগুলি বাতিল করে।
পল সুইট

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

আপনার হোয়াইটস্পেসের লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
রুসলান

আপনার "হোয়াইটস্পেস" উদাহরণটি কী জটিল? আমি একটি সরল আউটপুট পেতে a: 2 b: 0 c: 1। আমি প্রথম উদাহরণে ("অ্যাসাইনমেন্ট স্টেটমেন্ট") তে কোনও অদ্ভুত বা অপ্রত্যাশিত কিছুই দেখতে পাচ্ছি না।
কেন উইলিয়ামস

17

নিম্নলিখিত কোড বিবেচনা করুন

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[i++] = i++;
    a[i++] = i++;
    a[i++] = i++;

যেহেতু আউটপুট দ্বিগুণ হয় তার দ্বিগুণ (+2005 ডিবাগার থেকে)

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

এখন নিম্নলিখিত কোড বিবেচনা করুন:

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = ++i;
    a[++i] = ++i;
    a[++i] = ++i;

লক্ষ্য করুন আউটপুট একই। এখন আপনি ভাবতে পারেন যে ++ i এবং i ++ একই। তারা না

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

শেষ পর্যন্ত এই কোড বিবেচনা করুন

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = i++;
    a[++i] = i++;
    a[++i] = i++;

আউটপুট এখন:

    [0] 0   int
    [1] 1   int
    [2] 0   int
    [3] 3   int
    [4] 0   int
    [5] 5   int

সুতরাং এগুলি একই নয়, উভয়কেই মিশ্রিত করা এতটা স্বজ্ঞাত আচরণের নয়। আমি মনে করি লুপগুলি ++ এর সাথে ঠিক আছে তবে একই লাইনে বা একই নির্দেশিকায় যখন আপনার একাধিক ++ চিহ্ন থাকে তখন নজর রাখুন


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

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

4
আপনি দেখিয়েছেন যে দুটি ভিন্ন ভিন্ন কোডের কোড বিভিন্ন আউটপুট উত্পাদন করে এবং এটি খারাপ প্রমাণ করে?
নিকফ

7
উপসংহারটি হ'ল "আপনার যখন একই লাইনে বা একই নির্দেশিকায় একাধিক ++ চিহ্ন রয়েছে তখন নজর রাখুন"। আমি মনে করি না আপনি এটি পড়েছেন
এরিক

1
"যেহেতু আমি ++ দ্বিগুণ মূল্যায়ন করি" - ভুল! সিকোয়েন্স পয়েন্টগুলির মধ্যে দুবার একটি ভেরিয়েবল সংশোধন করা এবং এটি ব্যবহার করা সি ++ এ অবৈধ এবং অপরিজ্ঞাত আচরণের দিকে পরিচালিত করে। তাই সংকলক যা খুশি তা করতে পারে। এখানে উপস্থাপিত ফলাফলগুলি সংকলক বাস্তবায়নের দুর্ঘটনাজনক।
টিবলার

16

"প্রি" এবং "পোস্ট" ইনক্রিমেন্টের প্রকৃতি এবং হ্রাস অপারেটরগুলি তাদের সাথে বিভ্রান্তিকর হতে পারে যারা তাদের সাথে পরিচিত নয়; এটি এমন এক উপায় যাতে তারা কৃপণ হতে পারে।


29
একমত; তবে, অভিজ্ঞ পেশাদারকে বিভ্রান্ত করা উচিত নয়।
নোট

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

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

1
@ মাইক: হ্যাঁ, খেয়াল করুন কীভাবে আমি কোডটির মূল লেখকের জন্য বা পরবর্তী রক্ষণাবেক্ষণকারীদের জন্য অপারেটরদের কৌশলী হতে পারে কিনা তা নির্দিষ্ট করেছিলাম না। সাধারণত, আমরা ধরে নেওয়ার চেষ্টা করি যে আসল কোডারগুলি তাদের সাথে পরিচিত / আরামদায়ক নয় এমন কনস্ট্রাক্ট ব্যবহার করেন না (দুঃখের বিষয়, এটি প্রায়শই একটি ভুল ধারণা) um তবে, সেই পরিচিতি অবশ্যই রক্ষণাবেক্ষণকারীদের জন্য প্রসারিত হয় না (এবং উপরে প্যারেন্টিকভাবে উল্লিখিত হিসাবে, এমনকি প্রাচ্য লেখকের কাছেও প্রসারিত নাও হতে পারে)।
পল সোনিয়ার

আমি অন্যান্য প্রোগ্রামারদের পড়ার জন্য আমার কোডটি লেখার চেষ্টা করি, তবে নতুনদের পড়ার জন্য আমি এটি লেখার চেষ্টা করি না
লুক এইচ

16

আমার দৃষ্টিতে, "স্পষ্টতই সর্বদা অন্তর্নিহিতের চেয়ে ভাল" " কারণ এক পর্যায়ে আপনি এই বর্ধিত বিবৃতিতে বিভ্রান্ত হতে পারেন y+ = x++ + ++y। একটি ভাল প্রোগ্রামার সর্বদা তার কোডটি আরও পঠনযোগ্য করে তোলে।


1
X ++ বা ++ y তে অন্তর্ভুক্ত কিছুই নেই।
ফ্লোরিয়ান এফ

1
এই পঠনযোগ্য কোড জিনিসটি জটিল ... আমার মনে হয় আপনার কোডটি কী সহজ হতে হবে তার একটি বেস লাইন রয়েছে এবং আমরা একটি সম্প্রদায়- অবশ্যই কিছুটা সাফল্য লাভ করতে হবে এবং এখন যা পড়া যায় না, যেমন ওয়ান-লাইনারগুলি পড়তে সক্ষম হবে নেস্টেড ternaries সঙ্গে, যেমন পদাঘাত আরো জিনিস অনুমতি দেয়।
হামজা Ouaghad

14

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

দক্ষতার জন্য, আমি পছন্দ করি:

  • ++ আমি যখন ব্যবহার না করছি ফেরতের মানটি (অস্থায়ী নয়)
  • আমি ++ রিটার্ন মান ব্যবহার করার সময় (পাইপলাইন স্টল নেই)

আমি মিঃ ক্রকফোর্ডের ভক্ত, তবে এই ক্ষেত্রে আমার একমত হতে হবে না। ++iপার্স করার পক্ষে 25% কম পাঠ্য i+=1 এবং তর্কযোগ্যভাবে পরিষ্কার।


13

আমি এটি নিয়ে ডগলাস ক্রকফোর্ডের ভিডিও দেখছি এবং ইনক্রিমেন্ট এবং হ্রাস ব্যবহার না করার জন্য তার ব্যাখ্যা এটি

  1. এটি অতীতে অন্যান্য ভাষাগুলিতে অ্যারেগুলির সীমাটি ভেঙে ফেলার জন্য এবং সমস্ত শালীনতা এবং খারাপ আচরণের কারণ হিসাবে ব্যবহৃত হয়েছিল
  2. এটি আরও বিভ্রান্তিকর এবং অনভিজ্ঞ জেএস বিকাশকারীরা এটি ঠিক কী তা জানে না।

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

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

আপনি যদি উপরের কিছুটি মনে করেন তবে একটি ++ + ++ বি এর মত প্রকাশগুলি কার্যকর করা সহজ work

var a = 1, b = 1, c;
c = a ++ + ++ b;
// c = 1 + 2 = 3; 
// a = 2 (equals two after the expression is finished);
// b = 2;

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

বিটিডব্লু, আমি মনে করি ডগলাস ক্রকফোর্ড যেভাবেই কিংবদন্তি, তবে আমি মনে করি যে তিনি কোনও অপারেটরকে তার পক্ষে যথেষ্ট ভয় দেখিয়েছিলেন যা তার প্রাপ্য নয়।

যদিও আমি ভুল প্রমাণিত হতে বেঁচে আছি ...


10

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

function testIncrement1(x) {
    return x++;
}

function testIncrement2(x) {
    return ++x;
}

function testIncrement3(x) {
    return x += 1;
}

console.log(testIncrement1(0)); // 0
console.log(testIncrement2(0)); // 1
console.log(testIncrement3(0)); // 1

যেমন আপনি দেখতে পাচ্ছেন, রিটার্ন স্টেটমেন্টে কোনও পোস্ট-ইনক্রিমেন্ট / হ্রাস ব্যবহার করা উচিত নয়, যদি আপনি চান এই অপারেটর ফলাফলটিকে প্রভাবিত করতে পারে। কিন্তু রিটার্ন পোস্ট-ইনক্রিমেন্ট / হ্রাস অপারেটরদের "ধরা" দেয় না:

function closureIncrementTest() {
    var x = 0;

    function postIncrementX() {
        return x++;
    }

    var y = postIncrementX();

    console.log(x); // 1
}

আপনার ফাংশনগুলির মধ্যে কেবলমাত্র একটি প্যারামিটার হিসাবে এক্স পাবেন
Calimero100582

8

আমি মনে করি প্রোগ্রামাররা তাদের যে ভাষাটি ব্যবহার করছে তাতে দক্ষ হতে হবে; পরিষ্কারভাবে এটি ব্যবহার; এবং এটি ভাল ব্যবহার করুন। আমি মনে করি না যে তারা ব্যবহার করছেন ভাষাটি তাদের কৃত্রিমভাবে পঙ্গু করা উচিত। আমি অভিজ্ঞতা থেকে কথা বলি। আমি একবার কোবোল শপের সামনে আক্ষরিক কাজ করেছি যেখানে তারা ইএলএসই ব্যবহার করেনি 'কারণ এটি খুব জটিল ছিল'। কমানোর জন্য কম।


পুনঃটুইট আপনি কি মনে করেন না যে প্রোগ্রামারদের ভাষায় দক্ষ হওয়া উচিত? আপনি কি ভাবেন তাদের কৃত্রিমভাবে ভাষা পঙ্গু করা উচিত ? ইহা কোনটা? এখানে তৃতীয় পছন্দ নেই।
মারকুইস লার্নের

1
এবং এই কোবোল উদাহরণটির জন্য উত্সাহ, আমাকে আরও আনন্দিত করে যে আমি কোডিংয়ের আগেই সিওবিএল বেশিরভাগই মারা গিয়েছিলাম
মার্ক কে কোয়ান

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

2

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

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


1
জবাবের জন্য ধন্যবাদ. মন্তব্য করার জন্য আপনার খ্যাতিমানের মান 50 বা এর বেশি হবে। দেখুন: stackoverflow.com/faq
artlung

1
@ আর্টলুং: আমি সে সম্পর্কে এবং এর পিছনে যুক্তি সম্পর্কে অবগত। আমি কেবল বলছিলাম এটি বিরক্তিকর :)
প্রাইভম্যান

2

আমার অভিজ্ঞতায়, ++ i বা i ++ অপারেটর কীভাবে কাজ করে তা শিখার আগে যখন কখনও বিভ্রান্তি ঘটেনি। লুপগুলির জন্য এবং এটি অপারেটার ব্যবহার করতে পারেন এমন ভাষাগুলিতে যে কোনও হাইস্কুল বা কলেজের কোর্স দ্বারা শেখানো হয় সেই লুপগুলির জন্য এটি সবচেয়ে প্রয়োজনীয় essential আমি পৃথক লাইনে থাকা ++ থাকাকালীন কিছু থেকে ভাল দেখতে এবং পড়ার জন্য নীচে যা কিছু আছে তার মতো ব্যক্তিগতভাবে পাই personally

while ( a < 10 ){
    array[a++] = val
}

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

এছাড়াও, ক্রকফোর্ড i- = 1 ব্যবহার করছে বলে মনে হচ্ছে, যা আমি - ii বা i-- এর চেয়ে পড়ার চেয়ে কঠিন বলে মনে করি


2

আমার 2 টি হ'ল দুটি ক্ষেত্রে এড়ানো উচিত:

1) যখন আপনার একটি ভেরিয়েবল থাকে যা অনেক সারিতে ব্যবহৃত হয় এবং আপনি এটি প্রথম বিবৃতিতে ব্যবহার করেন (বা শেষ, বা এর থেকেও খারাপ, মাঝখানে) এটি বাড়িয়ে / হ্রাস করেন:

// It's Java, but applies to Js too
vi = list.get ( ++i );
vi1 = list.get ( i + 1 )
out.println ( "Processing values: " + vi + ", " + vi1 )
if ( i < list.size () - 1 ) ...

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

2) একই বিবৃতিতে একই ভেরিয়েবল সম্পর্কে একাধিক ++ এবং এর ক্ষেত্রে। এরকম ক্ষেত্রে কী ঘটে তা মনে রাখা খুব কঠিন:

result = ( ++x - --x ) * x++;

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


1

ফোর্টরান কি সি-এর মতো ভাষা? এটিরও ++ বা নেই -। এখানে আপনি কীভাবে একটি লুপ লিখবেন :

     integer i, n, sum

      sum = 0
      do 10 i = 1, n
         sum = sum + i
         write(*,*) 'i =', i
         write(*,*) 'sum =', sum
  10  continue

আমি সূচকের উপাদানটি লুপের মাধ্যমে প্রতিবারের ভাষা বিধি দ্বারা বর্ধিত হয়। যদি আপনি 1 ব্যতীত অন্য কিছু দিয়ে বৃদ্ধি করতে চান তবে উদাহরণস্বরূপ দুটি দ্বারা পিছনে গুনুন, বাক্য গঠনটি হ'ল ...

      integer i

      do 20 i = 10, 1, -2
         write(*,*) 'i =', i
  20  continue

পাইথন সি-এর মতো? এটি একটি সূচক বৃদ্ধির প্রয়োজনীয়তাকে বাইপাস করতে সীমার এবং তালিকা বোঝার এবং অন্যান্য বাক্য গঠন ব্যবহার করে:

print range(10,1,-2) # prints [10,8.6.4.2]
[x*x for x in range(1,10)] # returns [1,4,9,16 ... ]

সুতরাং ঠিক দুটি বিকল্পের এই প্রাথমিক অনুসন্ধানের ভিত্তিতে ভাষা ডিজাইনাররা ব্যবহারের ক্ষেত্রে প্রত্যাশিত এবং একটি বিকল্প বাক্য গঠন প্রদান করে ++ এবং - এড়াতে পারেন।

ফোর্টরান এবং পাইথন যে প্রক্রিয়াকরণী ভাষা ++ এবং - এর চেয়ে কম বাগ বাগের চেয়ে কম? আমার কোন প্রমাণ নেই।

আমি দাবি করি যে ফোর্টরান এবং পাইথন সি-সমান কারণ আমি সি-তে সাবলীল এমন কোনও ব্যক্তির সাথে কখনও সাক্ষাত করতে পারি নি যিনি 90% নির্ভুলতার সাথে সঠিকভাবে অনুমান করা যায়নি যে সঠিকভাবে অবহেলিত ফোর্টরান বা পাইথনের উদ্দেশ্য নয়।


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