বিমূর্ত শ্রেণীর সমস্ত পাবলিক পদ্ধতিগুলিকে ভার্চুয়াল চিহ্নিত করা উচিত?


12

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

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

তবে, আমি ভাবতে চাইছি এমন কিছু ঘটতে চাইলে আমি জিজ্ঞাসা করতে চেয়েছিলাম। বিমূর্ত শ্রেণীর সমস্ত পাবলিক পদ্ধতিগুলি কি ভার্চুয়াল করা উচিত?


এই সাহায্য করতে পারেন: stackoverflow.com/questions/391483/...
NoChance

1
হতে পারে আপনার কেন সি # তে ডিফল্ট ভার্চুয়াল নয় তবে জাভাতে তা খতিয়ে দেখা উচিত। কারণ সম্ভবত আপনি উত্তর কিছুটা অন্তর্দৃষ্টি দিতে হবে।
ড্যানিয়েল লিটল

উত্তর:


9

তবে, যতক্ষণ আপনি বিশ্বাস করেন যে লিসকোভের সাবস্টিটিউশন নীতি অনুসরণ করা হবে, তবে আপনি কেন এটিকে ওভারড্রইন করার অনুমতি দিবেন না?

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

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

হালনাগাদ

আমি যে প্রকল্পগুলিতে কাজ করছি তার কয়েকটি দৃ concrete় উদাহরণ:

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

প্রথম দুটি ক্ষেত্রে, মূল লিগ্যাসি বাস্তবায়নে কৌশল ব্যবহৃত হয়েছিল , ফলে প্রচুর নকল কোড তৈরি হয়েছিল, যা বছরের পর বছর ধরে এখানে এবং সেখানে সূক্ষ্ম পার্থক্যের বৃদ্ধি পেয়েছিল এবং এতে প্রচুর নকল বা কিছুটা পৃথক বাগ রয়েছে এবং এটি বজায় রাখা খুব কঠিন ছিল। টেমপ্লেট পদ্ধতিতে রিফ্যাক্টরিং (এবং কিছু অন্যান্য বর্ধন, যেমন জাভা টিকা ব্যবহার করে) কোডের আকার প্রায় 40-70% হ্রাস করে।

এগুলি কেবলমাত্র সাম্প্রতিক উদাহরণ যা আমার মনে আসে। আমি এখন পর্যন্ত প্রায় প্রতিটি প্রকল্পে কাজ করে যাচ্ছি এর থেকে আরও কিছু ঘটনা উদ্ধৃত করতে পারি।


কেবলমাত্র জিওএফের উদ্ধৃতি দেওয়া কোনও উত্তর নয়। আপনার এ জাতীয় কাজ করার জন্য একটি সত্য কারণ প্রয়োজন।
ডেড এমজি

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

2

এটি পুরোপুরি যুক্তিসঙ্গত, এবং কখনও কখনও একটি বিমূর্ত বেস শ্রেণিতে অ-ভার্চুয়াল পদ্ধতি থাকা বাঞ্ছনীয়; কেবল কারণ এটি একটি বিমূর্ত শ্রেণীর অগত্যা এটির প্রতিটি অংশটি বহির্মুখীভাবে ব্যবহারযোগ্য হওয়া উচিত।

উদাহরণস্বরূপ, আপনি 'নন ভার্চুয়াল পলিমারফিজম' আইডিয়মটি ব্যবহার করতে চাইতে পারেন, যার মাধ্যমে ভার্চুয়াল ফাংশনটি বলার আগে নির্দিষ্ট পূর্বশর্ত বা পোস্টকন্ডিশনগুলি পূরণ করা হয় তা নিশ্চিত করার জন্য একটি ভার্চুয়াল নন-ভার্চুয়াল সদস্য ফাংশন থেকে বহুবচন বলা হয় a

class MyAbstractBaseClass
{
protected:
    virtual void OverrideMe() = 0;
public:
    void CallMeFirst();

    void CallMe()
    {
        CallMeFirst();
        OverrideMe();
    }
};

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

2

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


1

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

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


2
আমি মনে করি যে এটি বিমূর্ত শ্রেণিটি সম্পর্কে কিছুটা বিমূর্ত পদ্ধতি রয়েছে, কিছু ভার্চুয়াল পদ্ধতি রয়েছে এবং কিছু অ-ভার্চুয়াল পদ্ধতি রয়েছে তা সঠিক ধারণা অর্জন করে। আমি মনে করি এটি সর্বদা নির্ভর করে আপনি ঠিক কী করতে চান তার উপর।
এসভিচ

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

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

@ এসভিক: হ্যাঁ এটি সঠিকভাবে বোঝায়, আমি এটিকে একটি বিমূর্ত শ্রেণি বলব না, তবে বিমূর্ত পদ্ধতি সহ একটি শ্রেণি ... তবে আমার ধারণা এটি কেবল আমার ব্যাখ্যা হতে পারে।
মার্জন ভেনেমা

@ মারজানভেনেমা, তবে এটি সি # ব্যবহারের পরিভাষা নয়। আপনি যদি কোনও ক্লাসে কোনও পদ্ধতি abstractচিহ্নিত করেন তবে আপনাকে অবশ্যই পুরো ক্লাসটি চিহ্নিত করতে হবে abstract
এসভিচ

0

যাইহোক, আপনি যতক্ষণ বিশ্বাস করেন যে লিসকোভের সাবস্টিটিউশন নীতি অনুসরণ করা হবে, তারপরে> আপনি কেন এটিকে ওভাররেড করার অনুমতি দিবেন না?

আপনি নির্দিষ্ট পদ্ধতিগুলি ভার্চুয়াল করেন না কারণ আপনি এটি বিশ্বাস করেন না। তদুপরি, নির্দিষ্ট পদ্ধতিগুলি ভার্চুয়াল নয়, আপনি কোন পদ্ধতি (গুলি) প্রয়োগ করা উচিত তা উত্তরাধিকারীদের কাছে সংকেত দিচ্ছেন।

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

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