c++ - উনল - সি++ বই




সি++ এসটিএল কেন এত টেমপ্লেট উপর ভিত্তি করে?(এবং*ইন্টারফেস*নয়) (9)

templated ধরনের একটি "ধারণা" অনুসরণ করা হয় (ইনপুট Iterator, ফরওয়ার্ড Iterator, ইত্যাদি ...) যেখানে ধারণা প্রকৃত বিবরণ সম্পূর্ণরূপে টেমপ্লেট ফাংশন / বর্গ বাস্তবায়ন দ্বারা নির্ধারিত হয়, এবং ধরনের শ্রেণীর দ্বারা টেমপ্লেট সঙ্গে ব্যবহৃত, যা কিছুটা OOP এর বিরোধী-ব্যবহার।

আমি মনে করি আপনি টেমপ্লেট দ্বারা ধারণার উদ্দেশ্যে ব্যবহার ভুল বুঝেছেন। ফরওয়ার্ড Iterator, উদাহরণস্বরূপ, একটি খুব ভাল সংজ্ঞায়িত ধারণা। কোনও শ্রেণীকে ফরওয়ার্ড ইটারেটর হিসাবে এবং কোনও কম্পিউটেশনাল জটিলতা সহ তাদের সেম্পান্তিক্সের জন্য কার্যকর হওয়া উচিত এমন এক্সপ্রেশনগুলি সন্ধান করার জন্য আপনি স্ট্যান্ডার্ডটি দেখুন অথবা http://www.sgi.com/tech/stl/ForwardIterator.htmlhttp://www.sgi.com/tech/stl/ForwardIterator.html (আপনাকে এটি দেখতে ইনপুট, আউটপুট এবং ট্রিভিয়াল ইটারেটারের লিঙ্কগুলি অনুসরণ করতে হবে)।

যে নথির একটি পুরোপুরি ভাল ইন্টারফেস, এবং "ধারণা প্রকৃত বিবরণ" ঠিক সেখানে সংজ্ঞায়িত করা হয়। তারা ফরোয়ার্ড ইটারেটরগুলির বাস্তবায়নের দ্বারা সংজ্ঞায়িত করা হয় না, এবং তারা এওরগরিদম দ্বারা সংজ্ঞায়িত নয় যা ফরওয়ার্ড Iterators ব্যবহার করে।

এসটিএল এবং জাভা মধ্যে ইন্টারফেস পরিচালনা করা হয় কিভাবে পার্থক্য তিনগুণ হয়:

1) এসটিএল বস্তু ব্যবহার করে বৈধ অভিব্যক্তি সংজ্ঞায়িত করে, জাভা এমন পদ্ধতিগুলি সংজ্ঞায়িত করে যা বস্তুর উপর কলযোগ্য হতে হবে। অবশ্যই একটি বৈধ অভিব্যক্তি একটি পদ্ধতি (সদস্য ফাংশন) কল হতে পারে, কিন্তু এটি হতে হবে না।

2) জাভা ইন্টারফেস রানটাইম বস্তু, আর এসটিএল ধারণার RTTI সঙ্গে এমনকি রানটাইম দৃশ্যমান হয় না।

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

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

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

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

আপনি ফাংশনটি বলতে পারেন ... শুধুমাত্র তার সংজ্ঞাটি দেখে একটি ফরোয়ার্ড ইটারেটরকে প্রত্যাশা করে, যেখানে আপনাকে বাস্তবায়ন বা ডকুমেন্টেশনের দিকে নজর দিতে হবে ...

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

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

এখানে স্পষ্টভাবে ঘোষিত ইন্টারফেসে Bjarne: http://www.artima.com/cppsource/cpp0xP.html

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

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

মানে, তার বাধ্যতামূলক নাম (স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি) থেকে দূরে ...

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

এবং তারপর টেমপ্লেট এসটিএল বরাবর, খেলার মধ্যে এসেছিলেন। এসটিএল ক্লাসিক্যাল ওওপি ধারণাগুলি গ্রহণ করে এবং টেমপ্লেটগুলি ব্যবহার করে ড্রেনের নিচে ফ্লাশ করলো।

যখন টেমপ্লেটগুলির ধরনগুলি টেমপ্লেটটির অপারেশনগুলির জন্য অপ্রাসঙ্গিক (উদাহরণস্বরূপ, পাত্রে) -এর জন্য অপ্রাসঙ্গিক হয় তখন টেমপ্লেটগুলিকে সাধারণকরণের জন্য ব্যবহার করা হয় এমন ক্ষেত্রেগুলির মধ্যে একটি পার্থক্য হওয়া উচিত। একটি vector<int> থাকার vector<int> নিখুঁত জ্ঞান করে তোলে।

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

উদাহরণস্বরূপ, আপনি ফাংশন বলতে পারেন:

void MyFunc(ForwardIterator<...> *I);

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

শুধুমাত্র তার সংজ্ঞাটি দেখে একটি ফরওয়ার্ড ইটারেটর আশা করে, যেখানে আপনি এর জন্য বাস্তবায়ন বা ডকুমেন্টেশনটি দেখতে চাইছেন:

template <typename Type> void MyFunc(Type *I);

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

তবে, আমি আরো গভীরতম কারণ খুঁজছি কেন এসটিএলের জন্য templating পক্ষে শাস্ত্রীয় OOP পরিত্যাগ? (আপনি যে পর্যন্ত পড়া অনুমান: পি)


"আমার কাছে OOP মানে কেবল বার্তা প্রেরণ, স্থানীয় সংরক্ষণ এবং সুরক্ষা এবং রাষ্ট্রীয় প্রক্রিয়ার গোপনতা, এবং সবকিছুর চরম দেরী-বন্ধন। এটি ছোট্টকোলে এবং এলআইএসপি-তে সম্পন্ন করা যেতে পারে। সম্ভবত অন্যান্য পদ্ধতিতে এটি সম্ভব, তবে আমি তাদের সম্পর্কে সচেতন নই। " - অ্যালান কে, স্মলটকের নির্মাতা।

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


আমার মনে হয় যে আপনি যা জিজ্ঞাসা করছেন তার সম্পর্কে সর্বাধিক প্রত্যক্ষ উত্তর হল: সি ++ একটি OOP ভাষা যা একটি অনুমান মিথ্যা ধারণা।

সি ++ একটি মাল্টি-প্যারাডিজম ভাষা। এটি OOP নীতিগুলি ব্যবহার করে প্রোগ্রাম করা যেতে পারে, এটি কার্যকরীভাবে প্রোগ্রাম করা যেতে পারে, এটি সাধারণভাবে (টেমপ্লেট) প্রোগ্রাম করা যেতে পারে এবং সি ++ 11 (পূর্বে C ++ 0x হিসাবে পরিচিত) কিছু জিনিস কার্যকরীভাবে প্রোগ্রাম করা যেতে পারে।

সি ++ এর ডিজাইনাররা এটি একটি সুবিধা হিসাবে দেখে, তাই তারা যুক্তি দেয় যে C ++ কে সম্পূর্ণরূপে OOP ভাষা হিসাবে কাজ করার সময় জেনারিক প্রোগ্রামিং সমস্যাটির সমাধান করে এবং আরও সাধারণভাবে , একটি পদক্ষেপ পিছনে দিকে যাবে।


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

টেমপ্লেটগুলির আরেকটি আকর্ষণীয় বিষয় হল তারা রানটাইম পলিমোফিজমের জন্যও ব্যবহার করতে পারে। উদাহরণ স্বরূপ

template<class Value,class T>
Value euler_fwd(size_t N,double t_0,double t_end,Value y_0,const T& func)
    {
    auto dt=(t_end-t_0)/N;
    for(size_t k=0;k<N;++k)
        {y_0+=func(t_0 + k*dt,y_0)*dt;}
    return y_0;
    }

লক্ষ্য করুন যে, এই ফাংশন যদি কাজ করবে Valueকিছু ধরনের একটি ভেক্টর (হয় না std :: ভেক্টর, যা বলা উচিত std::dynamic_arrayদ্বিধা এড়াতে আপনি)

যদি funcছোট হয়, এই ফাংশন ইনলাইনিং থেকে অনেক লাভ হবে। উদাহরণ ব্যবহার

auto result=euler_fwd(10000,0.0,1.0,1.0,[](double x,double y)
    {return y;});

এই ক্ষেত্রে, আপনাকে সঠিক উত্তরটি জানতে হবে (2.718 ...), তবে প্রাথমিক সমাধান ছাড়াই একটি সহজ ওডিআই গঠন করা সহজ (ইঙ্গিত: y মধ্যে একটি বহুবচন ব্যবহার করুন)।

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

class OdeFunction
    {
    public:
        virtual double operator()(double t,double y) const=0;
    };

template
double euler_fwd(size_t N,double t_0,double t_end,double y_0,const OdeFunction& func);

কিন্তু উপরের তাত্ক্ষণিকতা শুধুমাত্র জন্য কাজ করে double, কেন ইন্টারফেস টেমপ্লেট লিখুন না:

template<class Value=double>
class OdeFunction
    {
    public:
        virtual Value operator()(double t,const Value& y) const=0;
    };

এবং কিছু সাধারণ মান ধরনের জন্য বিশেষজ্ঞ:

template double euler_fwd(size_t N,double t_0,double t_end,double y_0,const OdeFunction<double>& func);

template vec4_t<double> euler_fwd(size_t N,double t_0,double t_end,vec4_t<double> y_0,const OdeFunction< vec4_t<double> >& func); // (Native AVX vector with four components)

template vec8_t<float> euler_fwd(size_t N,double t_0,double t_end,vec8_t<float> y_0,const OdeFunction< vec8_t<float> >& func); // (Native AVX vector with 8 components)

template Vector<double> euler_fwd(size_t N,double t_0,double t_end,Vector<double> y_0,const OdeFunction< Vector<double> >& func); // (A N-dimensional real vector, *not* `std::vector`, see above)

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


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

শুধু আরেকটি রেফারেন্স প্রদান:

অ্যাল স্টিভেনস ইন্টারভিউ অ্যালেক্স স্টেপানোভ, 1995 সালের ডিসেম্বরে ডিডিজে:

স্টেপানোভ তার কাজ অভিজ্ঞতা এবং পছন্দসই অ্যালগরিদম একটি বড় লাইব্রেরি প্রতি আকৃতির ব্যাখ্যা, যা অবশেষে STL মধ্যে বিকশিত।

জেনেরিক প্রোগ্রামিং আপনার দীর্ঘমেয়াদী সুদ সম্পর্কে কিছু বলুন

..... তখন আমাকে বেল ল্যাবরেটরিজগুলিতে সি ++ গোষ্ঠীতে সি ++ লাইব্রেরিগুলিতে কাজ করার প্রস্তাব দেওয়া হয়েছিল। তারা আমাকে জিজ্ঞেস করলো আমি সি ++ এ কি করতে পারব। অবশ্যই, আমি সি ++ জানি না, অবশ্যই, আমি বললাম আমি পারব। কিন্তু আমি C ++ এ এটি করতে পারিনি, কারণ 1987 সি ++ তে টেমপ্লেটগুলি ছিল না, যা প্রোগ্রামিংয়ের এই শৈলীটি সক্ষম করার জন্য প্রয়োজনীয়। বংশবৃদ্ধি জেনেরিকতা অর্জনের একমাত্র পদ্ধতি ছিল এবং এটি যথেষ্ট ছিল না।

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


এসটিএলের লেখক স্টেপানোভের সাথে এই সাক্ষাত্কারে উত্তর পাওয়া যায়:

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


কেন একটি বিশুদ্ধ OOP নকশা একটি তথ্য কাঠামো এবং অ্যালগরিদম লাইব্রেরি ভাল হবে? OOP প্রতিটি জিনিস জন্য সমাধান নয়।

IMHO, এসটিএল আমি কখনও দেখা সবচেয়ে মার্জিত লাইব্রেরি :)

আপনার প্রশ্নের জন্য,

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

তথাকথিত বিশুদ্ধ ওওপি ভাষার কদর্য অনুমান গোপন করার জন্য আপনাকে বক্সিং এবং আনবক্সিংয়ের মত মূঢ় জিনিস প্রয়োজন।

একমাত্র সমস্যা যা আমি STL এর সাথে দেখি, এবং সাধারণভাবে টেমপ্লেটগুলি ভয়ানক ত্রুটির বার্তা। যা C ++ 0X এ ধারণাগুলি ব্যবহার করে সমাধান করা হবে।

জাভাতে এসএলএল সংগ্রহের সাথে তুলনা করা হচ্ছে আমার বাড়ির কাছে তাজমহলের তুলনা করা :)


সংক্ষিপ্ত উত্তর "কারণ সি ++ চলে গেছে"। হ্যাঁ, 70 এর দশকের শেষভাগে, স্ট্রাউস্ট্রুপটি OOP ক্ষমতাগুলির সাথে একটি আপগ্রেড সি তৈরি করতে চেয়েছিল, কিন্তু এটি অনেক আগে থেকেই। 1998 সালে ভাষাটি মানসম্মত করা হয়েছিল, এটি আরএওপি ভাষা ছিল না। এটি একটি বহুমুখী ভাষা ছিল। এটি অবশ্যই OOP কোডের জন্য কিছু সমর্থন ছিল, তবে এটি একটি সুরক্ষিত-সম্পূর্ণ টেমপ্লেট ভাষাও জুড়ে ছিল, এটি কম্পাইল-সময় মেটাপোগ্রামিংয়ের অনুমতি দেয় এবং লোকেরা জেনেরিক প্রোগ্রামিং আবিষ্কার করে। হঠাৎ, OOP ঠিক যে সব গুরুত্বপূর্ণ মনে হয় না। আমরা টেমপ্লেট এবং জেনেরিক প্রোগ্রামিং মাধ্যমে উপলব্ধ কৌশল ব্যবহার করে সহজ, আরো সংক্ষিপ্ত এবং আরো দক্ষ কোড লিখতে পারেন না যখন।

OOP পবিত্র grail হয় না। এটি একটি চতুর ধারণা, এবং এটি উদ্ভাবিত হয়েছিল যখন এটি 70 এর মধ্যে প্রক্রিয়াগত ভাষাগুলির বেশিরভাগ উন্নতি ছিল। কিন্তু এটা সৎভাবে না সব এটি আপ cracked হয়। অনেক ক্ষেত্রে এটি বেদনাপূর্ণ এবং verbose হয় এবং এটি সত্যিই পুনর্ব্যবহারযোগ্য কোড বা মডুলার উন্নীত করা হয় না।

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

একটি কল্পিত "OOP-ified" STL এর নির্ভরতা গ্রাফ অঙ্কন করার চেষ্টা করুন। কতজন ক্লাস প্রতিটি অন্যদের সম্পর্কে জানতে হবে? নির্ভরতা অনেক হতে হবে। আপনি কি কেবল vector হেডার অন্তর্ভুক্ত করতে সক্ষম হবেন না, এমনকি iostream বা এমনকি iostream টেনে আনতে পারবেন না? এসটিএল এই সহজ করে তোলে। একটি ভেক্টর এটি সংজ্ঞায়িত ইথারেটর টাইপ সম্পর্কে জানে, এবং যে সব। এসটিএল অ্যালগরিদম কিছুই জানেন না । তারা এটারারেটরের হেডার অন্তর্ভুক্ত করারও দরকার নেই, যদিও তারা সবাই এটিরেটরকে পরামিতি হিসাবে গ্রহণ করে। তারপর আরও মডুলার যা?

এসএলএল জাভা হিসাবে এটি OOP এর নিয়ম অনুসরণ করতে পারে না, কিন্তু এটি OOP লক্ষ্য অর্জন না? এটা পুনঃব্যবহারযোগ্যতা, কম সংযোগ, মডুলারতা এবং encapsulation অর্জন না?

এবং এটি একটি OOP-perceived সংস্করণ চেয়ে ভাল এই লক্ষ্য অর্জন না?

কেন এসটিএল ভাষাতে গৃহীত হয়েছিল, তাই অনেক কিছু ঘটে যা এসটিএল-এর দিকে পরিচালিত করেছিল।

প্রথম, টেমপ্লেট সি ++ যোগ করা হয়েছে। জেনেটিক্সটি .NET এ যুক্ত করা হয়েছে এমন একই কারণে যুক্ত করা হয়েছে। টাইপ নিরাপত্তাকে নিক্ষেপ না করেই "টাইপ T এর কন্টেইনার্স" মতো স্টাফ লিখতে সক্ষম হওয়া ভালো ধারণা ছিল। অবশ্যই, বাস্তবায়ন তারা বাস্তবায়ন অনেক জটিল এবং শক্তিশালী ছিল।

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

তিনি সি ++ ভাষা কমিটির কাছে উপস্থাপন করেছিলেন, যিনি এটি ব্যবহার করার জন্য বেশ কিছু সময় নেন, কারণ এটি এত অদ্ভুত এবং ভিন্ন ছিল, কিন্তু অবশেষে বুঝতে পারল যে এটি ঐতিহ্যগত OOP সমতুল্যগুলির তুলনায় ভাল কাজ করেছে যা তারা অন্যথায় অন্তর্ভুক্ত করতে হবে । তাই তারা এটির কিছু সামঞ্জস্য তৈরি করে এবং এটি স্ট্যান্ডার্ড লাইব্রেরিতে গ্রহণ করে।

এটি একটি মতাদর্শিক পছন্দ ছিল না, এটি একটি রাজনৈতিক পছন্দ ছিল না "আমরা কি ওওপি হতে চাই না", কিন্তু একটি খুব বাস্তবিক। তারা লাইব্রেরি মূল্যায়ন, এবং দেখেছি যে এটি খুব ভাল কাজ করে।

কোন ক্ষেত্রে, আপনি STL পক্ষে পক্ষে উল্লেখ করা উভয় কারণে একেবারে অপরিহার্য।

সি ++ স্ট্যান্ডার্ড লাইব্রেরি দক্ষ হতে হবে। যদি এটি সমতুল্য হাত-ঘূর্ণিত সি কোডের চেয়ে কম কার্যকর বলে তবে লোকেরা এটি ব্যবহার করবে না। যে উত্পাদনশীলতা হ্রাস করা হবে, বাগ সম্ভাবনা বৃদ্ধি, এবং সামগ্রিক শুধু একটি খারাপ ধারণা হতে।

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

আপনার প্রশ্নের একটি দৃঢ় ধারণা আছে যে ওওপি "সর্বোত্তম"। আমি কেন শুনতে আগ্রহী। আপনি জিজ্ঞাসা কেন তারা "ক্লাসিকাল OOP পরিত্যক্ত"। আমি এটা নিয়ে আটকে থাকা উচিত কেন ভাবছি। এটা কোন সুবিধা ছিল?


ইন্টারফেস থেকে ইন্টারফেস আলাদা করার এবং বাস্তবায়ন স্বেচ্ছায় সক্ষম হওয়ার ধারণাটি বস্তু-ভিত্তিক প্রোগ্রামিংয়ের অন্তর্নিহিত নয়। আমি বিশ্বাস করি এটি একটি ধারণা যা কম্পোনেন্ট-ভিত্তিক ডেভেলপমেন্টে মাইক্রোসফ্ট COM এর মতো হ্যাক করেছিল। ( কম্পোনেন্ট-চালিত উন্নয়ন কি আমার উত্তর দেখুন ?) বেড়ে উঠছে এবং C ++ শিখছে, মানুষ উত্তরাধিকার এবং পলিমারফিজমকে হিপ করেছে। 9 0 এরও বেশি মানুষ "প্রোগ্রাম টু এ ইন্টারফেস" বলতে শুরু করে না, একটি 'বাস্তবায়ন' নয় এবং 'পক্ষান্তরণ' বস্তুর রচনা 'শ্রেণিবদ্ধ উত্তরাধিকারী' নয়। " (যা উভয় দ্বারা GoF থেকে উদ্ধৃত)।

তারপর জাভা বিল্ট ইন আবর্জনা সংগ্রাহক এবং interfaceকীওয়ার্ড বরাবর এসেছিল , এবং হঠাৎ এটি ইন্টারফেস এবং বাস্তবায়ন পৃথক করার জন্য ব্যবহারিক হয়ে ওঠে। আপনি এটি জানেন আগে ধারণা OO অংশ হয়ে ওঠে। সি ++, টেমপ্লেট, এবং এসটিএল এই সব পূর্বাভাস।







stl