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


166

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

আমার স্নাতকের:

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;
}

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

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


16
@ বল্টবাইট: কারণ টিপল সেট থিয়োরি থেকে শুরু করেছেন en.wikedia.org/wiki/Tuple
ম্যাথু হোয়াইট

16
@ বোল্টবাইট: একটি "টিপল" মানগুলির একটি আদেশযুক্ত সেট, এবং অগত্যা কোনও ডাটাবেসে সারিগুলির সাথে কিছু করার প্রয়োজন হয় না।
হতাশিত

19
সি # তে থাকা টিপলগুলি আরও ভাল লাগবে যদি কোনও ভাল টিপল আনপ্যাকিং অ্যাকশন থাকে :)
জাস্টিন

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

13
@ জন স্যান্ডার্স: আমি নিশ্চিত যে তিনি সি # তে নিখুঁতভাবে লিখিত একটি অ্যাপ্লিকেশনটিতে টুপলস ব্যবহার বা ব্যবহার না করার বিষয়ে নকশা সংক্রান্ত সিদ্ধান্ত সম্পর্কে জিজ্ঞাসা করছেন। আমি বিশ্বাস করি না যে তিনি সি # ভাষা তৈরিতে যে নকশার সিদ্ধান্ত নিয়েছেন সে সম্পর্কে জিজ্ঞাসা করছেন।
ব্রেট উইদমিয়ার

উত্তর:


163

টিপলস দুর্দান্ত হয় যদি আপনি এগুলি তৈরি এবং ব্যবহার উভয়কে নিয়ন্ত্রণ করেন - আপনি প্রসঙ্গ বজায় রাখতে পারেন যা এগুলি বোঝার জন্য প্রয়োজনীয়।

একটি পাবলিক এপিআই তে তবে এগুলি কম কার্যকর। ভোক্তাকে (আপনি নয়) হয় অনুমান করতে হবে বা ডকুমেন্টেশন সন্ধান করতে হবে, বিশেষত এর মতো জিনিসের জন্য Tuple<int, int>

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

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


19
পাবলিক / প্রাইভেটের মধ্যে পার্থক্যটি সত্যই গুরুত্বপূর্ণ, এটি আনার জন্য ধন্যবাদ। আপনার সার্বজনীন এপিআইতে টিপলগুলি ফেরা সত্যিই খারাপ ধারণা, তবে অভ্যন্তরীণভাবে যেখানে জিনিসগুলি শক্তভাবে সংযুক্ত করা যেতে পারে (তবে এটি ঠিক আছে ) এটি ঠিক আছে
ক্লিনটন পিয়ার্স

36
শক্তভাবে মিলিত, বা শক্তভাবে tupled? ;)
কন্টাক্টমেট

উপযুক্ত ডকুমেন্টেশন এখানে কার্যকর হতে পারে না? উদাহরণস্বরূপ, স্কালার StringOps(জাভা'র জন্য মূলত "এক্সটেনশন পদ্ধতিগুলির একটি শ্রেণীর String) একটি পদ্ধতি রয়েছে parition(Char => Boolean): (String, String)(প্রিডিটিক গ্রহণ করে, 2 টি স্ট্রিংয়ের টুপল দেয়)। এটি আউটপুট কী তা স্পষ্ট (স্পষ্টতই একটি চরিত্রগুলি হয়ে যাচ্ছে যার জন্য ভবিষ্যদ্বাণীটি সত্য ছিল এবং অন্যটি যার জন্য এটি মিথ্যা ছিল, তবে এটি কোনটি পরিষ্কার নয়)) এটি ডকুমেন্টেশন যা এটি পরিষ্কার করে দেয় (এবং প্যাটার্ন ম্যাচিং এটি ব্যবহারে এটি পরিষ্কার করার জন্য ব্যবহার করা যেতে পারে যা কোনটি)।
কাট

@ মাইক: এটি সঠিক এবং ভুল হওয়া সহজ করে তোলে, এটি এমন একটি API এর বৈশিষ্ট্য যা কোথাও কারও জন্য ব্যথার কারণ হয়ে উঠবে :-)
ব্রায়ান ওয়াটস

79

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

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

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

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

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

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

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

আমি টিপলসের বিন্দুটি মিস করছি এমন সম্ভাবনাটি বাদ দিয়ে, টিপলের সাথে উদাহরণটি কী কোনও খারাপ ডিজাইনের পছন্দ?

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

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

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

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

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

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 অভিধানে বেনাম ধরণের থেকে উদ্ভূত সমস্যাগুলির আশেপাশের আরও একটি (সহজ) উপায় রয়েছে এবং তা হ'ল varমূলশব্দটি আপনার জন্য সংকলকটি 'অনুমান' করতে দেয়। এই সংস্করণটি এখানে:

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

5
@ স্টাকেক্স: হ্যাঁ, আমি সম্মত। তবে মনে রাখবেন - উদাহরণটি মূলত কেসগুলিকে চিত্রিত করার উদ্দেশ্যে তৈরি করা হয় যখন কোনও ব্যবহারটি বোঝাতে Tuple<> পারে । সবসময় বিকল্প রয়েছে ...
এল বুশকিন

1
আমি মনে করি যে ট্রাইগেটওয়ালু বা ট্রাইপার্সে যেমন একটি টুপল দিয়ে পরামিতিগুলি প্রতিস্থাপন করা হ'ল এমন কয়েকটি ক্ষেত্রে একটি যেখানে পাবলিক এপিআই কোনও টুপল ফেরত পাওয়া বোঝাতে পারে। আসলে, কমপক্ষে একটি। নেট ভাষা স্বয়ংক্রিয়ভাবে আপনার জন্য এই API পরিবর্তন করে API
জোয়েল মুলার

1
@ স্টাকেক্স: টিপলগুলিও অপরিবর্তনীয়, তবে অ্যারে নেই।
রবার্ট পলসন

2
আমি বুঝতে পেরেছিলাম যে টুপলস কেবল অপরিবর্তনীয় পোকার প্লেয়ার অবজেক্ট হিসাবে কার্যকর।
জেনাদি ভ্যানিন Геннадий 10

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

18

টিপলগুলি দরকারী হতে পারে ... তবে সেগুলি পরে ব্যথাও হতে পারে। যদি আপনার এমন একটি পদ্ধতি থাকে যা ফিরে আসে তবে Tuple<int,string,string,int>কীভাবে আপনি কীভাবে জানবেন যে এই মানগুলি পরে। তারা ID, FirstName, LastName, Ageছিল বা তারা ছিল UnitNumber, Street, City, ZipCode


9

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

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

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

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();
    }
}

একটি সাধারণ বৈশিষ্ট্য হিসাবে, আমি যা দেখতে চাই তা হবে। নেট জন্য কয়েকটি বিশেষ ধরণের বেনামের ধরণের জন্য একটি স্ট্যান্ডার্ড সংজ্ঞায়িত করা যেমন উদাহরণস্বরূপ struct var SimpleStruct {int x, int y;}সাধারণ স্ট্রাক্টের সাথে সম্পর্কিত গাইডের সাথে শুরু হওয়া নামের সাথে একটি কাঠামো সংজ্ঞায়িত করা হবে এবং {System.Int16 x}{System.Int16 y}সংযুক্ত মত কিছু আছে ; এই জিইউডি থেকে শুরু হওয়া যে কোনও নামের জন্য কেবল সেই উপাদানগুলি এবং নির্দিষ্ট নির্দিষ্ট সামগ্রীর সমন্বিত কোনও কাঠামো উপস্থাপন করতে হবে; যদি একই নামের একাধিক সংজ্ঞা স্কোপে থাকে এবং সেগুলি মেলে, সমস্তই একই ধরণের হিসাবে বিবেচিত হবে।
সুপারক্যাট

এই জাতীয় জিনিস কয়েকটি ধরণের প্রকারের জন্য সহায়ক হবে, যেমন পরিবর্তনীয় এবং অপরিবর্তনীয় শ্রেণি- এবং কাঠামোগুলি পাশাপাশি ইন্টারফেস এবং প্রতিনিধিদের এমন পরিস্থিতিতে ব্যবহারের জন্য যেখানে মেলানো কাঠামোটি শব্দার্থক শব্দটিকে বোঝায় বলে মনে করা উচিত। যদিও দুটি কারণের ক্ষেত্রে একই পরামিতিগুলি বিনিময়যোগ্য হিসাবে বিবেচিত হবে না এমন কারণেই এটি কার্যকর হতে পারে এমন কারণগুলি রয়েছে, তবে এটির ক্ষেত্রেও যদি সহায়কটি নির্দিষ্ট করা যায় যে কোনও পদ্ধতি কোনও প্রতিনিধি চায় যা কিছু পরামিতিগুলির সংমিশ্রণ গ্রহণ করে তবে এর বাইরেও এটি কার্যকর নয় beyond কী ধরণের প্রতিনিধি তা যত্নশীল হবেন না।
সুপারক্যাট

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

আপনি যেখানে বেনাম ক্লাস না করে ব্যবহার করতেন তার আরও কোনও দৃ concrete় উদাহরণ রয়েছে Tuple? আমি আমার কোডবেসে যেখানে আমি টিপলস ব্যবহার করছি সেখানে 50 টি জায়গায় স্কিম করেছিলাম এবং সবগুলি হয় হয় রিটার্ন মান (সাধারণত yield return) হয় বা অন্য কোথাও ব্যবহৃত হয় এমন সংগ্রহগুলির উপাদান যা কোনও বেনাম শ্রেণীর জন্য যায় না।

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

8

কীওয়ার্ডের অনুরূপ var, এটি সুবিধার্থ হিসাবে তৈরি করা হয়েছে - তবে এটি সহজেই আপত্তিজনক নয়।

আমার অত্যন্ত বিনীত মতে, 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>> ();
}

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

4
Var কীওয়ার্ডটি অপব্যবহার করা সম্ভব নয়। সম্ভবত আপনি গতিশীল বলতে চাইছেন?
ক্রিস মেরিসিক

@ ক্রিস মেরিসিক, কেবল স্পষ্ট করার জন্য আমি একই দৃশ্যের অর্থ বোঝাতে চাইনি - আপনি একেবারে সঠিক, varতার ঘোষিত ক্ষেত্রের বাইরে আর পাস করা বা অস্তিত্ব পাওয়া যাবে না। যাইহোক, এখনও এটি তার লক্ষ্যযুক্ত উদ্দেশ্যের চেয়ে বেশি ব্যবহার করা এবং "
আপত্তিজনক

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

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

5

ক্লাসের মতো ক্লাস ব্যবহার ResultTypeকরা আরও পরিষ্কার। আপনি ক্লাসে ক্ষেত্রগুলিকে অর্থপূর্ণ নাম দিতে পারেন (যেখানে একটি টিপলের সাহায্যে তাদের ডাকা হবে Item1এবং Item2)। এটি আরও বেশি গুরুত্বপূর্ণ যদি দুটি ক্ষেত্রের প্রকারগুলি একই হয়: নামটি তাদের মধ্যে পরিষ্কারভাবে পার্থক্য করে।


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

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

5

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

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();
            }
        }
    }
}

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


3
আপনি নির্মাণকারীর পরিবর্তে Tuple.Create ব্যবহার করতে পারেন। এটা খাটো।
কুগেল

একটি বেনামি প্রকার অনেক বেশি পাঠযোগ্য; যেমন 'এক্স' এর পরিবর্তে প্রকৃত পরিবর্তনশীল নামগুলি ব্যবহার করা উচিত
ডেভ কজিনিউ

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

4

আইএমও এই "টিপলস" মূলত নামবিহীন সদস্যদের সাথে সমস্ত পাবলিক অ্যাক্সেস বেনামে structপ্রকার ।

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

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

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

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

টিপল সংস্করণ

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

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

টিপল structপ্রকৃত নামপ্রাপ্ত সদস্যদের সাথে কোনও এড়ানোর জন্য একটি অলস উপায় হিসাবে আমাকে আঘাত করে । টিউলের অতিরিক্ত ব্যবহার, যেখানে আপনি সত্যিই নিজেকে / বা আপনার কোডের মুখোমুখি অন্য কারও নাম দেওয়া নামটির প্রয়োজন হ'ল এটি খারাপ জিনিস I যদি আমি কখনও দেখি।


3

আমাকে বিচার করবেন না, আমি কোনও বিশেষজ্ঞ নই, তবে সি # 7.x এ নতুন টিপলস সহ এখন আপনি এই জাতীয় কিছু ফিরে আসতে পারেন:

return (string Name1, int Name2)

কমপক্ষে এখন আপনি এটির নাম রাখতে পারেন এবং বিকাশকারীরা কিছু তথ্য দেখতে পাবেন।


2

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

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

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


1

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

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


টিপলস কীভাবে একটি "ভাষা বৈশিষ্ট্য" রয়েছে? এটি সমস্ত শ্রেণীর জন্য উপলব্ধ একটি শ্রেণি। নেট ভাষা না?
জেসন ওয়েব

11
তুলনামূলকভাবে সি # এর তুলনায় অকেজো, সম্ভবত। কিন্তু System.Tuple সি # এর কারণে কাঠামোয় যুক্ত করা হয়নি। এটি এফ # এবং অন্যান্য ভাষাগুলির মধ্যে আন্তঃযোগিতা সহজ করার জন্য যুক্ত করা হয়েছিল।
জোয়েল মুলার

@ জেসন: আমি বলিনি এটি একটি ভাষার বৈশিষ্ট্য ছিল (আমি এটি ভুল টাইপ করেছি, তবে আপনি এই মন্তব্য করার আগে আমি এটিকে সংশোধন করেছি)।
ফিলিপ লেবার্ট

2
@ জেসন - টিউপলসের জন্য সরাসরি সমর্থনযুক্ত ভাষাগুলিতে তাদের উপাদানগুলির মানগুলিতে টিউপলগুলি ডিকনস্ট্রাকচারের অন্তর্নিহিত সমর্থন রয়েছে। এই ভাষাগুলিতে লিখিত কোড সাধারণত কখনও কখনও, আইটেম 1, আইটেম 2 বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে না। let success, value = MethodThatReturnsATuple()
জোয়েল মুলার

@ জোয়েল: এই প্রশ্নটিকে সি # হিসাবে ট্যাগ করা হয়েছে, সুতরাং এটি কোনওভাবে সি # এর মতো। আমি এখনও মনে করি তারা এটিকে ভাষার প্রথম শ্রেণির বৈশিষ্ট্যে পরিণত করতে পারত।
ফিলিপ লেবার্ট

1

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


0

আমি বিভিন্ন এবং বিভিন্ন ক্ষেত্রে দু'টি টিউপস ব্যবহার করেছি Tupleএবং ValueTupleনিম্নলিখিত উপসংহারে পৌঁছেছি: ব্যবহার করবেন না

প্রতিবার, আমি নিম্নলিখিত সমস্যাগুলির মুখোমুখি হয়েছি:

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

আমার মতে টিপলস হ'ল সি # এর কোনও বৈশিষ্ট্য নয়, ক্ষতিকারক।

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


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

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