"অজানা" এবং "অনুপস্থিত" এর মধ্যে পার্থক্য বজায় রেখে আমি কীভাবে একটি ভেরিয়েবলে "অজানা" এবং "অনুপস্থিত" মানগুলি সংরক্ষণ করব?


57

এটি একটি "একাডেমিক" প্রশ্ন বিবেচনা করুন। আমি সময়ে সময়ে NULLs এড়ানোর বিষয়ে ভাবছিলাম এবং এটি একটি উদাহরণ যেখানে আমি সন্তোষজনক সমাধান নিয়ে আসতে পারি না।


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

  • সেই সময়ে আসল পরিমাপ (উদাহরণস্বরূপ, সহ কোনও সংখ্যাসূচক মান 0)
  • একটি "অনুপস্থিত" / "খালি" মান (অর্থাত্ একটি পরিমাপ করা হয়েছিল, এবং মানটি সেই স্থানে খালি রয়েছে বলে জানা যায়)।
  • একটি অজানা মান (অর্থাত্ সেই সময়ে কোনও পরিমাপ করা হয়নি It এটি খালি হতে পারে, তবে এটি অন্য কোনও মানও হতে পারে)।

গুরুত্বপূর্ণ স্পষ্টতা:

ধরে নিই যে আপনার get_measurement()"খালি", "অজানা" এবং "পূর্ণসংখ্যার" টাইপের একটি মান ফেরত দেওয়ার একটি ফাংশন রয়েছে । একটি সংখ্যাসূচক মান হ'ল বোঝা যায় যে কিছু ক্রিয়াকলাপ রিটার্ন মান (গুণ, বিভাগ, ...) এ করা যেতে পারে তবে NULL- তে এই ধরনের ক্রিয়াকলাপ ব্যবহার করা হলে অ্যাপ্লিকেশনটি ক্র্যাশ হবে।

আমি নুল চেক এড়িয়ে কোড লিখতে সক্ষম হতে চাই, উদাহরণস্বরূপ (সিউডোকোড):

>>> value = get_measurement()  # returns `2`
>>> print(value * 2)
4

>>> value = get_measurement()  # returns `Empty()`
>>> print(value * 2)
Empty()

>>> value = get_measurement()  # returns `Unknown()`
>>> print(value * 2)
Unknown()

দ্রষ্টব্য যে printবিবৃতিগুলির কোনওটিরই ব্যতিক্রম ঘটেনি (যেমন কোনও NUL ব্যবহৃত হয়নি)। সুতরাং খালি ও অজানা মানগুলি প্রয়োজনীয় হিসাবে প্রচার করবে এবং সত্যই "মান অজানা" বা "খালি" আছে কিনা তা যাচাই করা প্রয়োজন না হওয়া পর্যন্ত দেরী হতে পারে (যেমন কোথাও মান সংরক্ষণ করা / সিরিয়ালিং করা)।


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


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

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

2
@ এক্সহুমা আমি তখন এটি "প্রযোজ্য নয়" হিসাবে বর্ণনা করব।
ভিনসেন্ট

6
কৌতূহলের বাইরে আপনি "খালি" যে কোনও স্কেলের শূন্যের সমান নয় যেখানে আপনি কোন ধরণের পরিমাপ করছেন? "অজানা" / "অনুপস্থিত" আমি দরকারী হয়ে উঠতে দেখতে পাচ্ছি উদাহরণস্বরূপ যদি কোনও সেন্সর সংকুচিত না হয় বা যদি সেন্সরের কাঁচা আউটপুট কোনও কারণে বা অন্য কোনও কারণে আবর্জনা হয় তবে প্রতিটি ক্ষেত্রে "খালি" আমি ভাবতে পারি আরও ধারাবাহিক হতে পারে দ্বারা প্রতিনিধিত্ব 0, []অথবা {}(স্কালে 0, খালি তালিকা এবং খালি মানচিত্র, যথাক্রমে)। এছাড়াও, সেই "অনুপস্থিত" / "অজানা" মানটি হ'ল মূলত যা nullহ'ল - এটি উপস্থাপন করে যে সেখানে কোনও বস্তু থাকতে পারে, কিন্তু নেই।
নিক হার্টলি

7
এর জন্য আপনি যে কোনও সমাধানই ব্যবহার করুন না কেন, নিজেকে জিজ্ঞাসা করতে ভুলবেন না যে এটি একই ধরণের সমস্যার সাথে ভুগছে কিনা যা আপনাকে প্রথমে NULL নির্মূল করতে চায়।
রায়

উত্তর:


85

কমপক্ষে কার্যকরী ভাষা সহ এটি করার সাধারণ উপায় হ'ল বৈষম্যমূলক ইউনিয়ন ব্যবহার করা। এরপরে এটি এমন একটি মান যা বৈধ অভ্যন্তরের একটি, একটি মান যা "অনুপস্থিত" বা "অজানা" নির্দেশ করে এমন একটি মান। এফ # তে এটি দেখতে কিছুটা দেখতে পাওয়া যাবে:

type Measurement =
    | Reading of value : int
    | Missing
    | Unknown of value : RawData

Measurementতারপরে একটি মান Readingহ'ল একটি , কোন মান সহ, বা ক Missing, বা Unknownকাঁচা ডেটা সহ value(যদি প্রয়োজন হয়) হবে।

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


7
আপনি ওও ভাষাগুলিতে যোগফলগুলি করতে পারেন তবে তাদের স্ট্যাকওভারফ্লো
জে কে

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

14
@jk। হ্যাঁ, তারা গণনা করে না (তারা ভাল করে বলে আমার ধারণা; সুরক্ষার অভাবে তারা এই দৃশ্যে খুব খারাপ)। আমি বলতে চাইছিলাম std::variant(এবং এর আধ্যাত্মিক পূর্বসূরীরা)।
কনরাড রুডল্ফ

2
@ ইভান না, এটি বলছে "পরিমাপ একটি ডেটাটাইপ যা হয়… বা…"।
কনরাড রুডল্ফ

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

58

যদি আপনি ইতিমধ্যে একটি মোনাড কী তা জানেন না, তবে শেখার জন্য আজকের দিনটি দুর্দান্ত। ওও প্রোগ্রামারদের এখানে আমার একটি মৃদু পরিচয় আছে:

https://ericlippert.com/2013/02/21/monads-part-one/

আপনার দৃশ্যটি "সম্ভবত মোনাড" -এর একটি ছোট এক্সটেনশান, এটি Nullable<T>সি # এবং Optional<T>অন্যান্য ভাষায়ও পরিচিত ।

ধরা যাক আপনার কাছে মোনাড উপস্থাপনের জন্য কোনও বিমূর্ত প্রকার রয়েছে:

abstract class Measurement<T> { ... }

এবং তারপরে তিনটি সাবক্লাস:

final class Unknown<T> : Measurement<T> { ... a singleton ...}
final class Empty<T> : Measurement<T> { ... a singleton ... }
final class Actual<T> : Measurement<T> { ... a wrapper around a T ...}

আমাদের বাইন্ডের একটি বাস্তবায়ন প্রয়োজন:

abstract class Measurement<T>
{ 
    public Measurement<R> Bind(Func<T, Measurement<R>> f)
  {
    if (this is Unknown<T>) return Unknown<R>.Singleton;
    if (this is Empty<T>) return Empty<R>.Singleton;
    if (this is Actual<T>) return f(((Actual<T>)this).Value);
    throw ...
  }

এটি থেকে আপনি বিনয়ের এই সরল সংস্করণটি লিখতে পারেন:

public Measurement<R> Bind(Func<A, R> f) 
{
  return this.Bind(a => new Actual<R>(f(a));
}

এবং এখন আপনি সম্পন্ন করেছেন। আপনার Measurement<int>হাতে আছে আপনি এটি দ্বিগুণ করতে চান:

Measurement<int> m = whatever;
Measurement<int> doubled = m.Bind(a => a * 2);
Measurement<string> asString = m.Bind(a => a.ToString());

এবং যুক্তি অনুসরণ করুন; যদি mহয় Empty<int>তবে asStringহয় Empty<String>, চমৎকার।

একইভাবে, আমরা যদি

Measurement<int> First()

এবং

Measurement<double> Second(int i);

তারপরে আমরা দুটি পরিমাপ একত্রিত করতে পারি:

Measurement<double> d = First().Bind(Second);

এবং আবার, যদি First()হয় Empty<int>তাহলে dহয় Empty<double>ইত্যাদি।

বাঁধাইয়ের ক্রিয়াকলাপটি সঠিক হওয়া গুরুত্বপূর্ণ পদক্ষেপ । এটি সম্পর্কে কঠোরভাবে চিন্তা করুন।


4
মনড (কৃতজ্ঞতা) বোঝার চেয়ে ব্যবহার করা আরও সহজ। :)
গুরান

11
@ বামফেরার চৌবাচ্চা: অবশ্যই কারণ আমি সেই চুল বিভাজক পার্থক্যে যেতে চাইনি; আসল পোস্টার নোট হিসাবে, সোনাদের সাথে কাজ করার ক্ষেত্রে অনেকের আত্মবিশ্বাসের ঘাটতি থাকে। সহজ অপারেশনগুলির জারগন-বোঝা বিভাগের তত্ত্বের বৈশিষ্ট্যগুলি আত্মবিশ্বাস এবং বোঝার বোধ তৈরি করার বিরুদ্ধে কাজ করে।
এরিক লিপার্ট

2
সুতরাং আপনার পরামর্শটি + কিছু বয়লারপ্লেট কোড Nullদিয়ে প্রতিস্থাপন করার জন্য Nullable? :)
এরিক ডুমিনিল

3
@ ক্লাউড: আপনার আমার টিউটোরিয়ালটি পড়া উচিত। একটি মোনাড একটি জেনেরিক টাইপ যা নির্দিষ্ট নিয়ম অনুসরণ করে এবং ক্রিয়াকলাপের একটি শৃঙ্খলে একত্রে আবদ্ধ করার ক্ষমতা সরবরাহ করে, তাই Measurement<T>এক্ষেত্রে মোনাডিক প্রকার।
এরিক লিপার্ট

5
@ ডাবরোস: যদিও আমি সম্মত হই যে রাষ্ট্রীয় মনবাদগুলি মনাদকে পরিচয় করানোর একটি ভাল উপায়, তবে আমি রাষ্ট্রকে এমন এক জিনিস হিসাবে বিবেচনা করি না যা একটি মনাদকে চিহ্নিত করে। আমি মনে করি যে আপনি ক্রিয়াকলাপগুলির ক্রমকে এক সাথে বাঁধতে পারেন এটি হ'ল বাধ্যকারী জিনিস; রাষ্ট্রীয়তা কেবল একটি বাস্তবায়ন বিশদ।
এরিক লিপার্ট

18

আমি মনে করি যে এক্ষেত্রে নাল অবজেক্ট প্যাটার্নে একটি পরিবর্তন কার্যকর হবে:

public class Measurement
{
    private int value;
    private bool isUnknown = false;
    private bool isMissing = false;

    private Measurement() { }
    public Measurement(int value) { this.value = value; }

    public int Value {
        get {
            if (!isUnknown && !isMissing)
            {
                return this.value;
            }
            throw new SomeException("...");
        }                   
    }

    public static readonly Measurement Unknown = new Measurement
    {
        isUnknown = true
    };

    public static readonly Measurement Missing = new Measurement
    {
        isMissing = true
    };
}

আপনি এটিকে একটি স্ট্রাক্টে রূপান্তর করতে পারেন, সমান / গেটহ্যাশকোড / টোস্ট্রিংকে ওভাররাইড intকরতে পারেন, থেকে বা এতে অন্তর্নিহিত রূপান্তরগুলি যুক্ত করতে পারেন এবং যদি আপনি এনএএন -এর মতো আচরণ চান তবে আপনি নিজের পাটিগণিত অপারেটরগুলিও প্রয়োগ করতে পারেন, যেমন। Measurement.Unknown * 2 == Measurement.Unknown

এটি বলেছিল, সি # এর Nullable<int>সমস্ত প্রয়োগ করে, একমাত্র সতর্কতার সাথে আপনি বিভিন্ন ধরণের এসের মধ্যে পার্থক্য করতে পারবেন না null। আমি জাভা ব্যক্তি নই, তবে আমার বোধগম্যতা হচ্ছে জাভা এর OptionalIntঅনুরূপ, এবং অন্য ভাষাগুলির কাছে কোনও Optionalপ্রকারের প্রতিনিধিত্ব করার নিজস্ব নিজস্ব সুবিধা রয়েছে ।


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

2
নাল অবজেক্ট প্যাটার্নের বিন্দুটি কি এটি নয় যে আপনি অবৈধ মানগুলিতে ব্যর্থ হন না, বরং কিছুই করেন না?
ক্রিস ওয়াহলার্ট

2
@ ক্রিসহোহরল্ট এই ক্ষেত্রে অবজেক্টটি ছাড়া সত্যিকার অর্থে কোনও পদ্ধতি নেই Valueযা আপনি ব্যাকটিকে কোনও রূপে রূপান্তর করতে না পারায় একেবারে ব্যর্থ হয়ে Unknownযায় int। যদি পরিমাপটিতে একটি, বলুন, SaveToDatabase()পদ্ধতি থাকে তবে একটি ভাল বাস্তবায়ন সম্ভবত লেনদেন করবে না যদি বর্তমান বস্তুটি নাল বস্তু হয় (হয় সিঙ্গলটনের সাথে তুলনা করে, বা কোনও পদ্ধতিকে ওভাররাইড)।
ম্যাকিয়েজ স্টাচোভস্কি

3
@ ম্যাসিজেস্টাচোস্কি হ্যাঁ, আমি বলছি না এটির কিছু করা উচিত নয়, আমি বলছি নাল অবজেক্ট প্যাটার্নটি খুব উপযুক্ত নয়। আপনার সমাধান জরিমানা হতে পারে, কিন্তু আমি এটা বলব না নাল অবজেক্ট প্যাটার্ন
ক্রিস ওহলার্ট

14

আপনি যদি আক্ষরিকভাবে একটি পূর্ণসংখ্যার ব্যবহার করতেই পারেন তবে কেবলমাত্র একটি সম্ভাব্য সমাধান রয়েছে। 'ম্যাজিক নম্বর' হিসাবে কিছু সম্ভাব্য মান ব্যবহার করুন যার অর্থ 'নিখোঁজ' এবং 'অজানা'

যেমন 2,147,483,647 এবং 2,147,483,646

আপনার যদি 'বাস্তব' পরিমাপের জন্য কেবল ইনট প্রয়োজন হয়, তবে আরও জটিল ডেটা স্ট্রাকচার তৈরি করুন

class Measurement {
    public bool IsEmpty;
    public bool IsKnown;
    public int Value {
        get {
            if(!IsEmpty && IsKnown) return _value;
            throw new Exception("NaN");
            }
        }
}

গুরুত্বপূর্ণ স্পষ্টতা:

আপনি ক্লাসের জন্য অপারেটরগুলি ওভারলোড করে গণিতের প্রয়োজনীয়তা অর্জন করতে পারেন

public static Measurement operator+ (Measurement a, Measurement b) {
    if(a.IsEmpty) { return b; }
    ...etc
}

10
@ কাকতুরুসOption<Option<Int>>
বার্গি

5
@ বেরগি আপনি সম্ভবত এটি এমনকি দূর থেকে গ্রহণযোগ্যভাবে ভাবতেও পারবেন না
ব্লুরাজা - ড্যানি প্লেফুঘুফট

8
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট আসলে এটি ওপিএসের বর্ণনাকে বেশ ভালভাবে ফিট করে, যার নেস্টেড কাঠামোও রয়েছে। গ্রহণযোগ্য হওয়ার জন্য আমরা অবশ্যই একটি যথাযথ প্রকারের উপন্যাস (বা "নিউ টাইপ") প্রবর্তন করব - তবে type Measurement = Option<Int>এটির জন্য একটি পূর্ণসংখ্যা বা খালি পাঠ্য ঠিক আছে, এবং এটি এমন Option<Measurement>একটি পরিমাপের জন্য যা গ্রহণ করা হয়েছে বা নাও হতে পারে ।
বার্গি

7
@arp "NaN এর নিকটে পূর্ণসংখ্যা"? আপনি কি বলতে চাইছেন তা বোঝাতে পারেন? এটি কিছুটা বিপরীতমুখী বলে মনে হচ্ছে যে কোনও সংখ্যা একটি সংখ্যক না হওয়ার একেবারে ধারণাটি "কাছে" রয়েছে।
নিক হার্টলি

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

11

আপনার ভেরিয়েবল ফ্লোটিং পয়েন্ট হয় সংখ্যা, IEEE754 (ফ্লোটিং পয়েন্ট সংখ্যা মান যা অধিকাংশ আধুনিক প্রসেসর ও ভাষার দ্বারা সমর্থিত) আপনার পিছনে রয়েছে: একটি স্বল্প-পরিচিত বৈশিষ্ট্য, কিন্তু মান এক নয়, কিন্তু সংজ্ঞায়িত একটি পুরো পরিবারের এর NaN (একটি সংখ্যা নয়) মানগুলি যা স্বেচ্ছাসেবী প্রয়োগ-সংজ্ঞায়িত অর্থের জন্য ব্যবহার করা যেতে পারে। একক-নির্ভুলতা ভাসমান ক্ষেত্রে, উদাহরণস্বরূপ, আপনার কাছে 22 টি ফ্রি বিট রয়েছে যা আপনি 2 ^ {22} ধরণের অবৈধ মানগুলির মধ্যে পার্থক্য করতে ব্যবহার করতে পারেন।

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

অবৈধ ডেটা সিগন্যাল করার জন্য এগুলি ব্যবহার করা আপনার নিজের "ম্যাজিক নম্বর" পুনর্নবীকরণের চেয়ে ভাল, কারণ এগুলি সঠিকভাবে প্রচার করে এবং অবৈধ নেসকে সংকেত দেয়: উদাহরণস্বরূপ, যদি আপনি কোনও average()ফাংশন ব্যবহার করেন এবং আপনার যদি চেক করতে ভুলে যান তবে নিজেকে পায়ে গুলি করার ঝুঁকি নেই don't আপনার বিশেষ মান।

একমাত্র ঝুঁকি হ'ল গ্রন্থাগারগুলি তাদের সঠিকভাবে সমর্থন করে না, যেহেতু এগুলি যথেষ্ট অস্পষ্ট বৈশিষ্ট্য: উদাহরণস্বরূপ, একটি সিরিয়ালাইজেশন লাইব্রেরি তাদের সমস্তকে সমানভাবে সমতল করতে পারে nan(যা বেশিরভাগ উদ্দেশ্যে এটি সমান দেখায়)।


6

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

var value = Measurement.of(2);
out.println(value.map(x -> x * 2));

var empty = Measurement.empty();
out.println(empty.map(x -> x * 2));

var unknown = Measurement.unknown();
out.println(unknown.map(x -> x * 2));

মুদ্রণ

Value(4)
Empty()
Unknown()

( একটি সংক্ষিপ্ত রূপ হিসাবে সম্পূর্ণ বাস্তবায়ন ।)

একটি এফপি ভাষা বা লাইব্রেরি অন্যান্য সরঞ্জাম সরবরাহ করে Try( যেমন (ওরফে Maybe) (একটি বস্তু যার মধ্যে একটি মান, বা ত্রুটি রয়েছে)) এবং Either(এমন একটি বস্তু যা একটি সাফল্যের মান বা ব্যর্থতার মান ধারণ করে) এখানেও ব্যবহার করা যেতে পারে।


2

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

কেবল নাল একটি "দ্বিতীয় স্বাদ" নিয়ে আসা প্রসেসের ডাউনস্ট্রিম সেটটিকে যুক্তিসঙ্গত আচরণের সেট সেট করার জন্য পর্যাপ্ত তথ্য দেয় না।

আপনি যদি ডাউন স্ট্রিম কোড দ্বারা তৈরি খারাপ আচরণের উত্স সম্পর্কে প্রাসঙ্গিক অনুমানের পরিবর্তে নির্ভর করে থাকেন তবে আমি সেই খারাপ আর্কিটেকচারকে কল করব।

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

এটি পরিচালনা করার জন্য কিছু নিদর্শন:

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

2

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


"কিছু করা" উল্লেখ করার জন্য আপত্তিযুক্ত
বিদায় এমএস চিপস

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

2

সংক্ষেপে যদি প্রশ্নটি মনে হয় "কীভাবে আমি একটি পদ্ধতি থেকে দুটি সম্পর্কিত সম্পর্কহীন টুকরো ফেরত দেব যা একটি একক প্রকার ফেরত দেয়? আমি কখনই আমার ফেরতের মানগুলি পরীক্ষা করতে চাই না, এবং নালগুলি খারাপ, সেগুলি ব্যবহার করবেন না।"

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

প্রথমদিকে, তখন দেখে মনে হচ্ছে এটি ব্যতিক্রম ছোঁড়ার জন্য ভাল ক্ষেত্রে হতে পারে।

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

এবং এটি কেবলমাত্র সিস্টেম যা আপনাকে গ্যারান্টিযুক্ত-বৈধ ইনটগুলি ফিরিয়ে আনতে দেয় এবং গ্যারান্টি দেয় যে প্রতিটি ইনট অপারেটর এবং পদ্ধতি যে ইনট নেয় সেগুলি নাল, বা যাদু মানগুলির মতো অবৈধ মানগুলি পরীক্ষা করার প্রয়োজন ছাড়াই এই পদ্ধতির রিটার্ন মানটি গ্রহণ করতে পারে।

কিন্তু ব্যতিক্রম সত্যিই শুধুমাত্র একটি বৈধ সমাধান হলে, যেমন নাম থেকেই বোঝা, এই একটি হল ব্যতিক্রমী মামলা, না ব্যবসায়ের স্বাভাবিক কাজকর্মের।

এবং একটি চেষ্টা / ক্যাচ এবং হ্যান্ডলারটি নাল চেকের মতোই বয়লারপ্লেট, যা প্রথম স্থানে আপত্তি জানানো হয়েছিল।

এবং যদি কলারটিতে চেষ্টা / ধরা না থাকে, তবে কলারের কলারটি করতে হবে এবং আরও অনেক কিছু।


একটি নিষ্পাপ দ্বিতীয় পাস বলতে হয় "এটি একটি পরিমাপ .ণাত্মক দূরত্বের পরিমাপ সম্ভাবনা কম।" সুতরাং কিছু পরিমাপের জন্য ওয়াই, আপনার পক্ষে কেবল কনসেট থাকতে পারে

  • -1 = অজানা,
  • -2 = পরিমাপ করা অসম্ভব,
  • -৩ = উত্তর দিতে অস্বীকার করেছে,
  • -4 = জ্ঞাত তবে গোপনীয়,
  • -5 = চাঁদের ধাপের উপর নির্ভর করে পরিবর্তিত হয়, টেবিল 5 এ দেখুন,
  • -6 = চতুর্মাত্রিক, পরিমাপ শিরোনামে দেওয়া,
  • -7 = ফাইল সিস্টেম পড়ার ত্রুটি,
  • -8 = ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত,
  • -9 = বর্গ / কিউবিক তাই Y এক্স এর সমান
  • -10 = হ'ল একটি মনিটরের স্ক্রিন তাই এক্স, ওয়াই পরিমাপ ব্যবহার না করে: এক্সটিকে স্ক্রিনের তির্যক হিসাবে ব্যবহার করুন,
  • -11 = একটি রশিদের পিছনে পরিমাপগুলি লিখেছিল এবং এটি অযৌক্তিকরূপে পরিণত করা হয়েছিল তবে আমি মনে করি এটি 5 বা 17 হয়,
  • -12 = ... আপনি ধারণা পাবেন।

এটি প্রচুর পুরানো সি সিস্টেমে, এবং এমনকি আধুনিক সিস্টেমে যেখানে প্রকৃত প্রতিবন্ধকতা রয়েছে সেখানে এটি করা হয় এবং আপনি এটিকে কোনও ধরণের স্ট্রাক্ট বা মোনাডে আবদ্ধ করতে পারবেন না।

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

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


আমাদের তৃতীয় প্রয়াসের পরে, আমরা এমন কেসগুলিতে সন্ধান করি যেখানে ব্যবসায়ের স্বাভাবিক অন্তর্ভুক্ত মূল্য না থাকা have উদাহরণস্বরূপ, যদি এই মানগুলির সংকলনে একাধিক অ-পূর্ণসংখ্যার এন্ট্রি থাকতে পারে। এর অর্থ একটি ব্যতিক্রম হ্যান্ডলারটি ভুল পদ্ধতির হতে পারে।

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

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

"নাল ব্যবহার করবেন না" এর পিছনে আপনার যুক্তিগুলি অনুসন্ধান করতে হবে।

ব্যতিক্রমগুলির মতো নাল মানেই ব্যতিক্রমী রাষ্ট্রকে বোঝানো।

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

সুতরাং প্রতিবার আপনি এই পদ্ধতিটি কল করার সময় অবশ্যই অবশ্যই তার ফেরতের মূল্যের জন্য অবশ্যই পরীক্ষা করা উচিত, তবে আপনি অবৈধ মানগুলি হ্যান্ডেল করুন, তা ইন-ব্যান্ড বা ব্যান্ডের বাইরে, চেষ্টা করুন / ধরুন, "যুক্তি" উপাদানটির জন্য কাঠামোটি পরীক্ষা করে, আন্তঃ একটি যাদু নম্বর জন্য, বা একটি শূন্য জন্য একটি int পরীক্ষা করা ...

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

... এবং তারপরে আপনার অ্যাপ্লিকেশনের প্রতিটি অপারেটর ওভারলোড করুন যা এই ডেটাতে প্রয়োগ হতে পারে।

... এবং তারপরে ইনট লাগতে পারে এমন সমস্ত পদ্ধতি ওভারলোড করুন।

... এবং এই সমস্ত ওভারলোডগুলির মধ্যে এখনও অবৈধ ints এর জন্য চেক থাকা দরকার , যাতে আপনি এই এক পদ্ধতির রিটার্ন টাইপটিকে এমনভাবে আচরণ করতে পারেন যেন আপনি যখন কল করছেন তখন এটি সর্বদা একটি বৈধ int ছিল।

সুতরাং মূল ভিত্তিটি বিভিন্ন উপায়ে মিথ্যা:

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

1

আমি আপনার প্রশ্নের ভিত্তি বুঝতে পারি না, তবে এখানে মুখের মানটির উত্তর দেওয়া হচ্ছে। অনুপস্থিত বা খালি করার জন্য, আপনি math.nan(সংখ্যা নয়) করতে পারেন । আপনি কোনও গাণিতিক ক্রিয়াকলাপ সম্পাদন করতে পারেন math.nanএবং এটি থাকবে math.nan

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

অন্যান্য ভাষায় গার্ড ক্লজ রয়েছে (যেমন সুইফট বা রুবি), এবং রুবির শর্তযুক্ত শুরুর দিকে ফিরে আসে।

আমি পাইথনে এটি সমাধান করেছি কয়েকটি ভিন্ন উপায়ে:

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

1

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

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

সমাধান 1: নাল চেক এড়িয়ে চলবেন না

Missingহিসাবে প্রতিনিধিত্ব করা math.nan
Unknownযেতে পারে হিসাবে উপস্থাপন করা যেতে পারেNone

আপনার যদি একাধিক মান থাকে তবে filter()আপনি কেবল সেই মানগুলিতে অপারেশন প্রয়োগ করতে পারেন যা না হয় Unknownবা Missingফাংশনের জন্য আপনি যে মানটি উপেক্ষা করতে চান তা প্রয়োগ করতে পারেন।

আমি এমন একটি দৃশ্যের কল্পনা করতে পারি না যেখানে আপনার কোনও ফাংশন যা একটি একক স্কেলারের উপর কাজ করে তার নাল চেক দরকার। সেক্ষেত্রে নাল-চেকগুলি জোর করা ভাল।


সমাধান 2: একটি সজ্জা ব্যবহার করুন যা ব্যতিক্রমগুলি ধরা দেয়

এই ক্ষেত্রে, এটি অপারেশন করা হয় বাড়াতে পারে এবং Missingউত্থাপন করতে পারে ।MissingExceptionUnknownUnknownException

@suppressUnknown(value=Unknown) # if an UnknownException is raised, return this value instead
@suppressMissing(value=Missing)
def sigmoid(value):
    ...

এই পদ্ধতির সুবিধা হলো এর বৈশিষ্ট্য Missingএবং Unknownশুধুমাত্র আর দেখানো হয় না যখন আপনি স্পষ্টভাবে জিজ্ঞাসা তাদের দমন করা জন্য। আরেকটি সুবিধা হ'ল এই পদ্ধতির স্ব-ডকুমেন্টিং: প্রতিটি ফাংশন দেখায় যে এটি অজানা বা অনুপস্থিত এবং কীভাবে কার্যকারিতা প্রত্যাশা করে।

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

sigmoidএখনও এটি কল করতে পারে sin, যদিও এটি কোনও প্রত্যাশা করে না Missingবা Unknown, যেহেতু sigmoidএর সজ্জাকারী ব্যতিক্রমটি ধরবে।


1
ভাবছি কি (এই হল একই প্রশ্নের দুটি উত্তর পোস্ট বিন্দু আপনার পূর্বের উত্তর , এটা নিয়ে কিছু ভুল?)
মশা

@ জাগান এই উত্তরটি যুক্তি প্রদান করে যে লেখক যেভাবে দেখায় সেভাবে কেন এটি করা উচিত নয় এবং আমি দুটি ধারণাকে বিভিন্ন ধারণার সাথে একীকরণের ঝামেলা দিয়ে যেতে চাইনি two দুটি উত্তর লেখাই সহজ যা স্বাধীনভাবে পড়া যায় । আপনি অন্য কারও ক্ষতিহীন যুক্তি সম্পর্কে কেন এত যত্ন করছেন তা আমি বুঝতে পারি না।
noɥʇʎԀʎzɐɹƆ

0

একটি সার্ভারে সিপিইউ সংখ্যা আনতে অনুমান করুন। যদি সার্ভারটি স্যুইচ অফ করা হয়, বা স্ক্র্যাপ হয়ে যায় তবে সেই মানটি সহজভাবে বিদ্যমান না। এটি এমন একটি পরিমাপ হবে যা কোনও ধারণা দেয় না (সম্ভবত "অনুপস্থিত" / "খালি" সেরা পদ নয়)। তবে মানটি "জ্ঞাত" অযৌক্তিক হতে পারে। যদি সার্ভারটি বিদ্যমান থাকে তবে মানটি ক্র্যাশ করার প্রক্রিয়াটি এটির পরিমাপ করা বৈধ, তবে "অজানা" মানের ফলস্বরূপ ব্যর্থ হয়।

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

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


0

প্রদত্ত উত্তরগুলি সূক্ষ্ম, তবে এখনও মান, খালি এবং অজানা এর মধ্যে শ্রেণিবিন্যাসের সম্পর্ককে প্রতিফলিত করে না।

  • সর্বাধিক আসে অজানা
  • তারপরে প্রথমে খালি একটি মান ব্যবহার করার আগে অবশ্যই স্পষ্ট করে দিতে হবে।
  • সর্বশেষে গণনা করার মানটি আসে ।

কুরুচিপূর্ণ (এটি ব্যর্থ বিমূর্তির জন্য), তবে সম্পূর্ণ কার্যকর হবে (জাভাতে):

Optional<Optional<Integer>> unknowableValue;

unknowableValue.ifPresent(emptiableValue -> ...);
Optional<Integer> emptiableValue = unknowableValue.orElse(Optional.empty());

emptiableValue.ifPresent(value -> ...);
int value = emptiableValue.orElse(0);

এখানে একটি সুন্দর টাইপ সিস্টেম সহ কার্যকরী ভাষা আরও ভাল।

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

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

মানগুলি সম্ভবত জাভা বাউন্ড সম্পত্তির মতো পর্যবেক্ষণযোগ্য হবে, শ্রোতাদের পরিবর্তনের বিষয়ে অবহিত করবে।

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


0

হ্যাঁ, কয়েকটি ভাষায় একাধিক বিভিন্ন এনএ ধরণের ধারণা বিদ্যমান; পরিসংখ্যানগুলিতে আরও এটি অর্থবোধক যেখানে (অর্থাত্ মিসিং-এট-এলোমেলো, অনুপস্থিত-সম্পূর্ণরূপে-এলোমেলো, অনুপস্থিত-না-এলোমেলো ) এর মধ্যে বিশাল পার্থক্য ।

  • যদি আমরা কেবলমাত্র উইজেটের দৈর্ঘ্য পরিমাপ করি তবে 'সেন্সর ব্যর্থতা' বা 'পাওয়ার কাট' বা 'নেটওয়ার্ক ব্যর্থতা' (যদিও 'সংখ্যার ওভারফ্লো' তথ্য সরবরাহ করে) এর মধ্যে পার্থক্য করা গুরুত্বপূর্ণ নয়

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

  • আমাদের ক্ষেত্রে একটি একক প্রবেশের জন্য একাধিক এনএ ভেরিয়েবল রয়েছে ("একাধিক অভিব্যক্তি") case উদাহরণ: যদি আমি কোনও ব্যক্তির বয়স, জিপকোড, শিক্ষার স্তর বা আয়ের কোনও কিছুই না জানি তবে তাদের আয়ের অঙ্কটি আরো কঠিন।

আপনি কীভাবে সাধারণ-উদ্দেশ্যে ভাষাগুলিতে বিভিন্ন এনএ প্রকারের প্রতিনিধিত্ব করেন যা তাদের সমর্থন করে না, সাধারণত লোকেরা পূর্ণসংখ্যার জন্য ভাসমান-পয়েন্ট-এনএএন (রূপান্তরিত পূর্ণসংখ্যার প্রয়োজন), এনামস বা সেন্ডিনেলগুলি (যেমন 999 বা -1000) জাতীয় জিনিসগুলি হ্যাক করে বা শ্রেণিবদ্ধ মান। সাধারণত একটি খুব পরিষ্কার উত্তর নেই, দুঃখিত।


0

আর-এর বিল্ড-ইন অনুপস্থিত মান সমর্থন রয়েছে। https://medium.com/coinmonks/dealing-with-missing-data-using-r-3ae428da2d17

সম্পাদনা: কারণ আমি হতাশ ছিলাম আমি কিছুটা ব্যাখ্যা করতে যাচ্ছি।

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

তবে আপনি কোনও বিন্দু বা "নিখোঁজ" বা যেকোনো কিছুই আপনাকে হারিয়ে যাওয়া ডেটা চিহ্নিত করতে চান। আর-এ আপনি নিখোঁজ হয়ে কী বোঝাতে চেয়েছেন তা নির্ধারণ করতে পারেন । এগুলি রূপান্তর করার দরকার নেই।

অনুপস্থিত মান নির্ধারণের সাধারণ উপায় হ'ল তাদের হিসাবে চিহ্নিত করা NA

x <- c(1, 2, NA, 4, "")

তারপরে আপনি দেখতে পাচ্ছেন কোন মানগুলি অনুপস্থিত;

is.na(x)

এবং তারপরে ফলাফল হবে;

FALSE FALSE  TRUE FALSE FALSE

আপনি দেখতে পারেন ""নিখোঁজ। আপনি ""অজানা হিসাবে হুমকি দিতে পারেন । এবং NAঅনুপস্থিত।


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

-1

*অপারেটরের কার্যকারিতা পরিবর্তিত হতে পারে না এমন কোনও কারণ আছে কি ?

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

তারপরে আপনি আপনার পুরো প্রকল্প জুড়ে অনুরূপ empty()/ unknown()কার্যকারিতা রাখতে সক্ষম হবেন ।


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