এক্স + = y এর মতো শর্টকাটগুলি কেন ভাল অনুশীলন হিসাবে বিবেচিত হয়?


305

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

x += 5একটি সংক্ষিপ্ত স্বরলিপি হিসাবে x = x + 5

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

আমি কি কিছু স্পষ্ট এবং সুস্পষ্ট কারণগুলি এগুলি পুরো জায়গাতে ব্যবহার করা হচ্ছে?


@ এরিকলিপার্ট: শীর্ষ উত্তর বর্ণিত বর্ণের মতো সি # কি এটি পরিচালনা করে? আসলে কি সিএলআর-এর x += 5চেয়ে বেশি দক্ষ বলা যায় x = x + 5? বা আপনার পরামর্শ অনুসারে এটি কি কেবল সিনট্যাকটিক চিনি?
ব্লেশ

24
@blesh: উত্স কোডটিতে একটি সংযোজনকে কীভাবে প্রকাশ করে তার ছোট্ট বিবরণগুলির ফলে কার্যকর এক্সিকিউটেবল কোডের দক্ষতার উপর প্রভাব পড়তে পারে ১৯ 1970০ সালে; এটা অবশ্যই এখন হয় না। অপ্টিমাইজ করা সংকলকগুলি ভাল এবং আপনার এখানে বা ন্যানোসেকেন্ডের চেয়ে বড় উদ্বেগ রয়েছে। "বিশ বছর আগে" + = অপারেটরটি বিকাশ করা হয়েছিল তা ধারণা অবশ্যই মিথ্যা; প্রয়াত ডেনিস রিচি ১৯ developed৯ সাল থেকে ১৯3৩ সাল বেল ল্যাবগুলিতে সি বিকাশ করেছিলেন।
এরিক লিপার্ট


5
বেশিরভাগ কার্যক্ষম প্রোগ্রামাররা এই খারাপ অভ্যাসটি বিবেচনা করবে।
পিট কির্খাম

উত্তর:


598

এটা শর্টহ্যান্ড নয়।

+=প্রতীক 1970 সালে সি ল্যাঙ্গুয়েজ হাজির, এবং - "স্মার্ট প্রতীকী ভাষান্তর" র পরিষ্কারভাবে বিভিন্ন মেশিন শিক্ষা ও adressing মোডে মিলা সি ধারণা নিয়ে:

" i=i+1", "i+=1"এবং" ++i"এর মতো জিনিসগুলি যদিও বিমূর্ত স্তরে একই প্রভাব তৈরি করে, নিম্ন স্তরে প্রসেসরের কাজ করার ভিন্ন পদ্ধতির সাথে মিল থাকে।

বিশেষত এই তিনটি এক্সপ্রেশন, iপরিবর্তনশীল ধরে ধরে সিপিইউ রেজিস্টারে সংরক্ষিত মেমরি ঠিকানার মধ্যে থাকে (আসুন এটির নাম দিন D- এটি একটি "পয়েন্টার হিসাবে বিবেচনা করুন") এবং প্রসেসরের ALU একটি প্যারামিটার নেয় এবং ফলাফলটি ফিরে আসে "সংগ্রহকারী" (আসুন একে এটিকে ডাকুন - এটি একটি অন্তর্নিহিত হিসাবে ভাবেন)।

এই সীমাবদ্ধতার সাথে (সেই সময়ের সমস্ত মাইক্রোপ্রসেসরের মধ্যে খুব সাধারণ), অনুবাদটি সম্ভবত হবে

;i = i+1;
MOV A,(D); //Move in A the content of the memory whose address is in D
ADD A, 1;  //The addition of an inlined constant
MOV (D) A; //Move the result back to i (this is the '=' of the expression)

;i+=1;
ADD (D),1; //Add an inlined constant to a memory address stored value

;++i;
INC (D); //Just "tick" a memory located counter

এটি করার প্রথম উপায়টি অযৌক্তিক, তবে ধ্রুবক ( ADD A, Bবা ADD A, (D+x)) পরিবর্তে ভেরিয়েবলের সাথে অপারেট করার সময় বা আরও জটিল এক্সপ্রেশনগুলি অনুবাদ করার সময় (তারা সকলেই একটি স্ট্যাকের মধ্যে নিম্ন অগ্রাধিকারের ক্রিয়াকলাপে চাপে নামিয়ে আনে, উচ্চ অগ্রাধিকার কল করুন, পপ করুন এবং সমস্ত যুক্তি অপসারণ না হওয়া পর্যন্ত পুনরাবৃত্তি করুন)।

দ্বিতীয়টি "স্টেট মেশিন" এর আরও সাধারণ: আমরা আর "এক্সপ্রেশনকে মূল্যায়ন করি না", "" একটি মান পরিচালনা করে ": আমরা এখনও ALU ব্যবহার করি, তবে পরামিতিটি প্রতিস্থাপনের ফলে ফলাফল হওয়ার আশেপাশে চলমান মানগুলি এড়িয়ে চলি। আরও জটিল অভিব্যক্তি প্রয়োজন যেখানে এই ধরণের নির্দেশাবলী ব্যবহার করা i = 3*i + i-2যাবে না : স্থানে কাজ করা যায় না, যেহেতু iআরও বেশি বার প্রয়োজন হয়।

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

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

x += 5 মানে

  • X দ্বারা চিহ্নিত স্থানটি সন্ধান করুন
  • এটিতে 5 যোগ করুন

তবে x = x + 5অর্থ:

  • এক্স + 5 মূল্যায়ন করুন
    • X দ্বারা চিহ্নিত স্থানটি সন্ধান করুন
    • এক্স জমাকারীতে এক্স অনুলিপি করুন
    • সঞ্চয়ের জন্য 5 যোগ করুন
  • এক্স মধ্যে ফলাফল সংরক্ষণ করুন
    • X দ্বারা চিহ্নিত স্থানটি সন্ধান করুন
    • এটিতে সঞ্চয়ী অনুলিপি করুন

অবশ্যই, অপ্টিমাইজেশন পারে

  • যদি "সন্ধানকারী এক্স" এর কোনও পার্শ্ব প্রতিক্রিয়া না থাকে তবে দুটি "সন্ধান" একবারে করা যেতে পারে (এবং এক্স পয়েন্টার রেজিস্টারে সংরক্ষিত ঠিকানা হয়ে যায়)
  • সংস্থাপকের &xপরিবর্তে যদি ADD প্রয়োগ করা হয় তবে দুটি অনুলিপি যথাযথভাবে যুক্ত হতে পারে

এইভাবে একত্রিত করার জন্য অনুকূলিত কোড তৈরি করা x += 5

তবে এটি তখনই করা সম্ভব যদি "সন্ধানকারী এক্স" এর কোনও পার্শ্ব প্রতিক্রিয়া না থাকে, অন্যথায়

*(x()) = *(x()) + 5;

এবং

*(x()) += 5;

শব্দার্থগতভাবে পৃথক, যেহেতু x()পার্শ্ব প্রতিক্রিয়াগুলি (স্বীকার করা x()এমন একটি ফাংশন যা চারপাশে অদ্ভুত কাজ করা এবং ফিরে আসা int*) দু'বার বা একবার উত্পাদিত হবে।

মধ্যে সমানতা x = x + yএবং x += yকারণে নির্দিষ্ট ক্ষেত্রে যেখানে অত: পর হয় +=এবং =সরাসরি L-মান প্রয়োগ করা হয়েছে।

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


যারা আরও বিস্তারিত পছন্দ করেন তাদের জন্য ...

প্রতিটি সিপিইউতে একটি ALU (পাটিগণিত-লজিক্যাল ইউনিট) থাকে যা একেবারে সংক্ষেপে, একটি সংযোজক নেটওয়ার্ক যার ইনপুট এবং আউটপুট নির্দেশকের অপকোডের উপর নির্ভর করে রেজিস্টারগুলিতে এবং / অথবা মেমরিতে "প্লাগড" থাকে।

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

এই সিউডোকোড সহ, x += 5হয়

ADD (X) 5

যখন x = x+5হয়

MOVE A (X)
ADD A 5
MOVE (X) A

অর্থাৎ, এক্স + 5 একটি অস্থায়ী দেয় যা পরে নির্ধারিত হয়। x += 5এক্স উপর সরাসরি পরিচালনা করে।

প্রকৃত বাস্তবায়ন প্রসেসরের আসল নির্দেশের সেটের উপর নির্ভর করে: যদি কোনও ADD (.) cঅপকোড না থাকে তবে প্রথম কোডটি দ্বিতীয় হয়ে যায়: কোনও উপায় নেই।

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


90
এটি পুরানো দিনগুলিতে পৃথক (এবং আরও দক্ষ) মেশিন কোডে মানচিত্র তৈরি করার একমাত্র উত্তরের জন্য +1।
প্যাটার টারিক

11
@ কিথথম্পসন এটি সত্য তবে কেউ অস্বীকার করতে পারবেন না যে সি ভাষার ডিজাইনের (এবং পরবর্তীকালে সমস্ত সি শৈলীর ভাষা) নকশার উপরে সমাবেশের বিশাল প্রভাব ছিল
ম্যাটড্যাভি

51
এরম, "+" "" ইনক "-কে মানচিত্র দেয় না (এটি" যোগ "করার মানচিত্র)," ++ "মানচিত্রগুলিকে" ইনক "এ দেয়।
ব্রেন্ডন

11
"20 বছর আগে" দ্বারা, আমার মনে হয় আপনি "30 বছর আগে" বলতে চাইছেন। এবং
বিটিডাব্লু, সিওবিএল

10
তত্ত্বের ক্ষেত্রে দুর্দান্ত; সত্য ভুল। X86 এএসএম আইএনসি কেবল 1 যোগ করে, সুতরাং এটি এখানে আলোচিত "অ্যাড অ্যান্ড এসাইন" অপারেটরটিকে প্রভাবিত করে না (যদিও এটি "++" এবং "-" এর জন্য দুর্দান্ত উত্তর হবে)।
মার্ক ব্রাকেট

281

আপনি এটি সম্পর্কে কীভাবে ভাবেন তার উপর নির্ভর করে এটি বুঝতে সহজতর কারণ এটি আরও সহজ। উদাহরণস্বরূপ নিন:

x = x + 5 "এক্স নিন, এর সাথে পাঁচটি যোগ করুন এবং তারপরে সেই নতুন মানটি এক্সে ফিরিয়ে দিন" এর মানসিক প্রক্রিয়াকরণের আহ্বান জানান

x += 5 "5 দ্বারা এক্স এক্স বৃদ্ধি" হিসাবে ভাবা যেতে পারে

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


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

44
ভেরিয়েবলের একটি দীর্ঘ নাম রয়েছে এমন ক্ষেত্রেও রয়েছে: reallyreallyreallylongvariablename = reallyreallyreallylongvariablename + 1... ওহ নয়েস !!! একটি টাইপো

9
@ ম্যাট ফেনউইক: এটি একটি দীর্ঘ পরিবর্তনশীল নাম হতে হবে না; এটি কোনও ধরণের অভিব্যক্তি হতে পারে। এগুলি যাচাই করা আরও কঠিন হতে পারে এবং পাঠকরা তাদের একই অবস্থা তা নিশ্চিত করতে অনেক মনোযোগ ব্যয় করতে হবে।
ডেভিড থর্নলে

32
এক্স = এক্স + 5 হ্যাক বাছাই করা হয় যখন আপনার লক্ষ্য এক্স দ্বারা 5
জেফো

1
@ পলিয়োনমিয়াল আমার মনে হয় আমি খুব ছোটবেলায় x = x + 5 এর ধারণাটি পেয়েছি। 9 বছর বয়সী যদি আমি সঠিকভাবে মনে করি - এবং এটি আমার কাছে নিখুঁত জ্ঞান তৈরি করেছে এবং এটি এখনও আমার কাছে নিখুঁত জ্ঞান তৈরি করে এবং এটি অনেক বেশি x + = 5 এর চেয়ে বেশি পছন্দ করে much প্রথমটি আরও বেশি ভার্বোস এবং আমি ধারণাটি আরও স্পষ্টভাবে কল্পনা করতে পারি - আমি এক্সকে এক্স এর পূর্বের মান হিসাবে যা নির্ধারণ করছি (যাই হোক না কেন) এবং তারপরে ৫ যোগ করা I আমার ধারণা বিভিন্ন মস্তিষ্ক বিভিন্ন উপায়ে কাজ করে।
ক্রিস হ্যারিসন

48

কমপক্ষে পাইথনে , x += yএবং x = x + yসম্পূর্ণ ভিন্ন জিনিস করতে পারে।

উদাহরণস্বরূপ, যদি আমরা করি

a = []
b = a

তারপরে a += [3]ফলাফল আসবে a == b == [3], যখন a = a + [3]ফলাফল হবে a == [3]এবং b == []। এটি হ'ল, +=জায়গাটিকে বস্তুটি জায়গায় স্থান দেয় (ভাল, এটি করতে পারে, আপনি নিজের পছন্দমতো কিছু করার __iadd__পদ্ধতিটি সংজ্ঞায়িত করতে পারেন), যখন =একটি নতুন অবজেক্ট তৈরি করে এবং এর সাথে ভেরিয়েবলটি বেঁধে রাখে।

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


4
+1 এর জন্য __iadd__: এমন ভাষাগুলি রয়েছে যেখানে আপনি কোনও পরিবর্তনীয় ডেটাস্ট্রাকচারের জন্য একটি পরিবর্তনীয় রেফারেন্স তৈরি করতে পারেন, যেখানে operator +=সংজ্ঞা দেওয়া হয়েছে, যেমন স্কেল: val sb = StringBuffer(); lb += "mutable structure"বনাম var s = ""; s += "mutable variable"। পরবর্তীটি ডেটাস্ট্রাক্টের বিষয়বস্তুটিকে আরও পরিবর্তন করে যখন পরবর্তীকাগুলি একটি নতুনকে পরিবর্তনশীল পয়েন্ট করে।
উড়ন্ত ভেড়া

43

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

যখনই কেউ x += yআপনাকে লেখেন আপনি জানেন যে আরও কিছু জটিল অপারেশন xদ্বারা বৃদ্ধি করা হচ্ছে yনা (সর্বোত্তম অনুশীলন হিসাবে, সাধারণত আমি আরও জটিল ক্রিয়াকলাপগুলি এবং এই সিনট্যাক্স শর্টহ্যান্ডগুলিকে মিশ্রিত করব না)। 1 দ্বারা বৃদ্ধি করার সময় এটি সর্বাধিক অর্থপূর্ণ হয় sense


13
এক্স ++ এবং ++ এক্স এক্স + = 1 এবং একে অপরের থেকে কিছুটা আলাদা।
গ্যারি উইলফোবি

1
@ গ্যারি: ++xএবং x+=1সি এবং জাভা (সম্ভবত সি #) এর সমতুল্য যদিও এটি প্রয়োজনীয় জটিল অপারেটর শব্দার্থক কারণে সি ++ তে অগত্যা নয়। মূলটি হ'ল তারা উভয় xএকবারে মূল্যায়ন করে, একের পর এক চলক বৃদ্ধি করে এবং এর ফলস্বরূপ মূল্যায়নের পরে চলকটির বিষয়বস্তু।
ডোনাল ফেলো

3
@ ডোনাল ফেলো: অগ্রাধিকারটি আলাদা, তাই ++x + 3আগের মতো নয় x += 1 + 3। প্যারেন্টেসাইজ করুন x += 1এবং এটি অভিন্ন। নিজের বিবৃতি হিসাবে, তারা অভিন্ন।
ডেভিড থর্নলি

1
@DavidThornley: এটা বলতে "তারা অভিন্ন করছি" যখন তারা উভয় অনির্ধারিত আচরণ আছে :) কঠিন
কক্ষপথে লঘিমা জাতি

1
কোনটিই এক্সপ্রেশন নয় ++x + 3, x += 1 + 3বা অপরিবর্তিত (x += 1) + 3আচরণ নেই (ফলাফলটি মান "ফিট করে" ধরে নিচ্ছে)।
জন হাসকল 22

42

@ পাব্বির বক্তব্যটি আরও পরিষ্কার করার জন্য বিবেচনা করুন someObj.foo.bar.func(x, y, z).baz += 5

+=অপারেটর ছাড়া দুটি উপায় যেতে হবে:

  1. someObj.foo.bar.func(x, y, z).baz = someObj.foo.bar.func(x, y, z).baz + 5। এটি কেবল ভয়াবহভাবে অপ্রয়োজনীয় এবং দীর্ঘ নয়, এটি ধীরে ধীরে। সুতরাং এক করতে হবে
  2. একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করুন: tmp := someObj.foo.bar.func(x, y, z); tmp.baz = tmp.bar + 5। এটি ঠিক আছে, তবে এটি একটি সাধারণ জিনিসের জন্য প্রচুর শব্দ। এটি আসলে রানটাইমের সময় যা ঘটেছিল তার খুব কাছাকাছি, তবে এটি লেখার জন্য ক্লান্তিকর এবং কেবল ব্যবহারের সাহায্যে +=কাজটি সংকলক / দোভাষীকে স্থানান্তরিত করবে।

+=এবং অন্যান্য অন্যান্য অপারেটরদের সুবিধা অনস্বীকার্য, যদিও তাদের অভ্যস্ত হওয়া কেবল সময়ের বিষয়।


আপনি একবার অবজেক্ট চেইনের 3 স্তরে গভীর হয়ে গেলে, আপনি 1 এর মতো ছোট্ট অপ্টিমাইজেশন এবং 2. এর মতো শোরগোলের কোড দেখাশোনা বন্ধ করতে পারেন, তার পরিবর্তে, আরও একবার আপনার নকশাটি নিয়ে ভাবেন।
ডরাস

4
@ ডরাস: আমি যে অভিব্যক্তিটি বেছে নিয়েছি তা "জটিল অভিব্যক্তি" এর জন্য কেবল একটি স্বেচ্ছাসেবী প্রতিনিধি। আপনার মাথার কোনও কিছুর দ্বারা এটি প্রতিস্থাপন করতে নির্দ্বিধায়, যা আপনি নিতপিক সম্পর্কে পছন্দ করবেন না;)
back2dos

9
+1: এটি এই অপ্টিমাইজেশনের মূল কারণ - এটি সর্বদা সঠিক, বাম-দিকের দিকের অভিব্যক্তি যত জটিল হোক না কেন।
এসলট

9
একটি টাইপো রেখে সেখানে কী ঘটতে পারে তার একটি সুন্দর চিত্র রয়েছে।
ডেভিড থর্নলে

21

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

সঙ্গে

RidiculouslyComplexName += 1;

যেহেতু কেবলমাত্র একটি পরিবর্তনশীল নাম জড়িত তাই আপনি নিশ্চিত যে বিবৃতিটি কী করে।

সঙ্গে RidiculouslyComplexName = RidiculosulyComplexName + 1;

উভয় পক্ষের ঠিক একই যে সন্দেহ আছে যে সবসময় আছে। আপনি বাগটি দেখেছেন? সাবস্ক্রিপ্ট এবং বাছাইকারী উপস্থিত থাকলে এটি আরও খারাপ হয়।


5
এটি এমন ভাষাগুলিতে আরও খারাপ হয় যেখানে অ্যাসাইনমেন্ট স্টেটমেন্টগুলি সুস্পষ্টভাবে পরিবর্তনশীল তৈরি করতে পারে, বিশেষত ভাষাগুলি সংবেদনশীল sensitive
সুপারক্যাট

14

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

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


11

কেন অপারেটার 'সি-শৈলী' Languages দিয়ে শুরু করতে হয় কিছু জ্ঞানের জন্য, সেখান থেকে এই উদ্ধৃতাংশ কে & R এর 1 ম সংস্করণ (1978) 34 বছরের আগে:

সংক্ষিপ্ততা বাদে অ্যাসাইনমেন্ট অপারেটরদের সুবিধা রয়েছে যে তারা যেভাবে চিন্তাভাবনা করে তার সাথে তারা আরও ভালভাবে মিলিয়ে যায়। আমরা বলি "আমি 2 তে যোগ করুন" বা "ইনক্রিমেন্ট আমি 2 দ্বারা 2" "নেব না", 2 যোগ করুন, তারপরে ফলাফলটি আইতে রেখে দিন " এইভাবে i += 2। উপরন্তু, একটি জটিল মত প্রকাশের জন্য

yyval[yypv[p3+p4] + yypv[p1+p2]] += 2

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

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

কে অ্যান্ড আর লিখেছেন যে এটি দীর্ঘদিন হয়েছে, এবং লোকেরা কীভাবে কোড লিখতে হবে সে সম্পর্কে অনেকগুলি 'সেরা অভ্যাসগুলি' তখন থেকেই পরিবর্তিত বা বিকশিত হয়েছিল। তবে এই প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ প্রশ্নটি প্রথমবারের মতো আমি যখন কাউকে যৌগিক কার্যের পাঠযোগ্যতা সম্পর্কে কোনও অভিযোগ উচ্চারণ করতে পারি, তাই আমি ভাবছি যে অনেক প্রোগ্রামার তাদের সমস্যা বলে মনে করেন? তারপরে আবার, আমি এটি টাইপ করার সাথে সাথে প্রশ্নটির 95 টি upvotes রয়েছে, সুতরাং কোড পড়ার সময় লোকেরা এগুলিকে ঝাঁকুনির মতো দেখতে পায়।


9

পঠনযোগ্যতা ছাড়াও, তারা প্রকৃতপক্ষে বিভিন্ন জিনিস করে: +=এর বাম ক্রিয়াকলাপটি দুবার মূল্যায়ন করতে হবে না।

উদাহরণস্বরূপ, দুইবার expr = expr + 5বিস্ফোরক হবে expr(ধরে নিচ্ছি না exprঅপরিষ্কার)।


বিস্ময়কর সংকলক ব্যতীত সকলের জন্য এটি কিছু যায় আসে না। বেশিরভাগ expr = expr + 5expr += 5
সংকলকগুলি

7
@vsz exprএর পার্শ্ব প্রতিক্রিয়া থাকলে তা নয় ।
পাব্বি

6
@vsz: সি-তে, এর যদি exprপার্শ্ব প্রতিক্রিয়া থাকে তবে expr = expr + 5 অবশ্যই সেই পার্শ্ব প্রতিক্রিয়াগুলি দুবার ডেকে আনতে হবে
কিথ থম্পসন

@ পাব্বি: এর যদি পার্শ্ব প্রতিক্রিয়া থাকে তবে "সুবিধা" এবং "পঠনযোগ্যতা" নিয়ে কোনও সমস্যা নেই, যা মূল প্রশ্নের মূল বিষয় ছিল।
বনাম

2
এই "পার্শ্ব প্রতিক্রিয়া" বিবৃতি সম্পর্কে সতর্কতা অবলম্বন করা ভাল। রাউন্ডআপ এবং লিখেছেন volatileপার্শ্ব প্রতিক্রিয়া আছে, এবং x=x+5এবং x+=5যখন একই পার্শ্ব প্রতিক্রিয়া আছে xহয়volatile
MSalters

6

অন্যান্য লোকেরা খুব ভাল বর্ণনা করেছেন এমন স্পষ্ট গুণাবলী ছাড়াও, যখন আপনার খুব দীর্ঘ নাম হয় এটি আরও কমপ্যাক্ট।

  MyVeryVeryVeryVeryVeryLongName += 1;

অথবা

  MyVeryVeryVeryVeryVeryLongName =  MyVeryVeryVeryVeryVeryLongName + 1;

6

এটা সংক্ষিপ্ত।

এটি টাইপ করা অনেক ছোট এতে অপারেটররা কম জড়িত। এটির পৃষ্ঠতল কম এবং বিভ্রান্তির জন্য কম সুযোগ রয়েছে।

এটি আরও নির্দিষ্ট অপারেটর ব্যবহার করে।

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


2
তাত্ত্বিকভাবে schmeoretically। ADDঅনেক সিপিইউ নির্দেশাবলী রূপগুলো যে রেজিস্টার বা মেমরি দ্বিতীয় সংযোজন হিসাবে অন্যান্য রেজিস্টার, মেমরি বা ধ্রুবক ব্যবহার করে সরাসরি কাজ আছে। সমস্ত সংমিশ্রণ উপলভ্য নয় (উদাহরণস্বরূপ মেমরিটিতে মেমরি যুক্ত করুন), তবে দরকারী যথেষ্ট। যে কোনও হারে, কোনও শালীন অপ্টিমাইজার সহ যে কোনও সংকলক x = x + yএটির জন্য একই কোডটি তৈরি করতে জানবে x += y
blrfl

অতএব "স্বীকৃত"
মার্ক ক্যানলাস

5

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

পাইথনে, টাইপিংয়ের x += 5ফলে এখনও পূর্ণসংখ্যা বস্তু 1 তৈরি করা যায় (যদিও এটি একটি পুল থেকে আঁকা হতে পারে) এবং 5 টি সহ পূর্ণসংখ্যার বস্তুর অনাথ হয়।

জাভাতে, এটি একটি স্বাদযুক্ত occurালাই ঘটায়। টাইপ করার চেষ্টা করুন

int x = 4;
x = x + 5.2  // This causes a compiler error
x += 5.2     // This is not an error; an implicit cast is done.

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

আধুনিক
সংকলকগুলির

প্রসেসরের উপর +=নির্ভরশীলতার গতি তেমন ভাষা নির্ভর করে না । উদাহরণস্বরূপ, এক্স 86 একটি দুটি ঠিকানা আর্কিটেকচার, এটি কেবল স্থানীয়ভাবে সমর্থন করে। এর মতো একটি বিবৃতি অবশ্যই সংকলন করতে হবে কারণ সেখানে এমন কোনও নির্দেশ নেই যা সংখ্যার একটির জায়গায় না গিয়ে যোগের ফলাফলকে অন্য কোথাও রাখতে পারে। বিপরীতে, পাওয়ার আর্কিটেকচার একটি তিনটি ঠিকানা আর্কিটেকচার যার জন্য বিশেষ কমান্ড নেই । এই স্থাপত্যে, বিবৃতি এবং সর্বদা একই কোডে সংকলন করে। +=a = b + c;a = b; a += c;+=a += b;a = a + b;
16 মাস

4

যেমন অপারেটর +=খুব দরকারী যখন আপনি একটি যেমন একটি পরিবর্তনশীল ব্যবহার করছেন হয় সঁচায়ক , অর্থাত্ মোট চলমান:

x += 2;
x += 5;
x -= 3;

এর থেকে পড়তে অনেক সহজ:

x = x + 2;
x = x + 5;
x = x - 3;

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


আমার জন্য এটি বিপরীতভাবে - প্রথম রূপটি পর্দার ময়লার মতো এবং দ্বিতীয়টি পরিষ্কার এবং পঠনযোগ্য।
মিখাইল ভি

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

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

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

1

এই বিবেচনা

(some_object[index])->some_other_object[more] += 5

আপনি সত্যিই লিখতে চান D0

(some_object[index])->some_other_object[more] = (some_object[index])->some_other_object[more] + 5

1

অন্যান্য উত্তরগুলি আরও সাধারণ ক্ষেত্রে লক্ষ্য করে, তবে এর আরও একটি কারণ রয়েছে: কিছু প্রোগ্রামিং ভাষায়, এটি ওভারলোড করা যায়; যেমন Scala


ছোট স্কাল পাঠ:

var j = 5 #Creates a variable
j += 4    #Compiles

val i = 5 #Creates a constant
i += 4    #Doesn’t compile

যদি কোনও শ্রেণি কেবল +অপারেটরকে সংজ্ঞায়িত করে x+=yতবে এটি একটি শর্টকাট x=x+y

যদি কোনও শ্রেণি ওভারলোড হয় +=তবে সেগুলি হয় না:

var a = ""
a += "This works. a now points to a new String."

val b = ""
b += "This doesn’t compile, as b cannot be reassigned."

val c = StringBuffer() #implements +=
c += "This works, as StringBuffer implements “+=(c: String)”."

অতিরিক্তভাবে, অপারেটর +এবং +=দুটি পৃথক অপারেটর (এবং কেবল এগুলি নয়: + এ, ++ এ, এ ++, এ + বা + = বিও বিভিন্ন অপারেটর); যে ভাষাগুলিতে অপারেটর ওভারলোডিং পাওয়া যায় সেগুলিতে এটি আকর্ষণীয় পরিস্থিতি তৈরি করতে পারে। ঠিক উপরে বর্ণিত হিসাবে - আপনি যদি অ্যাডিংটি +সম্পাদন করতে অপারেটরটি ওভারলোড করেন তবে মনে রাখবেন যে +=ওভারলোডও করতে হবে।


"যদি কোনও শ্রেণি কেবলমাত্র + অপারেটরকে সংজ্ঞায়িত করে, x + = y আসলে x = x + y এর একটি শর্টকাট" " তবে অবশ্যই এটি অন্যান্য উপায়েও কাজ করে? সি ++ এ প্রথমে সংজ্ঞায়িত করা +=এবং তারপরে a+b"এর অনুলিপি তৈরি করুন a, bএটি ব্যবহার করে এটি প্রয়োগ করুন +=, অনুলিপিটি ফিরিয়ে দিন " হিসাবে সংজ্ঞায়িত করা খুব সাধারণ a
বাম

1

একবার এবং একবার এটি বলুন: ইন x = x + 1, আমি দু'বার 'x' বলি।

তবে কখনও লিখবেন না, 'a = b + = 1' বা আমাদের 10 বিড়ালছানা, 27 ইঁদুর, একটি কুকুর এবং একটি হ্যামস্টার হত্যা করতে হবে।


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


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