c# আমার সি#কোডে.NET 4.0 টিপলগুলি ব্যবহার করা কি দরিদ্র ডিজাইন সিদ্ধান্ত?



net framework 4.0 download (11)

.নেট 4 এ Tuple ক্লাস যোগ করার সাথে সাথে, আমি আমার ডিজাইনে তাদের ব্যবহার করা কি একটি খারাপ পছন্দ না তা নির্ধারণ করার চেষ্টা করছি। যেভাবে আমি এটি দেখি, একটি Tuple একটি ফলাফল শ্রেণী লেখার জন্য একটি শর্টকাট হতে পারে (আমি নিশ্চিত যে অন্যান্য Tuple আছে)।

সুতরাং এই:

public class ResultType
{
    public string StringValue { get; set; }
    public int IntValue { get; set; }
}

public ResultType GetAClassedValue()
{
    //..Do Some Stuff
    ResultType result = new ResultType { StringValue = "A String", IntValue = 2 };
    return result;
}

এর সমতুল্য:

public Tuple<string, int> GetATupledValue()
{
    //...Do Some stuff
    Tuple<string, int> result = new Tuple<string, int>("A String", 2);
    return result;
}

তাই আমি টুপলে বিন্দু অনুপস্থিত যে সম্ভাবনা সেট সরাইয়া, একটি Tuple একটি খারাপ নকশা পছন্দ সঙ্গে উদাহরণ? আমার কাছে এটি কম খোঁচা মত মনে হয়, কিন্তু স্ব স্বাক্ষর এবং পরিষ্কার হিসাবে নয়। এর মানে হলো ResultType টাইপের ResultType , ক্লাসের প্রতিটি অংশটির মানে কি পরে তা খুব স্পষ্ট এবং আপনার বজায় রাখার জন্য অতিরিক্ত কোড আছে। Tuple<string, int> আপনাকে প্রতিটি Item কী দেখায় তা সন্ধান করতে হবে এবং আপনি কম কোড লিখতে এবং বজায় রাখতে পারবেন।

এই পছন্দের সাথে আপনার যে কোনও অভিজ্ঞতার ব্যাপকভাবে প্রশংসা করা হবে।


Answer #1

Tuples একটি সি # প্রোগ্রামার দৃষ্টিকোণ থেকে সিএলআর চমত্কার অতিরিক্ত যোগসূত্র। যদি আপনার দৈর্ঘ্য পরিবর্তিত আইটেমগুলির একটি সংগ্রহ থাকে তবে আপনার কম্পাইল সময়গুলিতে অনন্য স্ট্যাটিক নামগুলি রাখতে হবে না।

কিন্তু যদি আপনার স্থির দৈর্ঘ্যের একটি সংগ্রহ থাকে তবে এর অর্থ হল সংগ্রহের অবস্থানগুলির নির্দিষ্ট প্রতিটি নির্দিষ্ট পূর্ব-নির্ধারিত অর্থ রয়েছে। এবং Item1 , Item2 , ইত্যাদি তাত্পর্য মনে রাখার পরিবর্তে, সেই ক্ষেত্রে তাদের যথাযথ স্ট্যাটিক নামগুলি দিতে ভাল।

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

private var GetDesserts()
{
    return _icecreams.Select(
        i => new { icecream = i, topping = new Topping(i) }
    );
}

public void Eat()
{
    foreach (var dessert in GetDesserts())
    {
        dessert.icecream.AddTopping(dessert.topping);
        dessert.Eat();
    }
}

Answer #2

মানচিত্রের প্রতিনিধিত্ব করার কোন ইঙ্গিত নেই বলে আমি ব্যক্তিগতভাবে কোনও টুপলে ফেরত টাইপ হিসাবে ব্যবহার করব না। Tuples কিছু মূল্যবান ব্যবহার কারণ বস্তুর বিপরীত তারা মান ধরনের এবং এইভাবে সমতা বুঝতে। আমি যদি মাল্টিপার্ট কী বা একটি গ্রুপবি ক্লায়েন্টের জন্য একটি চাবি হিসাবে যদি আমি একাধিক ভেরিয়েবলের দ্বারা গোষ্ঠী করতে চান এবং নেস্টেড গোষ্ঠীগুলি (যারা কখনও নেস্টেড গোষ্ঠী চান?) চান না তবে আমি তাদের অভিধান কী ব্যবহার করব। চরম verbosity সঙ্গে সমস্যা অতিক্রম করতে আপনি একটি সহায়ক পদ্ধতির সঙ্গে তাদের তৈরি করতে পারেন। যদি আপনি ঘন ঘন সদস্য (আইটেম 1, আইটেম 2, ইত্যাদির মাধ্যমে) অ্যাক্সেস করেন তবে মনে রাখবেন আপনি সম্ভবত একটি ভিন্ন গঠন যেমন স্ট্রাক বা বেনামী ক্লাস ব্যবহার করতে পারেন।


Answer #3

আমি যেভাবে এটি দেখতে পাচ্ছি, একটি টুপল একটি ফলাফল শ্রেণী লেখার একটি শর্টকাট (আমি নিশ্চিত যে অন্যান্য ব্যবহারও আছে)।

Tuple<> - এর মধ্যে অন্যতম মূল্যবান ব্যবহারগুলি রয়েছে - তাদের মধ্যে বেশিরভাগই এমন একটি নির্দিষ্ট গোষ্ঠীর Tuple<> বিমূর্ত করে ফেলে যা একই কাঠামো ভাগ করে এবং কেবলমাত্র মানগুলির আদেশ অনুসারে সেটিকে ব্যবহার করে। সব ক্ষেত্রে, tuples এর একটি সুবিধা হল যে তারা আপনার নামস্থানকে কেবলমাত্র ডেটা-ক্লাসের ক্লাসগুলি ছিন্ন করে যা বৈশিষ্ট্যগুলি প্রকাশ করে তবে পদ্ধতি নয়।

এখানে Tuple<> জন্য যুক্তিসঙ্গত ব্যবহারের একটি উদাহরণ:

var opponents = new Tuple<Player,Player>( playerBob, playerSam );

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

var pokerHand = Tuple.Create( card1, card2, card3, card4, card5 );

একটি পোকার হাতকে কেবলমাত্র কার্ডগুলির একটি সেট বলে মনে করা যেতে পারে - এবং ধারণাটি প্রকাশ করার যুক্তিসংগত উপায় টুপল (হতে পারে) হতে পারে।

আমি টুপলে বিন্দু অনুপস্থিত যে সম্ভাবনার একপাশে সেট, একটি Tuple একটি খারাপ নকশা পছন্দ সঙ্গে উদাহরণ?

জনসাধারণের জন্য একটি পাবলিক API এর অংশ হিসাবে দৃঢ়ভাবে টাইপ করা Tuple<> দৃষ্টান্তগুলি খুব কমই একটি ভাল ধারণা। আপনি নিজের স্বীকৃতি হিসাবে, Tuples জড়িত পক্ষের প্রয়োজন (লাইব্রেরি লেখক, লাইব্রেরি ব্যবহারকারী) সময় ব্যবহৃত Tuple ধরনের উদ্দেশ্য এবং ব্যাখ্যা উপর সময় সম্মত হতে। Tuple<> প্রকাশ্যে শুধুমাত্র API এর অভিপ্রায় এবং আচরণকে লুকিয়ে রাখে এমন API তৈরি করতে যথেষ্ট চ্যালেঞ্জিং।

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

আমার থাম্বের নিয়ম হল: যদি আপনি এটি আপনার সার্বজনিক ইন্টারফেস থেকে ফিরিয়ে আনেন - এটি একটি নামযুক্ত টাইপ করুন

Tuples ব্যবহার করার জন্য আমার অন্য নিয়ম প্রবন্ধটি হল: নাম পদ্ধতি আর্গুমেন্ট এবং টাইপ Tuple<> লোকালিক ভেরিয়েবল টাইপ Tuple<> যতটা সম্ভব স্পষ্ট - নামটি Tuple<> উপাদানগুলির মধ্যে সম্পর্কের অর্থ উপস্থাপন করে। আমার var opponents = ... চিন্তা করুন var opponents = ... উদাহরণস্বরূপ।

এখানে একটি বাস্তব-বিশ্ব ক্ষেত্রে একটি উদাহরণ যেখানে আমি কেবলমাত্র আমার নিজের সমাবেশে ব্যবহারের জন্য শুধুমাত্র ডেটা-টাইপ টাইপ ঘোষণা করতে Tuple<> ব্যবহার করেছি। পরিস্থিতিটি TryGetValue() ধরনের ধারণকারী জেনেরিক অভিধান ব্যবহার করার সময়, TryGetValue() আইটেমগুলি খুঁজে বের করার জন্য TryGetValue() পদ্ধতিটি ব্যবহার করা কঠিন হয়ে পড়ে কারণ পদ্ধতিটি এমন একটি TryGetValue() প্যারামিটার প্রয়োজন যা নামকরণ করা যাবে না:

public static class DictionaryExt 
{
    // helper method that allows compiler to provide type inference
    // when attempting to locate optionally existent items in a dictionary
    public static Tuple<TValue,bool> Find<TKey,TValue>( 
        this IDictionary<TKey,TValue> dict, TKey keyToFind ) 
    {
        TValue foundValue = default(TValue);
        bool wasFound = dict.TryGetValue( keyToFind, out foundValue );
        return Tuple.Create( foundValue, wasFound );
    }
}

public class Program
{
    public static void Main()
    {
        var people = new[] { new { LastName = "Smith", FirstName = "Joe" },
                             new { LastName = "Sanders", FirstName = "Bob" } };

        var peopleDict = people.ToDictionary( d => d.LastName );

        // ??? foundItem <= what type would you put here?
        // peopleDict.TryGetValue( "Smith", out ??? );

        // so instead, we use our Find() extension:
        var result = peopleDict.Find( "Smith" );
        if( result.First )
        {
            Console.WriteLine( result.Second );
        }
    }
}

PS অভিধানগুলির মধ্যে বেনামী ধরনের থেকে উদ্ভূত সমস্যাগুলির কাছাকাছি আরেকটি (সরল) উপায় রয়েছে এবং এটি আপনার জন্য কম্পাইলারের 'infer' টাইপ করার জন্য var কীওয়ার্ড ব্যবহার করা হয়। এখানে যে সংস্করণ:

var foundItem = peopleDict.FirstOrDefault().Value;
if( peopleDict.TryGetValue( "Smith", out foundItem ) )
{
   // use foundItem...
}

Answer #4

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

অন্য দিকে, এটি অত্যধিক সম্ভব এবং এটি tuples কাছাকাছি পাস যেখানে আপনি শুধুমাত্র তাদের ধারণ কি অনুমান করতে পারেন। আপনি ক্লাস জুড়ে একটি tuple ব্যবহার করতে যাচ্ছেন, সম্ভবত একটি কংক্রিট বর্গ তৈরি করা ভাল হবে।

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


Answer #5

আপনি উভয় তৈরি এবং ব্যবহার উভয় নিয়ন্ত্রণ যদি Tuples মহান - আপনি তাদের বোঝার জন্য অপরিহার্য, প্রসঙ্গ বজায় রাখতে পারেন।

একটি পাবলিক API এ, তবে, তারা কম কার্যকর। ভোক্তা (আপনি না) নথি বা তাকান আছে, বিশেষত Tuple<int, int> মত Tuple<int, int> জন্য।

আমি তাদের ব্যক্তিগত / অভ্যন্তরীণ সদস্যদের জন্য ব্যবহার করব, কিন্তু পাবলিক / সুরক্ষিত সদস্যদের জন্য ফলাফল ক্লাস ব্যবহার করব।

এই উত্তর কিছু তথ্য আছে।


Answer #6

ওয়ার্ডের মত একই, এটি একটি সুবিধার্থে হিসাবে অভিহিত করা হয় - কিন্তু সহজে অপব্যবহার করা হয়।

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

// one possible use of tuple within a private context. would never
// return an opaque non-descript instance as a result, but useful
// when scope is known [ie private] and implementation intimacy is
// expected
public class WorkflowHost
{
    // a map of uri's to a workflow service definition 
    // and workflow service instance. By convention, first
    // element of tuple is definition, second element is
    // instance
    private Dictionary<Uri, Tuple<WorkflowService, WorkflowServiceHost>> _map = 
        new Dictionary<Uri, Tuple<WorkflowService, WorkflowServiceHost>> ();
}

Answer #7

কিভাবে একটি সাজসজ্জা-সাজানোর-undecorate প্যাটার্ন মধ্যে Tuples ব্যবহার সম্পর্কে? (পার্ল মানুষের জন্য Schwartzian রূপান্তর)। এখানে নিশ্চিত হওয়া উচিত একটি নিশ্চিত উদাহরণ, তবে Tuples এই ধরনের জিনিস পরিচালনা করার জন্য একটি ভাল উপায় বলে মনে হচ্ছে:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] files = Directory.GetFiles("C:\\Windows")
                    .Select(x => new Tuple<string, string>(x, FirstLine(x)))
                    .OrderBy(x => x.Item2)
                    .Select(x => x.Item1).ToArray();
        }
        static string FirstLine(string path)
        {
            using (TextReader tr = new StreamReader(
                        File.Open(path, FileMode.Open)))
            {
                return tr.ReadLine();
            }
        }
    }
}

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


Answer #8

IMO এই "tuples" মূলত সমস্ত পাবলিক অ্যাক্সেস বেনামী struct ধরনের নামহীন সদস্যদের সঙ্গে

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

আপনি যদি কলারের কাছে ডেটা ফেরত পাঠাচ্ছেন, অথবা একজন কলকারীর কাছ থেকে ডেটা গ্রহণ করছেন, তবে আপনাকে অবশ্যই নামযুক্ত সদস্যদের সাথে একটি struct ব্যবহার করা উচিত।

একটি সহজ উদাহরণ নিন:

struct Color{ float r,g,b,a ; }
public void setColor( Color color )
{
}

Tuple সংস্করণ

public void setColor( Tuple<float,float,float,float> color )
{
  // why?
}

আমি নামযুক্ত সদস্যদের সঙ্গে একটি struct এর জায়গায় tuple ব্যবহার করার জন্য কোন সুবিধা দেখতে পাচ্ছি না। নামহীন সদস্যদের ব্যবহার করা আপনার কোডের পঠনযোগ্যতা এবং বোধগম্যতার জন্য একটি পদক্ষেপের পশ্চাদপদ।

প্রকৃত নামযুক্ত সদস্যদের সাথে একটি স্ট্রাক তৈরি এড়ানোর জন্য Tuple আমাকে একটি অলস পথ হিসাবে আঘাত করে। টুপলে ওভারউইজ, যেখানে আপনি সত্যিই মনে করেন / অথবা অন্য কেউ আপনার কোডটি সম্মুখীন হয়েছেন তবে নাম্বার সদস্যদের একটি খারাপ থিং ™ প্রয়োজন হবে যদি আমি কখনও দেখেছি।


Answer #9

আমি Tuple এবং New ValueTuple উভয় বিভিন্ন পরিস্থিতিতে ব্যবহার করেছি, এবং নিম্নলিখিত উপসংহারে পৌঁছেছি: ব্যবহার করবেন না

প্রত্যেক সময়, আমি নিম্নলিখিত সমস্যা সম্মুখীন:

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

আমার মতামত হল Tuples একটি ক্ষতি, একটি বৈশিষ্ট্য নয়, C #।

আমি কিছুটা অনুরূপ, কিন্তু অনেক কম কঠোর, Func<> এবং Action<> সমালোচনা। এগুলি অনেক ক্ষেত্রে কার্যকর, বিশেষ করে সহজ Action এবং Func<type> বৈকল্পিক, তবে এর বাইরে যেকোনো কিছু, আমি দেখেছি যে একটি প্রতিনিধি ধরনের তৈরি করা আরো মার্জিত, পঠনযোগ্য, রক্ষণশীল এবং আপনাকে আরও বৈশিষ্ট্য দেয়, যেমন ref / out প্যারামিটার।


Answer #10

Tuples একটি নিরর্থক ফ্রেমওয়ার্ক বৈশিষ্ট্য। নেট 4। আমি মনে করি একটি মহান সুযোগ সি # 4.0 সঙ্গে মিস ছিল। আমি নামযুক্ত সদস্যদের সঙ্গে tuples আছে পছন্দ করতেন, তাই আপনি Value1 , Value2 , ইত্যাদি পরিবর্তে নামের একটি টুপলে বিভিন্ন ক্ষেত্র অ্যাক্সেস করতে পারেন ...

এটি একটি ভাষা (সিনট্যাক্স) পরিবর্তন প্রয়োজন ছিল, কিন্তু এটি খুব দরকারী হতে পারে।


Answer #11

আমাকে বিচার করবেন না, আমি একজন বিশেষজ্ঞ নই, কিন্তু এখন C # 7.x তে নতুন Tuples দিয়ে, আপনি কিছু ফেরত দিতে পারেন:

return (string Name1, int Name2)

অন্তত এখন আপনি এটি নামকরণ করতে পারেন এবং ডেভেলপাররা কিছু তথ্য দেখতে পারে।





application-design