বিমূর্ত শ্রেণি / পদ্ধতি অপ্রচলিত হয়?


37

আমি প্রচুর বিমূর্ত ক্লাস / পদ্ধতি তৈরি করতাম। তারপরে আমি ইন্টারফেস ব্যবহার শুরু করলাম।

এখন আমি নিশ্চিত নই যে ইন্টারফেসগুলি বিমূর্ত ক্লাসগুলি অচল করে দিচ্ছে না।

আপনি একটি সম্পূর্ণ বিমূর্ত ক্লাস প্রয়োজন? পরিবর্তে একটি ইন্টারফেস তৈরি করুন। আপনার কিছু বিবর্তনের সাথে এটি একটি বিমূর্ত শ্রেণির প্রয়োজন? একটি ইন্টারফেস তৈরি করুন, একটি বর্গ তৈরি করুন। ক্লাস উত্তরাধিকারী, ইন্টারফেস বাস্তবায়ন। একটি অতিরিক্ত সুবিধা হ'ল কিছু ক্লাসের পিতামাত্ত শ্রেণীর প্রয়োজন নাও হতে পারে তবে কেবল ইন্টারফেসটি প্রয়োগ করবে।

সুতরাং, বিমূর্ত শ্রেণি / পদ্ধতি অপ্রচলিত হয়?


আপনার পছন্দের প্রোগ্রামিং ভাষা ইন্টারফেস সমর্থন না করে তবে কীভাবে? আমি মনে করি এটি সি ++ এর ক্ষেত্রে।
বার্নার্ড

7
@Bernard: সি ++ একটি বিমূর্ত বর্গ হয় সব কিন্তু নামে একটি ইন্টারফেস। তারা 'খাঁটি' ইন্টারফেসের চেয়েও বেশি কিছু করতে পারে তা অসুবিধা নয়।
gbjbaanb

@ জিবিজেবায়ানব: আমি মনে করি আমি এগুলি ইন্টারফেস হিসাবে ব্যবহার করে মনে করি না, বরং ডিফল্ট বাস্তবায়ন সরবরাহ করি।
বার্নার্ড

ইন্টারফেস হ'ল অবজেক্ট রেফারেন্সের "মুদ্রা"। সাধারণভাবে বলতে গেলে এগুলি বহুতল আচরণের মৌলিক বিষয়। অ্যাবস্ট্রাক্ট ক্লাসগুলি একটি ভিন্ন উদ্দেশ্যে পরিবেশন করে যা ডেডালনিক্স পুরোপুরি ব্যাখ্যা করেছিল।
জিগি

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

উত্তর:


111

না।

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

ক্রমযুক্ত সংযোগ কমাতে এটিও একটি দুর্দান্ত উপায়। বিমূর্ত পদ্ধতি / ক্লাস ছাড়া, আপনি টেমপ্লেট পদ্ধতি প্যাটার্নটি প্রয়োগ করতে পারবেন না। আমি আপনাকে এই Wikipedia নিবন্ধটি তাকান: http://en.wikipedia.org/wiki/Template_method_pattern


3
@ ডেডালনিক্স টেমপ্লেট পদ্ধতির প্যাটার্নটি বেশ বিপজ্জনক হতে পারে। আপনি অতিমাত্রায় সংযুক্ত কোড সহ সহজেই শেষ করতে পারেন, এবং "মাত্র একটি মাত্র কেস" পরিচালনা করতে প্ররোচিত বিমূর্ত শ্রেণির প্রসারিত করতে কোড হ্যাক করা শুরু করুন।
কোয়ান্ট_দেব

9
এটি আরও একটি অ্যান্টি-প্যাটার্নের মতো বলে মনে হচ্ছে। আপনি ইন্টারফেসের বিপরীতে রচনাটির সাথে একই জিনিসটি পেতে পারেন। একই জিনিস কিছু বিমূর্ত পদ্ধতি সহ আংশিক ক্লাসে প্রযোজ্য। তারপরে ক্লায়েন্ট কোডটি সাবক্লাসে বাধ্য করা এবং সেগুলি ওভাররাইড করা, আপনার প্রয়োগটি ইঞ্জেকশন দেওয়া উচিত । দেখুন: en.wikipedia.org/wiki/Composition_over_inheritance#Benefits
back2dos

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

3
@deadalnix: এই বলে যে অনুক্রমিক কাপলিং সেরা টেমপ্লেট প্যাটার্ন সঙ্গে কমে যাবে হয় পণ্যসম্ভার অর্চনা প্রোগ্রামিং (হতে পারে হিসাবে ভাল শুধু কাজ রাজ্য / কৌশলের / কারখানা প্যাটার্ন ব্যবহার করে), যেমন ভাবনাটি হলো এই যে এটা সবসময় হ্রাস করা হবে। ক্রম সংযুক্তি প্রায়শই কোনও কিছুর উপর খুব সূক্ষ্ম দানাদার নিয়ন্ত্রণ প্রকাশের একমাত্র পরিণতি যার অর্থ বাণিজ্য ব্যতিরেকে কিছুই নয়। তারপরেও এর অর্থ এই নয় যে আমি এমন একটি মোড়ক লিখতে পারি না যাতে রচনাটি ব্যবহার করে ক্রমানুসারে মিলিত হয় না। আসলে এটি এটিকে অনেক সহজ করে তোলে।
back2dos

4
জাভা এখন ইন্টারফেসের জন্য ডিফল্ট বাস্তবায়ন আছে। এর উত্তর কি বদলে যায়?
raptortech97

15

একটি বিমূর্ত পদ্ধতি বিদ্যমান তাই আপনি এটি আপনার বেস শ্রেণীর মধ্যে থেকে কল করতে পারেন তবে এটি একটি উত্পন্ন শ্রেণিতে প্রয়োগ করতে পারেন। সুতরাং আপনার বেস শ্রেণি জানে:

public void DoTask()
{
    doSetup();
    DoWork();
    doCleanup();
}

protected abstract void DoWork();

সেটআপ এবং ক্লিনআপ ক্রিয়াকলাপ সম্পর্কে জেনে না উত্পন্ন শ্রেণি ছাড়া মাঝারি প্যাটার্নে একটি গর্ত বাস্তবায়নের এটি একটি যুক্তিসঙ্গত সুন্দর উপায়। বিমূর্ত পদ্ধতি ব্যতীত, আপনাকে DoTaskআহ্বান করা শ্রেণীর প্রয়োগ এবং কল করতে base.DoSetup()এবং base.DoCleanup()সমস্ত সময় মনে রাখার উপর নির্ভর করতে হবে।

সম্পাদন করা

এছাড়াও, টেম্পলেট পদ্ধতি প্যাটার্নটিতে একটি লিঙ্ক পোস্ট করার জন্য ডেডালনিক্সকে ধন্যবাদ , যা আমি নামটি না জেনেও উপরে বর্ণিত। :)


2
+1, আমি আপনার উত্তরটি ডেডালনিক্সে পছন্দ করি। নোট করুন যে আপনি প্রতিনিধিদের (সি # তে) ব্যবহার করে আরও সোজা-সামনের দিকে কোনও টেম্পলেট পদ্ধতি বাস্তবায়ন করতে পারেন:public void DoTask(Action doWork)
জো

1
@ জো - সত্য, তবে এটি আপনার API এর উপর নির্ভর করে এতটা দুর্দান্ত নয়। যদি আপনার বেস ক্লাস হয় Fruitএবং আপনার উত্পন্ন ক্লাস হয় Apple, আপনি কল করতে চান myApple.Eat(), না myApple.Eat((a) => howToEatApple(a))। এছাড়াও, আপনি Appleকল করতে চান না base.Eat(() => this.howToEatMe())। আমি মনে করি এটি কেবল পরিষ্কার একটি বিমূর্ত পদ্ধতি ওভাররাইড করার জন্য clean
স্কট হুইটলক

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

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

10

না, তারা অচল নয়।

আসলে, অ্যাবস্ট্রাক্ট ক্লাস / পদ্ধতি এবং ইন্টারফেসের মধ্যে একটি অস্পষ্ট কিন্তু মৌলিক পার্থক্য রয়েছে।

যদি ক্লাসগুলির সেটে যেগুলির মধ্যে একটি ব্যবহার করতে হয় সেগুলির একটি সাধারণ আচরণ থাকে যা তারা ভাগ করে দেয় (সম্পর্কিত ক্লাস, মানে), তবে অ্যাবস্ট্রাক্ট ক্লাস / পদ্ধতিগুলির জন্য যান।

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

যদি আপনার ক্লাসগুলির মধ্যে কিছু সাধারণ না থাকে (সম্পর্কিত প্রবন্ধে, নির্বাচিত প্রসঙ্গে) তবে এর একটি প্রয়োগ রয়েছে যা বাস্তবায়নের ক্ষেত্রে একেবারেই আলাদা, তবে ইন্টারফেসের জন্য যান।

উদাহরণ: গাভী, বেঞ্চ, গাড়ি, দূরবীন-সম্পর্কিত ক্লাস নয় তবে ইরেসটেবল সেখানে অ্যারে বাছাই করতে পারে।

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


6

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

public abstract class Frobber
{
    private Frobber() {}
    public abstract void Frob(Frotz frotz);
    private class GreenFrobber : Frobber
    { ... }
    private class RedFrobber : Frobber
    { ... }
    public static Frobber GetFrobber(bool b) { ... } // return a green or red frobber
}

public sealed class Frotz
{
    public void Frobbit(Frobber frobber)
    {
         ...
         frobber.Frob(this);
         ...
    }
}

আমি গ্যারান্টিযুক্ত যে দুটি পরীক্ষা করার দরকার আছে কেবল দুটি কোড পাথ। ফ্রোবিতের লেখক এই ফ্রোবারটি লাল বা সবুজ বর্ণের উপর নির্ভর করতে পারেন।

পরিবর্তে আমরা যদি বলি:

public interface IFrobber
{
    void Frob(Frotz frotz);
}
public class GreenFrobber : IFrobber
{ ... }
public class RedFrobber : Frobber
{ ... }

public sealed class Frotz
{
    public void Frobbit(IFrobber frobber)
    {
         ...
         frobber.Frob(this);
         ...
    }
}

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

বিমূর্ত শ্রেণি আপনাকে এই সমস্ত সমস্যা এড়াতে দেয়; তাদের ব্যাবহার করুন!


1
আপনি যে সমস্যার কথা বলছেন তা বীজগণিত ডেটা ধরণের ব্যবহার করে সমাধান করা উচিত, ক্লাসগুলি এমন এক বিন্দুতে বাঁকানোর পরিবর্তে যেখানে তারা মুক্ত / বন্ধ নীতি লঙ্ঘন করে।
back2dos

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

1
বিমূর্ত পদ্ধতি অপ্রচলিত বলা নিঃসন্দেহে ভুল, তবে অন্যদিকে ইন্টারফেসের চেয়ে তাদের পছন্দ করা উচিত বলে দাবি করা বিপথগামী। এগুলি ইন্টারফেসের চেয়ে বিভিন্ন সমস্যা সমাধানের সহজ উপায়।
গ্রো

2
"একটি মৌলিক পার্থক্য আছে [...] ইন্টারফেসগুলি অ্যাবস্ট্রাক্ট ক্লাসগুলির চেয়ে অনেক কম নির্ভরযোগ্য [...]"। আমি দ্বিমত পোষণ করছি, আপনার কোডে আপনি যে পার্থক্য তুলে ধরেছেন তা অ্যাক্সেস বিধিনিষেধের উপর নির্ভর করে, যা আমি মনে করি না ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে উল্লেখযোগ্যভাবে আলাদা হওয়ার কোনও কারণ আছে। এটি সি # তেও হতে পারে, তবে প্রশ্নটি ভাষা-অজ্ঞাত জ্ঞাত।
জো

1
@ ব্যাকডোডস: আমি কেবল উল্লেখ করতে চাই যে এরিকের সমাধানটি আসলে একটি বীজগণিত ডেটা টাইপ ব্যবহার করে: একটি বিমূর্ত শ্রেণি একটি যোগফল sum বিমূর্ত পদ্ধতিটি কল করা বৈকল্পিকের সেটগুলির সাথে প্যাটার্নের মিলের সমান।
রড্রিক চ্যাপম্যান

4

আপনি নিজেই বলেছেন:

আপনার কিছু বিবর্তনের সাথে এটি একটি বিমূর্ত শ্রেণির প্রয়োজন? একটি ইন্টারফেস তৈরি করুন, একটি বর্গ তৈরি করুন। ক্লাস উত্তরাধিকারী, ইন্টারফেস বাস্তবায়ন

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


ক্লাস ইন্টারফেসের উত্তরাধিকারী না হলে (যা এটি উল্লেখ করা হয়নি), আপনাকে কয়েকটি ভাষায় ফরোয়ার্ডিং ফাংশন লিখতে হবে তা উল্লেখ করার দরকার নেই।
সোজারড

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

4

আমি @ ডেডনিক্স পোস্টে যেমন মন্তব্য করেছি: টেমপ্লেট প্যাটার্নগুলি আনুষ্ঠানিকভাবে সত্ত্বেও আংশিক বাস্তবায়ন একটি অ্যান্টি-প্যাটার্ন।

টেমপ্লেট প্যাটার্নটির এই উইকিপিডিয়া উদাহরণের জন্য একটি পরিষ্কার সমাধান :

interface Game {
    void initialize(int playersCount);
    void makePlay(int player);
    boolean done();
    void finished();
    void printWinner();
}
class GameRunner {
    public void playOneGame(int playersCount, Game game) {
        game.initialize(playersCount);
        int j = 0;
        for (int i = 0; !game.finished(); i++)
             game.makePlay(i % playersCount);
        game.printWinner();
    }
} 
class Monopoly implements Game {
     //... implementation
}

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


+1 টি। পার্শ্ব-নোট হিসাবে: "আংশিক বাস্তবায়ন হ'ল একটি অ্যান্টি-প্যাটার্ন, যদিও টেম্পলেট প্যাটার্ন তাদের আনুষ্ঠানিক করে।" উইকিপিডিয়ায় বর্ণিত বিবরণটি পরিষ্কারভাবে প্যাটার্নটি সংজ্ঞায়িত করে, কেবল কোড উদাহরণটি "ভুল" (এই অর্থে যে এটি যখন প্রয়োজন হয় না তখন উত্তরাধিকার ব্যবহার করে এবং উপরের চিত্রের মতো একটি সহজ বিকল্প উপস্থিত থাকে)) অন্য কথায়, আমি মনে করি না যে প্যাটার্নটি নিজেই দোষযুক্ত, কেবল মানুষ যেভাবে এটি বাস্তবায়নের ঝোঁক রাখে।
জহ

2

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


-1। "জেনেরিক কোড বনাম উত্তরাধিকার" প্রশ্নের সাথে কী করার তা আমি বুঝতে পারি না। আপনার ব্যাখ্যা বা ন্যায়সঙ্গত করা উচিত কেন "বিমূর্ত ক্লাসগুলির ইন্টারফেসগুলির চেয়ে উল্লেখযোগ্য সুবিধা রয়েছে"।
জহ

1

বিমূর্ত শ্রেণি ইন্টারফেস নয়। তারা এমন ক্লাস যেগুলি ইনস্ট্যান্ট করা যায় না can't

আপনি একটি সম্পূর্ণ বিমূর্ত ক্লাস প্রয়োজন? পরিবর্তে একটি ইন্টারফেস তৈরি করুন। আপনার কিছু বিবর্তনের সাথে এটি একটি বিমূর্ত শ্রেণির প্রয়োজন? একটি ইন্টারফেস তৈরি করুন, একটি বর্গ তৈরি করুন। ক্লাস উত্তরাধিকারী, ইন্টারফেস বাস্তবায়ন। একটি অতিরিক্ত সুবিধা হ'ল কিছু ক্লাসের পিতামাত্ত শ্রেণীর প্রয়োজন নাও হতে পারে তবে কেবল ইন্টারফেসটি প্রয়োগ করবে।

তবে তারপরে আপনার একটি অ-বিমূর্ত ব্যবহারহীন ক্লাস হবে। বেস ক্লাসে কার্যকারিতা গর্ত পূরণ করার জন্য বিমূর্ত পদ্ধতিগুলির প্রয়োজন are

উদাহরণস্বরূপ, এই বর্গ দেওয়া

public abstract class Frobber {
    public abstract void Frob();

    public abstract boolean IsFrobbingNeeded { get; }

    public void FrobUntilFinished() {
        while (IsFrobbingNeeded) {
            Frob();
        }
    }
}

আপনি যদি একটি বর্গ যে হয়েছে তন্ন তন্ন এই বেস কার্যকারিতা কিভাবে বাস্তবায়ন করবে Frob()না IsFrobbingNeeded?


1
একটি ইন্টারফেসও ইনস্ট্যান্ট করা যাবে না।
সোজয়েরড

@ সোজার্ড: তবে আপনার ভাগাভাগি বাস্তবায়নের সাথে একটি বেস ক্লাস প্রয়োজন; এটি একটি ইন্টারফেস হতে পারে না।
Configurator

1

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


0

আমি মনে করি না যে তারা ইন্টারফেস দ্বারা অচল হয়ে গেছে, তবে তারা কৌশল প্যাটার্ন দ্বারা অচল হয়ে থাকতে পারে।

একটি বিমূর্ত শ্রেণীর প্রাথমিক ব্যবহার বাস্তবায়নের একটি অংশ স্থগিত করা; "শ্রেণীর প্রয়োগের এই অংশটি আলাদা করা যেতে পারে" বলতে হয়।

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


0

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

এটি বলেছিল, আমরা যদি সত্যই বিশ্ব উপমা ব্যবহার করি তবে কার্যকারিতা এবং রাষ্ট্রবিহীন খাঁটি ইন্টারফেসের জন্য কতটা ব্যবহার রয়েছে? যদি আমি উদাহরণ হিসাবে ইউএসবি ব্যবহার করি তবে এটি যুক্তিযুক্ত স্থিতিশীল ইন্টারফেস (আমি মনে করি আমরা এখন ইউএসবি ৩.২ এ আছি, তবে এটি পিছনে সামঞ্জস্যতাও বজায় রেখেছে)।

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

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

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

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

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

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