IAsyncEnumerable ফিরে আসার পদ্ধতিগুলির জন্য একটি নির্দিষ্ট নামকরণের সম্মেলন আছে?


10

সি # 5 অ্যাসিক্রোনাস প্রোগ্রামিংয়ের জন্য asyncএবং awaitমডেলটি প্রবর্তন করার পরে , সি # সম্প্রদায় একটি প্রত্যাশিত ধরণের প্রত্যাবর্তনের পদ্ধতিগুলিতে একটি "অ্যাসিঙ্ক" প্রত্যয় যুক্ত করার জন্য একটি নামকরণ সম্মেলনে উপস্থিত হয়েছিল:

interface Foo
{
   Task BarAsync();
}

অবিচ্ছিন্ন প্রোগ্রামিংয়ের আশেপাশে কোড গন্ধ সনাক্ত করার সময় অনেক স্থিতিশীল কোড বিশ্লেষক (উভয় রোজলিন ভিত্তিক এবং অ-রোজলিন ভিত্তিক) এই নামকরণ কনভেনশনের উপর নির্ভর করতে রচনা করা হয়েছিল।

এখন যেহেতু সি # 8 অ্যাসিনক্রোনাস গণনার ধারণাটি চালু করেছে, যা তারা নিজেরাই অপেক্ষায় নেই তবে এর সাথে মিলিতভাবে ব্যবহার করা যেতে পারে await foreach, নামকরণের পদ্ধতিগুলি প্রত্যাবর্তনের জন্য দুটি বিকল্প রয়েছে বলে মনে হয় IAsyncEnumerable:

interface Foo
{
    // No "Async" suffix, indicating that the return value is not awaitable.
    IAsyncEnumerable<T> Bar<T>();
}

অথবা

interface Foo
{
    // With "Async" suffix, indicating that the overall logic is asynchronous.
    IAsyncEnumerable<T> BarAsync<T>();
}

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


2
বিকল্প 2 টি এখানে সঠিক বলে মনে হচ্ছে, যেহেতু আপনার কোডটি অবিচ্ছিন্নভাবে চালান ( অভ্যন্তরীণ হিসাবে asyncব্যবহারের পদ্ধতি চিহ্নিত করুন await), এবং এমএসডিএন নমুনাটি একই দেখায়
পাভেল আনিকৌসকি

1
প্রশ্নটির সমাপ্তির প্রতিক্রিয়া হিসাবে, আমি একটি নির্দিষ্ট নামকরণের কনভেনশন উপস্থিত কিনা তা জিজ্ঞাসা করার জন্য প্রশ্নটি সম্পাদনা করেছি এবং সি # 5 এ একটি নির্দিষ্ট নামকরণ কনভেনশন স্থির কোড বিশ্লেষণের ফলে কীভাবে ফলস্বরূপ হয়েছে তার উদাহরণ দিতে। সুতরাং সি # 8 থাকার পরে সেই প্যাটার্নটি মাপসই ভিত্তিক কোডিং পছন্দগুলি ছাড়িয়ে পরিমাপযোগ্য কোডের মানের উন্নতি ঘটাবে।
hwaien

.NET কোর নিজে Asyncফিরে আসা পদ্ধতির জন্য প্রত্যয় ব্যবহার করে IAsyncEnumerable, যেমন চ্যানেলরিডার R রিডএলএলসিঙ্ক । অন্যান্য ক্ষেত্রে যেমন, ইএফ কোর- AsAsyncEnumerable()এ ব্যবহৃত হয়েছে যা ইতিমধ্যে পরিষ্কার
পানাজিওটিস কানাভোস

কোডটি মানুষের পক্ষে বোঝা সহজ করার জন্য নামকরণের নির্দেশিকা বিদ্যমান রয়েছে। কোডটির উদ্দেশ্য পরিষ্কার না হলে প্রত্যয় যুক্ত করুন।
পানাজিওটিস কানভোস

উত্তর:


1

নেট দলগুলি ইতিমধ্যে যা করে তার চেয়ে ভাল কোনও গাইডলাইন নেই :

  • চ্যানেল রিডার। রিডআলএ্যাসেন্স একটি প্রদান করেIAsyncEnumerable<T>
  • ইএফ কোর 3-এ, AsAsyncEnumerable () কে IAsyncEnumerableকল করে ফলাফলগুলি ফিরে আসবে
  • System.Linq.Async সালে ToAsyncEnumerable () IEnumerables, কার্য এবং মধ্যে Observables পরিবর্তন করে IAsyncEnumerableগুলি
  • অন্য সমস্ত অপারেটর System.Linq.Asyncতাদের নাম ধরে রাখে। নেই SelectAsyncবা আছে SelectAsAsyncEnumerable, ঠিক আছে Select

সমস্ত ক্ষেত্রে, এটি পদ্ধতির ফলাফল কী তা পরিষ্কার। সমস্ত ক্ষেত্রে, পদ্ধতির ফলাফলগুলি await foreachব্যবহার করার আগে তাদের সাথে অপেক্ষা করা প্রয়োজন ।

সুতরাং আসল নির্দেশিকা একই রয়ে গেছে - নামটি আচরণটি পরিষ্কার করে দেয় তা নিশ্চিত করুন :

  • নামটি ইতিমধ্যে পরিষ্কার হয়ে গেলে, যেমন AsAsyncEnumerable()বা সহ ToAsyncEnumerable(), কোনও প্রত্যয় যুক্ত করার দরকার নেই।
  • অন্যান্য ক্ষেত্রে, Asyncপ্রত্যয়টি যুক্ত করুন যাতে বিকাশকারীরা জানেন যে তাদের await foreachফলাফলের প্রয়োজন ।

কোড বিশ্লেষক এবং জেনারেটরগুলি পদ্ধতিগুলির নাম সম্পর্কে সত্যই পাত্তা দেয় না, কোডটি নিজেই পরিদর্শন করে তারা গন্ধ সনাক্ত করে। A কোড বিশ্লেষক আপনাকে বলতে হবে যে আপনি একটি কাজ বা অপেক্ষা করতে ভুলে গেছি await foreachএকটি IAsyncEnumerableসেটা ব্যাপার নয় আপনি পদ্ধতি এবং ভেরিয়েবল কল। একটি জেনারেটর সহজেই পরীক্ষা করতে IAsyncEnumerableএবং নির্গত করতে প্রতিবিম্ব ব্যবহার করতে পারেawait foreach

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

এবং অবশ্যই, প্রত্যেকেই জানে বেসরকারী উদাহরণ ক্ষেত্রগুলির জন্য সাধারণ উপসর্গটি হল _:)


ChannelReader.ReadAllAsyncউদাহরণ দেখানোর জন্য আপনাকে ধন্যবাদ । যেহেতু এটি সরাসরি। নেট দল থেকে আসে, সুতরাং নিম্নলিখিত মামলাগুলির পক্ষে ভুল করা শক্ত।
hwaien

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

2

এটি কোনও অ্যাসিঙ্ক পদ্ধতি নয়, সুতরাং নামটি 'অ্যাসিঙ্ক' এ শেষ হওয়া উচিত নয়। এই পদ্ধতির প্রত্যয়টি একটি স্পষ্ট করে তোলে যে পদ্ধতিটি অপেক্ষা করা উচিত, বা ফলটি কোনও কার্য হিসাবে পরিচালিত করা উচিত convention

আমি মনে করি একটি সাধারণ সংগ্রহ-ফেরত নাম উপযুক্ত is GetFoos (), বা অনুরূপ।


এগুলি প্রত্যয় ব্যবহারের জন্য যুক্তিযুক্ত Async। প্রত্যয় .NET কোর নিজেই ব্যবহার করা হয়: ChannelReader.ReadAllAsync ফেরৎ একটি IAsyncEnumerable। একটি IAsyncEnumerableব্যবহার করতে হবে await foreach, তাই প্রত্যয়টি বোঝায়।
পানাগিওটিস কানভোস

1

অ্যাসিঙ্ক প্রত্যয় এবং এমনকি কীওয়ার্ডটি asyncকেবল বয়লারপ্লেট, এটি কিছু পশ্চাদপটে সামঞ্জস্যতার যুক্তি ব্যতীত অর্থহীন। সি # এর সমস্ত ফাংশন আলাদা করার জন্য সমস্ত তথ্য রয়েছে ঠিক যেমন yieldপদ্ধতিগুলির মধ্যে ফিরে আসে IEnumerableযেমন আপনি ফিরে আসেন যেমন আপনি জানেন যে enumerableএই জাতীয় পদ্ধতিতে আপনার মতো কিছু বা অন্য কীওয়ার্ড যুক্ত করার দরকার নেই।

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

public interface IMyContract
{
    Task<int> Add(int a, int b);
    int Add(int a, int b);
}

তবে আপনি এটি এটি লিখতে পারেন না কারণ সংকলক অভিযোগ করবে। কিন্তু, আরে! এটি এই এক একত্ববাদকে গ্রাস করবে:

public interface IMyContract : IEnumerable<int>, IEnumerable<long>
{
}

এমনকি এটি:

public interface IMyContractAsync
{
    Task<int> Add(int a, int b);
}

public interface IMyContract : IMyContractAsync
{
    int Add(int a, int b);
}

তাহলে এটাই. আপনি অভিযোগ করতে কেবল সংকলক থামাতে অ্যাসিঙ্ক যুক্ত করেছেন । জিনিস স্পষ্ট করতে না। তাদের আরও ভাল করার জন্য নয়। যদি কোনও অভিযোগ না থাকে - এটি যুক্ত করার কোনও কারণ নেই, তাই আপনার ক্ষেত্রে আমি এটি এড়াতে চাই, যদি না এটি হয়ে যায় Task<IAsyncEnumerable>

PS: কেবল এখানে পুরো ছবিটি বোঝার জন্য - ভবিষ্যতে যদি কেউ সি # কোয়ান্টাম-কম্পিউটার পদ্ধতি এক্সটেনশনগুলি (ফ্যান্টাজি, হু) যোগ করেন যা বিভিন্ন দৃষ্টান্তে কাজ করে, তবে আমাদের সম্ভবত কোয়ান্ট বা অন্য কিছুটির মতো প্রয়োজন হবে , কারণ সি # অন্যথায় অভিযোগ করবে। এটি ঠিক একই পদ্ধতি হবে তবে এটি অন্যভাবে কাজ করবে। পলিমারফিজমের মতোই। ইন্টারফেস যেমন ঠিক আছে।


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

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

ভিন্ন ভিন্ন, অ্যাসিঙ্কের অর্থ - হিউ কলার নিশ্চিত হন যে আপনি এটিকে স্বচ্ছভাবে পরিচালনা করছেন। টাস্ককে রিটার্ন করার বিষয়টি যথেষ্ট নয় যে পদ্ধতিটি সত্যই অ্যাসিঙ্ক। কলার অবশ্যই অপেক্ষা করতে হবে বা গেটআওয়েটার () ব্যবহার করতে হবে same একই ওপুট পেতে গেটরেসিল্ট ()। কীভাবে জিনিসগুলি ভিতরে করা হয় তা নয়।
ম্যাডক্সদেব

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

যে কেউ চিহ্নিত করেছে - এটি মতামত। আমরা যা বিশ্বাস করি তাতে বিশ্বাস রাখতে পারি এবং খুশি হতে পারি :)
madoxdev
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.