একটি ইন্টারফেস এক্সপোজিং অ্যাসিঙ্ক ফাংশনগুলি একটি ফাঁস বিমূর্ততা?


13

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

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

উদাহরণ হিসাবে, অ্যাপ্লিকেশন ব্যবহারকারীদের জন্য একটি সংগ্রহস্থল উপস্থাপন করে নিম্নলিখিত ইন্টারফেসটি বিবেচনা করুন:

public interface IUserRepository 
{
  Task<IEnumerable<User>> GetAllAsync();
}

বইয়ের সংজ্ঞা অনুসারে একটি ফাঁসী বিমূর্ততা একটি নির্দিষ্ট প্রয়োগকে মনে রেখে ডিজাইন করা একটি বিমূর্ততা, যাতে কিছু প্রয়োগের বিবরণ বিমূর্তির মধ্যে থেকেই "ফাঁস" হয়।

আমার প্রশ্নটি নীচে রয়েছে: আমরা কি অসম্পূর্ণতার সাথে ডিজাইন করা একটি ইন্টারফেস বিবেচনা করতে পারি, যেমন আইউসাররোপোসিটরি, একটি ফুটো বিমূর্তির উদাহরণ হিসাবে?

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

তুমি এটা সম্পর্কে কী ভাব ?


@ নীল আমি সম্ভবত পয়েন্ট পেয়েছি টাস্ক বা টাস্ক <T> ফিরিয়ে দেওয়া একটি ইন্টারফেস এক্সপোজার পদ্ধতিগুলি প্রতি সেফের জন্য একটি ফাঁস বিমূর্ততা নয়, কেবল কাজের সাথে জড়িত স্বাক্ষরের সাথে চুক্তি। কোনও টাস্ক বা টাস্ক <T> ফিরিয়ে দেওয়ার পদ্ধতিতে এসিঙ্ক বাস্তবায়ন বোঝানো হয় না (উদাহরণস্বরূপ যদি আমি টাস্ক.কম্পলটেড টাস্ক ব্যবহার করে একটি সম্পন্ন টাস্ক তৈরি করি তবে আমি অ্যাসিঙ্ক বাস্তবায়ন করছি না)। তদ্বিপরীত, সি # তে অ্যাসিঙ্ক প্রয়োগকরণের প্রয়োজন যে একটি অ্যাসিঙ্ক পদ্ধতির রিটার্ন টাইপ অবশ্যই টাস্ক বা টাস্ক <টাই> টাইপের হতে হবে। অন্যভাবে আমার ইন্টারফেসের একমাত্র "ফাঁস" দিকটি হ'ল নামগুলিতে অ্যাসিঙ্ক প্রত্যয়
এনরিকো ম্যাসোন

@ নীল আসলে একটি নামকরণের গাইডলাইন রয়েছে যা উল্লেখ করে যে সমস্ত অ্যাসিঙ্ক পদ্ধতির একটি নাম "অ্যাসিঙ্ক" এ শেষ হওয়া উচিত। তবে এর অর্থ এই নয় যে কোনও টাস্ক বা কোনও টাস্ক <T> ফেরত দেওয়ার পদ্ধতির নাম অবশ্যই অ্যাসিঙ্ক প্রত্যয় দিয়ে রাখা উচিত কারণ এটি কোনও অ্যাসিঙ্ক কল ব্যবহার না করে প্রয়োগ করা যেতে পারে।
এনরিকো ম্যাসোন

6
আমি যুক্তি দেব যে কোনও পদ্ধতির 'অ্যাসিনেসনেস' এটি দ্বারা ফিরে আসার বিষয়টি দ্বারা নির্দেশিত Task। অ্যাসিঙ্ক শব্দের সাথে অ্যা্যাসিঙ্ক পদ্ধতিগুলির প্রত্যয় সম্পর্কিত গাইডলাইনগুলি হ'ল অন্যভাবে অভিন্ন API কলগুলির (রিটার্নের ধরণের ভিত্তিতে সি # ক্যান্ট প্রেরণের) মধ্যে পার্থক্য করা ছিল। আমাদের সংস্থায় আমরা এগুলি একসাথে ফেলে রেখেছি।
সমৃদ্ধ জিলা 14'19

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

2
:-) -> "ফাংশনাল প্রোগ্রামিং লোক" হা। অ্যাসিঙ্ক সিঙ্ক্রোনাসের চেয়ে বেশি ফাঁস হয় না, এটি ঠিক সেভাবেই মনে হয় কারণ আমরা সিঙ্ক কোডটি ডিফল্টরূপে লিখতে অভ্যস্ত। যদি আমরা সবাই ডিফল্ট হিসাবে অ্যাসিঙ্ক কোড করে থাকি তবে একটি সিঙ্ক্রোনাস ফাংশন ফাঁস লাগবে seem
স্টারট্র্যাকরেডনেক

উত্তর:


8

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

abstractions

আমার প্রিয় সংজ্ঞা বিমূর্ত রবার্ট সি মার্টিন এর থেকে প্রাপ্ত করা হয় APPP :

"একটি বিমূর্ততা অপরিহার্য অপরিহার্যকরণ এবং অপ্রাসঙ্গিক নির্মূলকরণ।"

সুতরাং, ইন্টারফেসগুলি নিজের মধ্যে বিমূর্ততা নয় । এগুলি কেবলমাত্র বিমূর্ততা যদি তারা কোন বিষয়টিকে পৃষ্ঠতলে নিয়ে আসে এবং বাকিগুলি লুকিয়ে রাখে।

ছিদ্রময়

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

থেকে নির্ভরতা ইনভার্সান নীতি (চোবান) এটিকে অনুসরণ করে, অনুসরণ করে আবার APPP উদ্ধৃত, যে:

"ক্লায়েন্টরা [...] বিমূর্ত ইন্টারফেসের মালিক"

এর অর্থ হ'ল ক্লায়েন্ট (কলিং কোড) তাদের প্রয়োজনীয় বিমূর্ততাগুলি সংজ্ঞায়িত করে এবং তারপরে আপনি গিয়ে সেই বিমূর্তনটি প্রয়োগ করেন।

একটি দৃak় বিমূর্ততা , আমার দৃষ্টিতে, এটি একটি বিমূর্ততা যা ক্লায়েন্টের প্রয়োজন হয় না এমন কিছু কার্যকারিতা সহ কোনওভাবে ডিআইপি লঙ্ঘন করে ।

সিঙ্ক্রোনাস নির্ভরতা

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

এমন একটি ডোমেন অবজেক্ট বিবেচনা করুন যা রেস্তোঁরা সংরক্ষণের জন্য একটি অনুরোধ পরিচালনা করে:

public class MaîtreD : IMaîtreD
{
    public MaîtreD(int capacity, IReservationsRepository repository)
    {
        Capacity = capacity;
        Repository = repository;
    }

    public int Capacity { get; }
    public IReservationsRepository Repository { get; }

    public int? TryAccept(Reservation reservation)
    {
        var reservations = Repository.ReadReservations(reservation.Date);
        int reservedSeats = reservations.Sum(r => r.Quantity);

        if (Capacity < reservedSeats + reservation.Quantity)
            return null;

        reservation.IsAccepted = true;
        return Repository.Create(reservation);
    }
}

এখানে IReservationsRepositoryনির্ভরতা ক্লায়েন্ট, ক্লাস দ্বারা একচেটিয়াভাবে নির্ধারণ করা হয় MaîtreD:

public interface IReservationsRepository
{
    Reservation[] ReadReservations(DateTimeOffset date);
    int Create(Reservation reservation);
}

এই ইন্টারফেসটি সম্পূর্ণরূপে সিঙ্ক্রোনাস কারণ ক্লাসটির এটি অ্যাসিঙ্ক্রোনাস হওয়ার দরকারMaîtreD নেই ।

অ্যাসিনক্রোনাস নির্ভরতা

আপনি ইন্টারফেসটি সহজেই অ্যাসিক্রোনাসে পরিবর্তন করতে পারেন:

public interface IReservationsRepository
{
    Task<Reservation[]> ReadReservations(DateTimeOffset date);
    Task<int> Create(Reservation reservation);
}

MaîtreDবর্গ, তবে না প্রয়োজন সেই পদ্ধতি অ্যাসিঙ্ক্রোনাস হতে, তাই এখন চোবান লঙ্ঘন করা হয়। আমি এটিকে একটি ফাঁসী বিমূর্ততা হিসাবে বিবেচনা করি কারণ একটি বাস্তবায়নের বিশদটি ক্লায়েন্টকে পরিবর্তন করতে বাধ্য করে। TryAcceptপদ্ধতি এখন অ্যাসিঙ্ক্রোনাস পরিণত আছে:

public async Task<int?> TryAccept(Reservation reservation)
{
    var reservations =
        await Repository.ReadReservations(reservation.Date);
    int reservedSeats = reservations.Sum(r => r.Quantity);

    if (Capacity < reservedSeats + reservation.Quantity)
        return null;

    reservation.IsAccepted = true;
    return await Repository.Create(reservation);
}

ডোমেন যুক্তিকে অ্যাসিক্রোনোনাস হওয়ার কোনও সহজাত যুক্তি নেই, তবে বাস্তবায়নের অ্যাসিনক্রোনিকে সমর্থন করার জন্য, এখন এটি প্রয়োজন required

আরও ভাল বিকল্প

এনডিসি সিডনি 2018 এ আমি এই বিষয়টিতে একটি আলোচনা দিয়েছিলাম । এটিতে, আমি এমন একটি বিকল্পের রূপরেখাও বলি যা ফাঁস হয় না। আমি 2019 সালেও বেশ কয়েকটি সম্মেলনে এই আলোচনা করব, তবে এখন অ্যাসিঙ্ক ইঞ্জেকশনের নতুন শিরোনাম দিয়ে পুনরায় ব্র্যান্ড করা হয়েছে ।

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


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

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

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

11

এটি মোটেও ফাঁসী বিমূর্ততা নয়।

অ্যাসিঙ্ক্রোনাস হওয়া কোনও ক্রিয়াকলাপের সংজ্ঞাতে মৌলিক পরিবর্তন - এর অর্থ কলটি যখন ফিরে আসে তখন কাজটি শেষ হয় না, তবে এর অর্থ এইও হয় যে আপনার প্রোগ্রামের প্রবাহটি তাত্ক্ষণিকভাবে চালিয়ে যাবে, দীর্ঘতর দেরি না করেই। অ্যাসিঙ্ক্রোনাস এবং একই কাজটি করার জন্য একটি সিঙ্ক্রোনাস ফাংশন মূলত পৃথক ফাংশন। অ্যাসিঙ্ক্রোনাস হচ্ছে না একটি বাস্তবায়ন বিস্তারিত। এটি একটি ফাংশন সংজ্ঞা এর অংশ।

যদি ফাংশনটি উন্মোচিত করে যে কীভাবে ফাংশনটিকে অ্যাসিঙ্ক্রোনাস করা হয়েছিল, এটি ফাঁস হবে। এটি কীভাবে বাস্তবায়িত হয় তা আপনার (যত্ন নেওয়ার দরকার নেই) উচিত।


5

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

পরিবর্তে, যদি আপনার গ্রন্থাগারটি সমস্ত asyncঅ্যাসিনক্রোনাস ক্রিয়াকলাপটি নিজের মধ্যে সঠিকভাবে পরিচালিত করে, তবে আপনি "এপিআই" থেকে বেরিয়ে আসতে দেবেন না ।

সফ্টওয়্যারটিতে অসুবিধার চারটি মাত্রা রয়েছে: ডেটা, নিয়ন্ত্রণ, স্থান এবং সময়। অ্যাসিঙ্ক্রোনাস অপারেশনস চারটি মাত্রা বিস্তৃত, এইভাবে সর্বাধিক যত্নের প্রয়োজন।


আমি আপনার অনুভূতির সাথে একমত, তবে "ফুটো" খারাপ কিছু বোঝায় যা "ফুটো বিমূর্ততা" শব্দের উদ্দেশ্য - এটি বিমূর্তে অনাকাঙ্ক্ষিত কিছু। অ্যাসিঙ্ক বনাম সিঙ্কের ক্ষেত্রে, কিছুই ফাঁস হয় না।
স্টারট্র্যাকরেডনেক 15'19

2

একটি ফাঁসী বিমূর্ততা হ'ল একটি বিমূর্ততা যা একটি নির্দিষ্ট বাস্তবায়নকে মাথায় রেখে ডিজাইন করা হয়েছে, যাতে কিছু বাস্তবায়নের বিশদটি বিমূর্তির মধ্যে থেকেই "ফাঁস" হয়।

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

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

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


2

নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন:

এটি এমন একটি পদ্ধতি যা নামটি ফিরে আসার আগে সেট করে:

public void SetName(string name)
{
    _dataLayer.SetName(name);
}

এটি একটি পদ্ধতি যা নাম সেট করে। ফিরে আসা কাজটি শেষ না হওয়া পর্যন্ত কলার নাম সেট করা ধরে নিতে পারে না ( IsCompleted= সত্য):

public Task SetName(string name)
{
    return _dataLayer.SetNameAsync(name);
}

এটি একটি পদ্ধতি যা নাম সেট করে। ফিরে আসা কাজটি শেষ না হওয়া পর্যন্ত কলার নাম সেট করা ধরে নিতে পারে না ( IsCompleted= সত্য):

public async Task SetName(string name)
{
    await _dataLayer.SetNameAsync(name);
}

প্রশ্ন: কোনটি অন্য দুজনের সাথে সম্পর্কিত নয়?

উত্তর: অ্যাসিঙ্ক পদ্ধতিটি একা দাঁড়িয়ে না। একা একা দাঁড়িয়ে থাকা হ'ল পদ্ধতিটি যা অকার্যকর ফিরে আসে।

আমার কাছে, এখানে "ফুটো" মূল শব্দটি নয় async; এটি সত্য যে পদ্ধতিটি কোনও কার্য দেয়। এবং এটি ফুটো নয়; এটি প্রোটোটাইপের অংশ, এবং বিমূর্তনের একটি অংশ। একটি অ্যাসিঙ্ক পদ্ধতি যা কোনও কার্য প্রত্যাবর্তন করে তা একটি সিঙ্ক্রোনাস পদ্ধতি দ্বারা ঠিক একই প্রতিশ্রুতি দেয় যা কোনও কার্য ফেরায়।

সুতরাং না, আমি মনে করি না যে প্রবর্তনটি asyncনিজেকে এবং নিজের মধ্যে একটি ফাঁসী বিমূর্ততা তৈরি করে। তবে আপনাকে কোনও টাস্ক ফেরত দিতে প্রোটোটাইপ পরিবর্তন করতে হতে পারে, যা ইন্টারফেস (বিমূর্তি) পরিবর্তন করে "ফাঁস" করে। এবং যেহেতু এটি বিমূর্তির অংশ, এটি সংজ্ঞা অনুসারে কোনও ফুটো নয়।


0

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

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


0

এখানে একটি বিরোধী দৃষ্টিভঙ্গি।

আমরা ফিরে থেকে যাননি Fooফিরে Task<Foo>কারণ আমরা অনুপস্থিত শুরু Taskপরিবর্তে মাত্র Foo। মঞ্জুর, কখনও কখনও আমরা সাথে যোগাযোগ করি Taskতবে বেশিরভাগ আসল-ওয়ার্ল্ড কোডে আমরা এটিকে উপেক্ষা করি এবং কেবলমাত্র এটি ব্যবহার করি Foo

আরও কী, আমরা প্রায়শই অসম্পূর্ণ আচরণটি সমর্থন করার জন্য ইন্টারফেসগুলি সংজ্ঞায়িত করি এমনকি বাস্তবায়ন অ্যাসিক্রোনাস নাও হতে পারে।

কার্যত এমন একটি ইন্টারফেস যা Task<Foo>আপনাকে বলে দেয় যে বাস্তবায়ন সম্ভবত এটি অবিচ্ছিন্ন, যদিও তা আপনি যত্ন নাও করুক না কেন। কোনও বিমূর্ততা যদি এর বাস্তবায়ন সম্পর্কে আমাদের আরও বেশি জানা দরকার তবে তা ফাঁস।

যদি আমাদের বাস্তবায়ন অ্যাসিক্রোনাস না হয় তবে আমরা এটিকে অ্যাসিক্রোনাস হিসাবে পরিবর্তন করি এবং তারপরে আমাদের বিমূর্ততা এবং এটি ব্যবহার করে এমন সমস্ত কিছু পরিবর্তন করতে হবে, এটি একটি খুব ফাঁসযুক্ত বিমূর্ততা।

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

এমন কি অভিযোগের মতো মনে হচ্ছে? এটি আমার উদ্দেশ্য নয়, তবে আমি মনে করি এটি একটি সঠিক পর্যবেক্ষণ।

সম্পর্কিত বিন্দু হ'ল "ইন্টারফেস একটি বিমূর্ততা নয়।" মার্ক সিমন দৃc়সংক্ষেপে যা বলেছিলেন তা সামান্য ব্যবহার করা হয়েছে।

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

তবে আমরা বিমূর্ততা তৈরি করতে পুরোপুরি ইন্টারফেস ব্যবহার করি। সুতরাং "ইন্টারফেসগুলি বিমূর্ততা নয়" টস আউট করার কারণ একটি প্রশ্নে ইন্টারফেসের উল্লেখ রয়েছে এবং বিমূর্ততা আলোকিত নয়।


-2

GetAllAsync()আসলে কি অ্যাসিঙ্ক? আমি বোঝাতে চাইছি "অ্যাসিঙ্ক" নামে আছে তবে তা মুছে ফেলা যায়। সুতরাং আমি আবার জিজ্ঞাসা করছি ... এমন কোনও ফাংশন বাস্তবায়ন করা কি অসম্ভব Task<IEnumerable<User>>যেটি সিঙ্ক্রোনালি সমাধান করা হয়?

নেট নেট এর ধরণগুলি আমি জানি না Task, তবে যদি ফাংশনটি সিঙ্ক্রোনালি প্রয়োগ করা অসম্ভব হয় তবে নিশ্চিত হয়ে নিন যে এটি একটি ফাঁস বিমূর্ততা (এইভাবে) তবে অন্যথায় নয়। আমি কি জানি যে যদি এটি ছিল একটি IObservableএকটি টাস্ক চেয়ে বরং পারে পারেন সিঙ্ক্রোনাস বা ASYNC তাই কিছুই ফাংশন বাহিরে জানে বাস্তবায়িত হবে এবং এর ফলে এটা যে বিশেষ আসলে লিক না।


Task<T> এর অর্থ অ্যাসিঙ্ক। আপনি অবিলম্বে টাস্ক অবজেক্টটি পেয়ে যান, তবে ব্যবহারকারীদের ক্রমের জন্য অপেক্ষা করতে হতে পারে
কালেথ

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