সংজ্ঞা হিসাবে সি # তে বিমূর্ত শ্রেণি ব্যবহার করুন


21

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

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

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


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

17
সি # এবং জাভা এর অন্যতম সেরা জিনিস হ্যাডার ফাইলগুলি থেকে মুক্তি! কেবল একটি ভাল আইডিই ব্যবহার করুন।
এরিক tদ 15

9
সি ++ শিরোলেখ ফাইলগুলিতে ঘোষণাগুলি উত্পন্ন বাইনারিগুলির অংশ হয়ে শেষ হয় না। তারা সেখানে সংকলক এবং লিঙ্কারের জন্য রয়েছে। এই সি # বিমূর্ত শ্রেণিগুলি উত্পন্ন কোডের অংশ হবে, এতে কোনও লাভ নেই।
মার্ক বেনিংফিল্ড 24'18

16
সি # তে সমান কন্সট্রাক্ট একটি ইন্টারফেস, কোনও বিমূর্ত শ্রেণি নয়।
রবার্ট হার্ভে

6
@ ডানিবারকা ক্যাসাফন্ট "আমি শ্রেণীবদ্ধের পদ্ধতি এবং বৈশিষ্ট্যগুলি কী, প্যারামিটারগুলি কী ধরণের প্রত্যাশা করে এবং কী ফিরে আসে তা দেখার একটি দ্রুত এবং নির্ভরযোগ্য উপায় হিসাবে আমি শিরোনামগুলি দেখি" " ভিজ্যুয়াল স্টুডিও ব্যবহার করার সময় আমার বিকল্পটি হল সিটিআরএল-মো শর্টকাট।
wha7ever - মনিকা 18

উত্তর:


44

সি ++ এ যে কারণে করা হয়েছে তার জন্য দ্রুততর এবং প্রয়োগ করা সহজতর সংকলক তৈরির সাথে সম্পর্কযুক্ত। প্রোগ্রামিং সহজ করার জন্য এটি কোনও নকশা ছিল না ।

শিরোনাম ফাইলগুলির উদ্দেশ্য হ'ল সমস্ত প্রত্যাশিত ফাংশন নাম জানতে এবং তাদের জন্য মেমরির অবস্থানগুলি বরাদ্দ করার জন্য একটি সুপার দ্রুত প্রথম পাস করতে সংকলককে সক্ষম করা যাতে তাদের সিপি ফাইলগুলিতে ডাকা হলে তাদের রেফারেন্স করা যায়, এমনকি তাদের সংজ্ঞায়িত ক্লাসটি থাকলেও এখনও পার্স করা হয়নি।

একটি আধুনিক বিকাশের পরিবেশে পুরানো হার্ডওয়্যার সীমাবদ্ধতার ফলাফল প্রতিলিপি দেওয়ার চেষ্টা করা বাঞ্ছনীয় নয়!

প্রতিটি শ্রেণীর জন্য একটি ইন্টারফেস বা বিমূর্ত শ্রেণীর সংজ্ঞা দেওয়া আপনার উত্পাদনশীলতা হ্রাস করবে; এই সময়ের সাথে আপনি আর কি করতে পারতেন ? এছাড়াও, অন্যান্য বিকাশকারীরা এই সম্মেলনটি অনুসরণ করবে না।

আসলে, অন্যান্য বিকাশকারীরা আপনার বিমূর্ত ক্লাসগুলি মুছতে পারে। আমি যদি কোডের মধ্যে একটি ইন্টারফেস পাই যা এই উভয় মানদণ্ডকেই পূরণ করে, আমি এটিকে মুছে ফেলি এবং কোডের বাইরে রিফ্যাক্টর:1. Does not conform to the interface segregation principle 2. Only has one class that inherits from it

অন্য জিনিসটি হ'ল ভিজুয়াল স্টুডিওতে এমন সরঞ্জামগুলি অন্তর্ভুক্ত রয়েছে যা আপনি স্বয়ংক্রিয়ভাবে সম্পন্ন করার লক্ষ্যটি করেন:

  1. দ্য Class View
  2. দ্য Object Browser
  3. মধ্যে Solution Explorer আপনি ক্লাস ব্যয় তাদের ফাংশন, পরামিতি এবং বিনিময়ে প্রকারগুলি দেখতে ত্রিভুজ ক্লিক করতে পারেন।
  4. ফাইল ট্যাবগুলির নীচে তিনটি ড্রপ ডাউন মেনু রয়েছে, সবচেয়ে ডান একটি বর্তমান বর্গের সমস্ত সদস্যকে তালিকাভুক্ত করে।

সি # তে সি ++ হেডার ফাইলগুলি প্রতিলিপি করতে সময় উত্সর্গ করার আগে উপরের একবার ব্যবহার করে দেখুন।


তদতিরিক্ত, এটি না করার জন্য প্রযুক্তিগত কারণ রয়েছে ... এটি আপনার চূড়ান্ত বাইনারিটিকে যতটা প্রয়োজন তার চেয়ে বড় করে তুলবে। আমি মার্ক বেনিংফিল্ডের এই মন্তব্যের পুনরাবৃত্তি করব:

সি ++ শিরোলেখ ফাইলগুলিতে ঘোষণাগুলি উত্পন্ন বাইনারিগুলির অংশ হয়ে শেষ হয় না। তারা সেখানে সংকলক এবং লিঙ্কারের জন্য রয়েছে। এই সি # বিমূর্ত শ্রেণিগুলি উত্পন্ন কোডের অংশ হবে, এতে কোনও লাভ নেই।


এছাড়াও, রবার্ট হার্ভে উল্লেখ করেছেন, প্রযুক্তিগতভাবে, সি # তে শিরোনামের নিকটতম সমতুল্য একটি ইন্টারফেস হবে, একটি বিমূর্ত শ্রেণি নয়।


2
আপনি প্রচুর অপ্রয়োজনীয় ভার্চুয়াল প্রেরণের কলগুলিও শেষ করতে চাইবেন (যদি আপনার কোড পারফরম্যান্স-সংবেদনশীল হয় তবে ভাল নয়)।
লুকাস ট্রজেসনিউস্কি 20


2
এটির পাখির চোখের দর্শন পেতে কোনও ব্যক্তি কেবল পুরো ক্লাসটি (ডান ক্লিক -> আউটলাইনিং -> সংজ্ঞায়িত করতে সঙ্কুচিত) সহজেই ভেঙে যেতে পারে।
jpmc26

"আপনি সেই সময়ের সাথে আর কী করতে পারতেন" -> উহম, কপি এবং পেস্ট করুন এবং খুব ছোটখাটো পোস্ট ওয়ার্ক? আমাকে প্রায় 3 সেকেন্ড সময় নেয়, যদি তা না হয়। অবশ্যই, আমি সেই সময়টির পরিবর্তে একটি সিগারেট ঘূর্ণনের জন্য প্রস্তুতির জন্য ফিল্টার টিপটি ব্যবহার করতে পারি। আসলেই কোনও প্রাসঙ্গিক বিষয় নয়। [অস্বীকৃতি: আমি আইডিয়োমেটিক সি #, পাশাপাশি
আইডোমেটিক

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

14

প্রথমে, বুঝতে হবে যে একটি খাঁটি বিমূর্ত শ্রেণি সত্যিই কেবল একটি ইন্টারফেস যা একাধিক উত্তরাধিকার করতে পারে না।

ক্লাস লিখুন, এক্সট্রাক্ট ইন্টারফেস, এটি একটি মস্তিষ্কের মৃত ক্রিয়াকলাপ। এত বেশি যে আমাদের এটির জন্য একটি চুল্লি রয়েছে। যা দুঃখজনক। এই "প্রতিটি শ্রেণি একটি ইন্টারফেস পায়" প্যাটার্ন অনুসরণ করে কেবল বিশৃঙ্খলা তৈরি হয় না এটি সম্পূর্ণভাবে পয়েন্টটি মিস করে।

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

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

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

আপনি যখন কোনও কংক্রিট বাস্তবায়নের সাথে সরাসরি ইন্টারঅ্যাকশন করার সিদ্ধান্ত নেন তখন কোনও বিমূর্ততার মাধ্যমে আপনি ভবিষ্যদ্বাণী করে থাকেন যে বাস্তবায়নটি পরিবর্তন না করার আস্থা রাখতে যথেষ্ট স্থিতিশীল।

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

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

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

সুতরাং দয়া করে কেবল কোডটি পড়তে আমাদের সহায়তা করতে বিমূর্তি লিখবেন না। আমাদের এটির জন্য সরঞ্জাম রয়েছে। ডিউপলিংয়ের কী দরকার তা ডিকুয়াল করতে বিমূর্ততা ব্যবহার করুন।


5

হ্যাঁ এটি ভয়ানক হবে কারণ (1) এটি অপ্রয়োজনীয় কোড প্রবর্তন করে (2) এটি পাঠককে বিভ্রান্ত করবে।

আপনি যদি সি # তে প্রোগ্রাম করতে চান তবে আপনার কেবল সি # পড়ার অভ্যাস করা উচিত। অন্যান্য ব্যক্তিদের দ্বারা লিখিত কোড যাইহোক এই প্যাটার্নটি অনুসরণ করবে না।


1

ইউনিট পরীক্ষা

আমি দৃ strongly়তার সাথে পরামর্শ দেব যে আপনি কোডটি ইন্টারফেস বা বিমূর্ত ক্লাসের সাথে ছড়িয়ে না দিয়ে ইউনিট টেস্টগুলি লিখুন (অন্য কারণে যেখানে সতর্কতা অবলম্বন করা হয়েছে তা বাদ দিয়ে)।

একটি ভাল লিখিত ইউনিট পরীক্ষা কেবল আপনার শ্রেণির ইন্টারফেসকে বর্ণনা করে না (যেমন একটি শিরোনাম ফাইল, বিমূর্ত শ্রেণি বা ইন্টারফেসটি করতে পারে) তবে এটি পছন্দসই কার্যকারিতাও বর্ণনা করে।

উদাহরণ: আপনি যেখানে একটি হেডার ফাইল myclass.h লিখে থাকতে পারেন:

class MyClass
{
public:
  void foo();
};

পরিবর্তে, সি # তে এভাবে পরীক্ষা লিখুন:

[TestClass]
public class MyClassTests
{
    [TestMethod]
    public void MyClass_should_have_method_Foo()
    {
        //Arrange
        var myClass = new MyClass();
        //Act
        myClass.Foo();
        //Verify
        Assert.Inconclusive("TODO: Write a more detailed test");
    }
}

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

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


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

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

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

@ বুলানকে বিদ্রূপ করার প্রয়োজনীয়তা প্রায়শই খারাপ নকশার ইঙ্গিত দেয়
দ্যাটিক্যাটহিসার

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