আমি কীভাবে একটি ট্রাইপার্স পদ্ধতি ডিজাইন করব যা পার্সিং ত্রুটির ক্ষেত্রে বিশদ তথ্য সরবরাহ করে?


9

ব্যবহারকারীর ইনপুট পার্সিং করার সময়, সাধারণত ব্যতিক্রম ছুঁড়ে ফেলা এবং ধরে না রাখার পরিবর্তে বৈধতা পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হয়। । নেট বিসিএলে, এটির মধ্যে পার্থক্য হবে, উদাহরণস্বরূপ, int.Parse(অবৈধ ডেটাতে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে) এবং int.TryParse( falseঅবৈধ ডেটাতে রিটার্ন )।

আমি আমার নিজের ডিজাইন করছি

Foo.TryParse(string s, out Foo result)

পদ্ধতি এবং আমি ফেরতের মান সম্পর্কে নিশ্চিত নই। আমি ব্যবহার করতে পারে bool.NET নিজস্ব মত TryParseপদ্ধতি, কিন্তু যে সম্পর্কে কোন ইঙ্গিত দিতে হবে টাইপ ত্রুটির, সঠিক কারণ সম্পর্কে কেন s একটি মধ্যে অংশ পার্স করা যায়নি Foo। (উদাহরণস্বরূপ, sতুলনাহীন প্রথম বন্ধনী, বা অক্ষরগুলির ভুল সংখ্যা বা Barএকটি সঙ্গতিহীন Bazইত্যাদি হতে পারে)

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

আমি এই ইস্যুতে প্রচুর পরিশ্রমের কথা ভাবতে পারি (স্টেটাস কোডগুলি ফিরিয়ে আনুন, একটি ত্রুটির স্ট্রিং ফিরিয়ে দিন, আউট প্যারামিটার হিসাবে একটি ত্রুটি স্ট্রিং যুক্ত করুন) তবে তাদের সকলেরই তাদের নিজ নিজ ডাউনসাইড রয়েছে এবং আমিও কনভেনশনগুলির সাথে সামঞ্জস্য রাখতে চাই .NET ফ্রেমওয়ার্ক

সুতরাং, আমার প্রশ্নটি নিম্নরূপ:

.NET ফ্রেমওয়ার্কে কি এমন কোন পদ্ধতি রয়েছে যা (ক) ব্যতিক্রম না ছড়িয়ে ইনপুট পার্স করে এবং (খ) একটি সাধারণ সত্য / মিথ্যা বুলিয়ানের চেয়ে আরও বিশদ ত্রুটির তথ্য ফেরত দেয়?


1
এই লিঙ্কটি শেষ হয় না এটি ব্যতিক্রম ছুঁড়ে ফেলার পরামর্শ দেওয়া হয় না। সময় আছে যে সবচেয়ে ভাল উপায় ব্যবহার করা হয় Parse()
পাপারাজ্জো

উত্তর:


5

আমি আপনার রিটার্ন টাইপের জন্য monad প্যাটার্ন ব্যবহার করার পরামর্শ দিচ্ছি ।

ParseResult<Foo> foo = FooParser.Parse("input");

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

আপনি Fooআপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে জেনেরিকগুলি ব্যবহারের পরিবর্তে একটি পার্স রেজাল্ট ক্লাস নির্দিষ্ট করতে পারেন।

একটি নির্দিষ্ট নির্দিষ্ট পার্স ফলাফল শ্রেণি এর মতো দেখতে পারে:

class FooParseResult
{
     Foo Value { get; set; }
     bool PassedRequirement1 { get; set; }
     bool PassedRequirement2 { get; set; }
}

এখানে মোনাড সংস্করণটি রয়েছে:

class ParseResult<T>
{
     T Value { get; set; }
     string ParseErrorMessage { get; set; }
     bool WasSuccessful { get; set; }
}

.NET ফ্রেমওয়ার্কের এমন কোনও পদ্ধতি সম্পর্কে আমি অবগত নই যা বিশদ ত্রুটিযুক্ত বিশদ সম্পর্কিত তথ্য দেয়।


আমি আপনার ইউআই লেয়ার বাইন্ডিং সম্পর্কে আপনার মন্তব্য বুঝতে পেরেছি, তবে এই ক্ষেত্রে ফু এর একটি মানক, প্রচলিত স্ট্রিং প্রতিনিধিত্ব রয়েছে, সুতরাং এটি থাকার Foo.ToStringএবং এটি বোধগম্য হয় Foo.Parse
হেইঞ্জি

এবং, আমার সাহসী প্রশ্নটি উত্সাহিত করুন, আপনি আমাকে .NET বিসিএল থেকে এই নমুনাটি ব্যবহার করে একটি উদাহরণ দিতে পারেন?
হেইনজি

4
কেমন আছে মনাদ?
জ্যাকবিবি 22'18

@ হাইঞ্জি: যে কোনও পদ্ধতি যা প্রত্যাবর্তন করে Func<T>তা সেই মানদণ্ডগুলি পূরণ করে, যদি আপনি Tআপনার প্রয়োজনীয় তথ্য অন্তর্ভুক্ত করেন । বিশদ ত্রুটির তথ্য ফিরিয়ে দেওয়া আপনার পক্ষে অনেকাংশে নির্ভর করে। আপনি একটি ব্যবহার বিবেচনা করেছেন Maybe<T>? Mikhail.io/2016/01/monads-expined-in-charp
রবার্ট হার্ভে

@ জ্যাকসবিবি: আমিও একই জিনিসটি নিয়ে ভাবছিলাম। পদ্ধতিটির স্বাক্ষরটি মড্যানিক আচরণের সাথে সামঞ্জস্যপূর্ণ তবে এটি প্রায়।
রবার্ট হার্ভে

1

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

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


1

আমি এমন একটি TryParse/Convert/etc.পদ্ধতি ব্যবহার করতে চাইলে একই ধরণের সমস্যায় পড়েছি যেখানে আমার মাঝে মাঝে কীভাবে এবং কেন এটি ব্যর্থ হয়েছিল তা জানতে হবে।

কিছু সিরিয়ালাইজার কীভাবে ত্রুটিগুলি পরিচালনা করে এবং ইভেন্টগুলি ব্যবহার করে তা থেকে আমি অনুপ্রেরণা নিয়ে শেষ করেছি। এই পদ্ধতিতে আমার TryX(..., out T)পদ্ধতির বাক্য গঠনটি অন্য যে কোনও হিসাবে পরিষ্কার দেখাচ্ছে এবং নির্ভরযোগ্যভাবে falseপ্যাটার্নের দ্বারা বোঝা যায় এমন কোনও সহজ ফিরে আসে ।

যাইহোক, যখন আমি আরও বিশদগুলির প্রয়োজন চাই তখন আমি কেবল ইভেন্ট হ্যান্ডলার যুক্ত করি এবং প্যাকেজে আমার যা প্রয়োজন ফলাফল যতটা জটিল বা সহজ হিসাবে চাই তা পেতে পারি ( MyEventArgsনীচে)। এটিকে স্ট্রিংয়ের তালিকায় যুক্ত করুন, ExceptionDispatchInfoব্যতিক্রম যুক্ত করুন এবং ক্যাপচার করুন; কলকারীকে সিদ্ধান্ত নিতে দিন যে কীভাবে এবং যে কোনওরকম ভুল হয়ে যায় তা মোকাবেলা করতে চায়।

public class Program
{
    public static void Main()
    {
        var c = new MyConverter();

        //here's where I'm subscibing to errors that occur
        c.Error += (sender, args) => Console.WriteLine(args.Details);

        c.TryCast<int>("5", out int i);
    }
}

//here's our converter class
public class MyConverter
{
    //invoke this event whenever something goes wrong and fill out your EventArgs with details
    public event EventHandler<MyEventArgs> Error;

    //intentionally stupid implementation
    public bool TryCast<T>(object input, out T output)
    {
        bool success = true;
        output = default (T);

        //try-catch here because it's an easy way to demonstrate my example
        try
        {
            output = (T)input;
        }
        catch (Exception ex)
        {
            success = false;
            Error?.Invoke(this, new MyEventArgs{Details = ex.ToString()});
        }

        return success;
    }
}

//stores whatever information you want to make available
public class MyEventArgs : EventArgs
{
    public string Details {get; set;}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.