ধ্রুবক হিসাবে শূন্য?


15

আমি সম্প্রতি এই প্রোগ্রামিং প্রতিভা জুড়ে এসেছি:

const float Zero = 0.0;

যা তখন তুলনায় ব্যবহৃত হয়:

if (x > Zero) {..}

এটির তুলনায় এটি যদি আরও দক্ষ বা পাঠযোগ্য বা রক্ষণাবেক্ষণযোগ্য হয় তবে কি কেউ ব্যাখ্যা করতে পারবেন:

if (x > 0.0) {..}

দ্রষ্টব্য: আমি এই ধ্রুবকটি সংজ্ঞায়িত করার জন্য অন্যান্য কারণগুলি সম্পর্কে ভাবতে পারি, আমি কেবল এই প্রসঙ্গে এর ব্যবহার সম্পর্কে ভাবছি ।


31
বিকাশকারীরা কোডটি এমন এক মহাবিশ্বে পোর্ট করার পরিকল্পনা করছেন যেখানে গণিতের আইন আলাদা হয়?
ভাগানড্রয়েড

6
সিরিয়াসলি যদিও, আমি এর একক ভাল কারণ সম্পর্কে ভাবতে পারি না। আমি কেবল যে ব্যাখ্যাটি সামনে আসতে পারি তা
হ'ল

@ বাউকেটা -একটি বিকল্প মহাবিশ্বে? আমি মনে করি তারা ইতিমধ্যে সেখানে বাস! যাদু সংখ্যার জন্য, আমি সম্মত, তবে আমি থাম্বের নিয়মটি ব্যবহার করি যে 0 ও 1 ব্যতীত সমস্ত কিছুই স্থির করা উচিত।
এনডব্লিউএস

1
যদি xটাইপ থাকে float, তবে x > 0.0পদোন্নতির দিকে জোর দেয় double, যা কম দক্ষ হতে পারে। যদিও আপনার ধ্রুবকের সঠিক ধরণের (উদাহরণস্বরূপ 0f, float(0)বা decltype(x)(0)) সঠিক ধরণের রয়েছে তা নিশ্চিত করার জন্য এটি নামকরণকৃত ধ্রুবক ব্যবহারের পক্ষে ভাল কারণ নয় ।
মাইক সিমুর

1
@ জোসো: সুষ্ঠু হতে, ধরণের 13.37নয় float, এটি double। সুতরাং আপনি যদি একটি চাইতেন floatতবে এটি অনুগ্রহযোগ্য আপনার শিক্ষিকাটি সঠিক ছিল। কিছু প্রসঙ্গে (যেমন একটি ফ্লোটে অ্যাসাইনমেন্ট) 13.37স্পষ্টতই floatআপনি যা চান তা রূপান্তরিত হবে এবং অন্যান্য প্রসঙ্গে (যেমন টেমপ্লেটের ধরণের ছাড়) হবে না, তবে static const floatসর্বদা আপনি যে ধরণের উদ্দেশ্যটি চেয়েছিলেন তা শুরু হয়। অতএব, আরও টাইপ-নিরাপদ। মনে মনে, তাই হবে 13.37f! "টাইপ-সেফটি" বাদে ম্যাক্রো এড়ানোর অন্যান্য কারণও রয়েছে, তবে, সম্ভবত শিক্ষক সম্ভবত আপনাকে একটি তর্ক বিতর্ক দিচ্ছিলেন।
স্টিভ জেসোপ

উত্তর:


29

সম্ভাব্য কারণগুলি হ'ল ক্যাশ করা, নামকরণ করা বা জোর ধরণের ধরণ

ক্যাচিং (প্রযোজ্য নয়)

তুলনা করার সময় আপনি কোনও অবজেক্ট তৈরির ব্যয়টি এড়াতে চান। জাভাতে একটি উদাহরণ হবে

BigDecimal zero = new BigDecimal ("0.0");

এতে মোটামুটি ভারী সৃষ্টি প্রক্রিয়া জড়িত এবং সরবরাহিত স্থির পদ্ধতিটি ব্যবহার করে আরও ভাল পরিবেশিত হয়:

BigDecimal zero = BigDecimal.ZERO;

বিগডিসিমাল জেভিএম দ্বারা প্রারম্ভিককরণের সময় প্রাক-ক্যাশেড হওয়ায় এটি তৈরির পুনরাবৃত্তি ব্যয় ব্যতীত তুলনা করার অনুমতি দেয়।

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

নামকরণ (অসম্ভব)

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

জোর করে ধরণ (খুব সম্ভবত)

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


2
প্রকারভেদ করার জন্য +1। আমি এটি সি ++ এর মতো ভাষায় যুক্ত করব যা অপারেটরকে ওভারলোডিংয়ের অনুমতি দেয়, একটি ধ্রুবককে নির্দিষ্ট করে এবং এর ব্যবহারের সাথে typedefভেরিয়েবলের ধরণটি ঠিক এক জায়গায় রাখা যায় এবং কোডটি পরিবর্তন না করেই এটি পরিবর্তন করতে সক্ষম হয়।
blrfl

3
ফোর্সিং টাইপ সম্ভবত তারা যা চেষ্টা করেছিল তা নয় , তবে কেন এটি করা যায় তার এটিই সেরা ব্যাখ্যা !
NWS

7
টাইপ অত্যাচার জন্য, আমি সম্ভবত বরং ব্যবহার করতে চাই 0.0f
Svish

ফোর্সিং টাইপটি কখনও কখনও ভিবি.net এ কার্যকর হতে পারে, যেখানে বাইটে বিটওয়াইস অপারেটরগুলি সম্পাদন করা একটি বাইট ফলাফল দেয়। বলার byteVar1 = byteVar2 Or CB128চেয়ে কিছুটা ভাল লাগছে byteVar1 = byteVar2 Or CByte(128)। অবশ্যই, বাইটগুলির জন্য একটি যথাযথ সংখ্যাসূচক প্রত্যয় থাকা আরও ভাল would যেহেতু সি # অপারেটরগুলিকে বিটওয়াইজের অপারেটসগুলিকে প্রচার করে intএমনকি ফলাফলটি কোনওটিতে ফিট করার গ্যারান্টি দেওয়া byteহলেও, বিষয়টি সেখানে তেমন প্রাসঙ্গিক নয়।
সুপারক্যাট

আমি '0' এর জন্য জিরো হিসাবে ধ্রুবক নাম রাখার বিষয়ে নিশ্চিত নই তবে কখনও কখনও এটি কোড পাঠযোগ্যতায় সহায়তা করে; উদাহরণস্বরূপ, শূন্যের জন্য এই ধ্রুবকটি থাকা - "ROOT_TYPE_ID = 0" একটি বিবৃতি লিখতে সহায়তা করবে যেমন (আইডি! = ROOT_TYPE_ID) {..}
টেক জাঙ্কি

6

এটি "টুলিং নাগিং" এর কারণ

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

সুতরাং, যদিও এই সরঞ্জামগুলি এ জাতীয় সমস্যা চিহ্নিত করার বিষয়ে সঠিক, তারা প্রায়শই এমন পরিস্থিতিতেগুলির জন্য মিথ্যা ইতিবাচকতা তৈরি করে যেখানে এই মানগুলি নিরীহ এবং বেশিরভাগ ক্ষেত্রে স্থির হওয়ার সম্ভাবনা রয়েছে বা কেবল আরম্ভের মান হতে পারে।

এবং যখন এটি হয়, কখনও কখনও আপনি এই নির্বাচনের মুখোমুখি হন:

  • এগুলিকে মিথ্যা ধনাত্মক হিসাবে চিহ্নিত করা, যদি সরঞ্জামটি এটির অনুমতি দেয় (সাধারণত কোনও বিশেষ বিন্যাসযুক্ত মন্তব্য সহ, যা সরঞ্জামটি ব্যবহার না করে এমন লোকদের জন্য বিরক্তিকর হয়)
  • বা এই মানগুলি স্থির করে তোলা, তা গুরুত্বপূর্ণ হোক না কেন।

পারফরম্যান্স সম্পর্কে

এটি আমার অনুমান ভাষায় নির্ভর করে তবে জাভাতে এটি মোটামুটি সাধারণ এবং এর কার্য সম্পাদনের কোনও প্রভাব নেই কারণ মানগুলি সত্যিকারের ধ্রুবক হলে সংকলনের সময় অন্তর্ভুক্ত থাকে static final। এগুলি সি বা সি ++ এ প্রভাব ফেলবে না যদি সেগুলি ধ্রুবক হিসাবে ঘোষণা করা হয় বা প্রাক-প্রসেসর ম্যাক্রো হিসাবেও ঘোষণা করা হয়।


5

এটি স্পষ্টভাবে Zeroটাইপের হতে সংজ্ঞায়িত করার কারণে এটি বোধগম্য হতে পারে float

কমপক্ষে সি এবং সি ++ তে মান 0.0টাইপ হয় double, যখন সমান floatহয় 0.0f। সুতরাং xআপনি যে তুলনা করেন তার তুলনা করাও সর্বদা একটি floatউক্তি

x > 0.0

যখন প্রকৃতপক্ষে কোন ধরণের xসমস্যাগুলির doubleসাথে মেলে উত্সাহিত করতে পারে 0.0(বিশেষত সমতা পরীক্ষা সহ)। রূপান্তর ছাড়া তুলনা অবশ্যই হবে

x > 0.0f

যা একই কাজ করে

float Zero = 0.0; // double 0.0 converted to float  
x > Zero

তবুও, আমি মনে করি ব্যবহারকারীদের বিশ্রী কোড লিখার পরিবর্তে সংকলকটিতে রূপান্তরগুলির সতর্কতা সক্ষম করা আরও বেশি কার্যকর হবে।


1

প্রথমত, এখানে শূন্য হিসাবে সংজ্ঞায়িত করা হয় float, না int। অবশ্যই, এটি তুলনার ক্ষেত্রে কোনও কিছুকে প্রভাবিত করে না, তবে অন্যান্য ক্ষেত্রে যখন এই ধ্রুবকটি ব্যবহৃত হয়, তখন এটি কোনও পার্থক্য করতে পারে।

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


1

এটি প্রায়শই মৃত্যুদন্ড কার্যকর হওয়ার সময় ঠিক তেমন দক্ষ (যদি না আপনার সংকলকটি খুব আদিম হয়) এবং সংকলনের সময় খুব সামান্য দক্ষ।

এটি এর চেয়ে বেশি পঠনযোগ্য কিনা তা x > 0মনে রাখবেন ... মনে রাখবেন এমন কিছু লোক আছেন যারা সততার সাথে, সত্যই, মনে করেন যে সিওবিএল একটি দুর্দান্ত ধারণা এবং কাজ করার জন্য একটি আনন্দদায়ক ছিল - এবং তারপরে এমন কিছু লোক রয়েছে যারা সি সম্পর্কে ঠিক একই ধারণা করে (গুজব রয়েছে) এটি এমনকি সি ++ সম্পর্কে একই মতামত সহ কিছু প্রোগ্রামার উপস্থিত রয়েছে!) অন্য কথায়, আপনি এই বিষয়টিতে সাধারণ চুক্তি পেতে যাচ্ছেন না , এবং এটি সম্ভবত লড়াইয়ের পক্ষে উপযুক্ত নয়।


0

[এটি] এর চেয়ে সত্যই এটি আরও কার্যকর বা পঠনযোগ্য বা রক্ষণাবেক্ষণযোগ্য:

if (x > 0.0) {..}

আপনি যদি জেনেরিক (অর্থাত্ নন-টাইপ-নির্দিষ্ট) কোড লিখতেন তবে খুব সম্ভবত। কোনও zero()ফাংশন কোনও বীজগণিত টাইপ, বা যে কোনও ধরণের যা গ্রুপ রিট সংযোজন apply এটি একটি পূর্ণসংখ্যা হতে পারে, এটি একটি ভাসমান-বিন্দু মান হতে পারে, এটি এমনকি একটি ক্রিয়াকলাপ হতে পারে যদি আপনার ভেরিয়েবলটি বলে, নিজেকে কিছু রৈখিক জায়গার মধ্যেই একটি ফাংশন (যেমন x ফর্ম z -> a_x * এর লিনিয়ার ফাংশন) z + b_x) এবং তারপরে zero()একটি এবং বি উভয় zero()অন্তর্নিহিত প্রকারের সাথে ফাংশন সরবরাহ করে ।

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

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