জীর্ণ সংখ্যার তুলনায় ক্ষুদ্র ধরণের কি পছন্দসই?


22

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

কোন উপস্থাপনা ভাল? উভয়টির জন্য "কোনওটি নয়" অর্থটির জন্য একটি শর্ত পরীক্ষা করা প্রয়োজন, তবে আমি বিশ্বাস করি যে একটি নলাবদ্ধ টাইপ কিছুটা আরও ভাল উদ্দেশ্যটি জানায়।


6
যদি কোনও নম্বর ব্যবহৃত হয় তবে এটিকে একটি ধ্রুবক হিসাবে রাখুন, সরাসরি কোডে নয়।
রেনাতো দিনহানি

@ রেনাটো দিনহানি কনসেইইওও যা সাধারণ নিয়ম হতে পারে না। অন্যথায় আপনি সবকিছু সফটকোডিং শেষ করেন ।
সাইমন বার্গোট

উত্তর:


24

বিবেচনা:

  • ভাষা,

  • ফ্রেমওয়ার্ক,

  • প্রসঙ্গ।

1. ভাষা

∞ ব্যবহার করা সর্বাধিক সমাধান হতে পারে।

  • উদাহরণস্বরূপ জাভাস্ক্রিপ্টের একটি অনন্তত্ব রয়েছে। সি # না ¹

  • উদাহরণস্বরূপ, অ্যাডারের ব্যাপ্তি রয়েছে। সি # করে না।

ইন সি #, আছে int.MaxValue, কিন্তু আপনি আপনার ক্ষেত্রে এটি ব্যবহার করতে পারবেন না। int.MaxValueসর্বোচ্চ পূর্ণসংখ্যা, 2,147,483,647। যদি আপনার কোডটিতে থাকে তবে আপনার কোনও কিছুর সর্বাধিক মূল্য রয়েছে যেমন কোনও কিছু বিস্ফোরিত হওয়ার আগে সর্বাধিক গৃহীত চাপের মতো, 2,147,483,647 ব্যবহার করার কোনও অর্থ নেই।

2. ফ্রেমওয়ার্ক

.NET ফ্রেমওয়ার্কটি এই মুহুর্তে বরং অসঙ্গতিপূর্ণ এবং এর যাদু মানগুলির ব্যবহারের সমালোচনা করা যেতে পারে।

উদাহরণস্বরূপ, "Hello".IndexOf("Z")একটি যাদু মান প্রদান করে -1। এটা তোলে হয়তো কাজটিকে আরো সহজ করে (এটা আছে?) ফলাফলের নিপূণভাবে করুন:

int position = "Hello".IndexOf("Z");
if (position > 0)
{
    DoSomething(position);
}

কাস্টম কাঠামো ব্যবহার না করে:

SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
    DoSomething(occurrence.StartOffset);
}

কিন্তু এটি মোটেই স্বজ্ঞাত নয়। কেন -1এবং না -123? একটি শিক্ষানবিস ভুলক্রমে ভুলরূপেও ভাবতে পারে যার 0অর্থ খুব বেশি পাওয়া যায় না বা কেবল ভুল টাইপ করা (position >= 0)

৩. প্রসঙ্গ

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

class Timeout
{
    // A value indicating whether there is a timeout.
    public bool IsTimeoutEnabled { get; set; }

    // The duration of the timeout, in milliseconds.
    public int Duration { get; set; }
}
  • সত্য Durationহলে আমি 0 তে সেট করতে পারি IsTimeoutEnabled?
  • যদি IsTimeoutEnabledমিথ্যা হয়, আমি Duration100 এ সেট করলে কী হবে ?

এটি একাধিক ভুল হতে পারে। নিম্নলিখিত কোডের টুকরোটি কল্পনা করুন:

this.currentOperation.Timeout = new Timeout
{
    // Set the timeout to 200 ms.; we don't want this operation to be longer than that.
    Duration = 200,
};

this.currentOperation.Run();

অপারেশনটি দশ সেকেন্ডের জন্য চলে। Timeoutক্লাসের ডকুমেন্টেশন না পড়ে আপনি কি দেখতে পাচ্ছেন যে এই কোডটিতে সমস্যা আছে?

উপসংহার

  • nullমানটি এখানে নেই এমন ধারণাটি ভালভাবে প্রকাশ করে। এটি সরবরাহ করা হয়নি। পাওয়া যায় না. এটি কোনও সংখ্যা নয়, শূন্য / খালি স্ট্রিং বা যা কিছু নয়। এটি সর্বোচ্চ বা সর্বনিম্ন মানের জন্য ব্যবহার করবেন না।

  • int.MaxValueভাষার সাথেই দৃ strongly়ভাবে সম্পর্কিত। শ্রেণীর int.MaxValueসর্বাধিক গতির সীমা Vehicleবা বিমানের সর্বাধিক গ্রহণযোগ্য গতির জন্য ব্যবহার করবেন না etc.

  • -1আপনার কোডের মতো যাদু মানগুলি এড়িয়ে চলুন । তারা বিভ্রান্তিমূলক এবং কোডগুলিতে ভুলের দিকে পরিচালিত করে।

  • আপনার নিজস্ব শ্রেণি তৈরি করুন যা ন্যূনতম / সর্বাধিক মান নির্দিষ্ট করে সর্বাধিক সোজা হবে। উদাহরণস্বরূপ VehicleSpeedথাকতে পারে VehicleSpeed.MaxValue

  • পূর্ববর্তী কোনও গাইডলাইনটি অনুসরণ করবেন না এবং যাদুবিদ্যার মানগুলি ব্যবহার করুন যদি এটি একটি নির্দিষ্ট ক্ষেত্রের কয়েক দশক ধরে একটি সাধারণ সম্মেলন হয়, তবে বেশিরভাগ লোকেরা এই ক্ষেত্রে কোড লেখেন।

  • পদ্ধতির মিশ্রণ করতে ভুলবেন না। উদাহরণ স্বরূপ:

    class DnsQuery
    {
        public const int NoTimeout = 0;
    
        public int Timeout { get; set; }
    }
    
    this.query.Timeout = 0; // For people who are familiar with timeouts set to zero.
    // or
    this.query.Timeout = DnsQuery.NoTimeout; // For other people.
    

¹ আপনি নিজের ধরণের তৈরি করতে পারেন যার মধ্যে অনন্ততা রয়েছে। এখানে, আমি intকেবল নেটিভ টাইপের কথা বলছি ।


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

1
@ ড্যাওয়ার্ডে আমি বিশ্বাস করি যে মেইনমা সেই নির্দেশিকাগুলির উল্লেখ করছেন যা তিনি নিজে এই একটির উপরে দিয়েছেন।
জোশুয়া ড্রাক

1
আমি সূচকের সাথে একমত নই, উদাহরণস্বরূপ -1 স্ট্রিংয়ের বাইরে রয়েছে, যা জেড অবশ্যই।
জোশুয়া ড্রাক

5
"উদাহরণস্বরূপ, জাভাস্ক্রিপ্টের একটি অনন্তত্ব রয়েছে C সি # নেই" " - হাহ?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

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

12

নাল কোনও যাদু সংখ্যার চেয়ে ভাল নয়।

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

if (timeout == 4298435) ... // bad.
if (timeout == null) ... // bad.
if (timeout == NEVER_TIME_OUT) ... // yay! puppies and unicorns!

2
ঠিক আছে, সম্ভবত এটি ভাষার উপর আরও নির্ভর করে, তবে সি # তে, আপনি সম্ভবত এটি করতে পারেন: যদি (সময়সীমা.হ্যাসভ্যালু) নালীর সাথে সরাসরি তুলনা না করে।
ম্যাট এইচ

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

9
নাল অর্থ মূল্য অনুপস্থিত। এটি এমন ধারণা যা প্রচুর যাদু সংখ্যার প্রকাশের উদ্দেশ্যে রয়েছে। একটি প্রকারভেদযুক্ত ধরণের সাথে নাল ব্যবহার করতে সক্ষম হওয়াই একটি ডেটা টাইপের জন্য সম্ভাব্য মানের সীমা থেকে একটি স্বেচ্ছাসেবী মান বাছাইয়ের চেয়ে অনেক বেশি ভাল সমাধান।
26 এর

2
আপনার যাদু মান হিসাবে "নাল" ব্যবহার করা আপনার ধরণের যদি "নাল" থাকে তবে তা ঠিক আছে। এটি গুরুত্বপূর্ণ নামটি হ'ল, কারণ পরের লোকটি শ্যুটিন হিসাবে নিশ্চিত হয়ে আসবে যে আপনি কী বোঝাতে চেয়েছিলেন তা বুঝতে পারবেন না। নাল মানে "অনন্ত," "এখনও নির্দিষ্ট নয়," "কোড কাঠামো তৈরি করেছে যা ডেটা স্ট্রাকচার তৈরি করেছে," বা অন্য যে কোনও সংখ্যক জিনিস। কেবলমাত্র একটি নামই পরবর্তী কোডারকে জানতে দেয় যে আপনি সেই মানটি সেখানে থাকা এবং আপনি কী আচরণের দ্বারা এটি ট্রিগার করতে চেয়েছিলেন।
mjfgates

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

10

MAGIC_NUMBERকোড যেখানেই সম্ভব সর্বদা সর্বদা এড়ানো উচিত। nullঅভিপ্রায় একটি স্পষ্ট প্রকাশ।


6

সি # তে, অনেক সিএলআর ক্লাসে স্থির Emptyসদস্য থাকে:

  • System.String.Empty
  • System.EventArgs.Empty
  • System.Guid.Empty
  • System.Drawing.Rectangle.Empty
  • System.Windows.Size.Empty

এটি আপনাকে কোনও ম্যাজিক মান ব্যবহার করতে হবে বা খালি বস্তুটি তৈরি করতে নাল ব্যবহার করবে কিনা তা আপনাকে মনে রাখতে বাধা দেয়।

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


3

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

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


3

এই ক্ষেত্রে, আমি মনে করি একটি nullable টাইপ নির্ভুল ধারণা তৈরি করে।

নাল অর্থ মূল্য অনুপস্থিত। এটির একটি সংখ্যা 0 এর মান থাকা একটি পৃথক ধারণা different

যদি আপনি বলতে চান "আমি যদি আপনাকে একটি মান না দিয়ে থাকি তবে সর্বাধিক ব্যবহার করুন" তবে নালার মধ্যে দিয়ে যাওয়াই এটি প্রকাশ করার সঠিক সঠিক উপায়।


1

নাল: সাধারণ ত্রুটি মান, অনির্ধারিত, বাতিল, বা মানের অনুপস্থিতি।

শূন্য: একটি আসল, তবে অগত্যা যৌক্তিক বা স্বজ্ঞাত মান নয় (এই প্রসঙ্গে)। আরম্ভের ক্ষেত্রে একটি সাধারণ মান।

আপনার সমস্যার প্রসঙ্গে timeoutInMillisecondsসম্পত্তিটি isচ্ছিক এবং এই পদ্ধতির ওভারহেড এটিকে বিকল্প হিসাবে অযোগ্য ঘোষণা করবে বলে কোনও উল্লেখ নেই।

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


0

নাল ব্যবহার করা খারাপ MagicNumber। নাল ধারণাটিকে আরও ভালভাবে প্রকাশিত করে প্রতিনিধিত্ব করে, তবে এটি যেভাবে আচরণ করে তা প্ল্যাটফর্মের জুড়ে এটি সামঞ্জস্যপূর্ণ নয়, MagicNumberসদা ব্যবহার করে একইভাবে কার্যকর যা উপকারী।

পরিবেশ / ভাষার উপর নির্ভর করে নাল পারে

  • কেবল 0 হবে
  • আইনী মূল্য হতে পারে না
  • থ্রি ওয়ে লজিকের কারণে অপ্রত্যাশিত ফলাফল আসতে পারে

MagicNumber সর্বদা একই আচরণ করে


0

আপনি যদি ম্যাজিক নম্বরটি পরীক্ষা করতে ভুলে যান (ডানটি ঘটতে চলেছে), তবে একটি যাদু নম্বরটি অযৌক্তিক ডেটা সহ অল্প সময়ের জন্য চলতে থাকবে। যত তাড়াতাড়ি সম্ভব একটি ব্যতিক্রম ঘটায় এমন নাল রাখা আরও ভাল।


-1

নাল একটি যাদু সংখ্যার একমাত্র বিকল্প নয়।

public static int NO_TIMEOUT = 0;  // javaish

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

স্কালা (উদাহরণস্বরূপ) অপশন শ্রেণিতে একটি দুর্দান্ত বিকল্প রয়েছে। অপশন শ্রেণীর দুটি মানগুলির মধ্যে একটিতে কয়েকটি রয়েছে - কিছু - যা আপনার সত্যিকারের মানটি लपेटায় এবং কোনওটি নয় - যার কোনও মান নেই।

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

এবং সমস্ত ম্যাজিক নম্বর সমস্যা নয়। 0, 1, 1024 ইত্যাদির উপর নির্ভর করে সমস্ত সুস্পষ্ট হতে পারে। 347? হ্যাঁ, এটিকে আপনার এড়ানো উচিত। :-)


4
-১: "নাল ইজ অশুভ" জাস্টিফাই করুন।
ডিফোরে

4
একটি সংখ্যার জন্য একটি উপাধি সংজ্ঞা দেওয়া সত্য যে এটি এখনও একটি যাদু নম্বর পরিবর্তন করে না।
26 এর

ভাল, সম্ভবত আপনার চেয়ে আমার চেয়ে যাদু সংখ্যার আলাদা সংজ্ঞা রয়েছে। দয়া করে en.wikedia.org/wiki/… দেখুন
জন স্ট্রেয়ার

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