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


211

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

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

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

কেসগুলির মধ্যে পার্থক্য থাকতে হবে যখন টেমপ্লেটগুলি প্রকারভেদে সাধারণকরণ করতে ব্যবহৃত হয় যেখানে টেমপ্লেটগুলি নিজেরাই টেমপ্লেটের ক্রিয়াকলাপের জন্য অপ্রাসঙ্গিক (উদাহরণস্বরূপ ধারক)। একটি vector<int>সঠিক ধারণা তৈরি করে।

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

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

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

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

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

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

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

তবে, আমি আরও গভীর কারণ সন্ধান করছি কেন এসটিএলকে টেম্প্লেট করার পক্ষে শাস্ত্রীয় ওওপি ত্যাগ করেছি? (ধরে নিলাম আপনি এতদূর পড়েছেন: পি)


4
আপনি হয়ত স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 31১69 3 3৩ / দেখুন পরীক্ষা করে দেখতে পারেন । গৃহীত উত্তর হ'ল জেনেরিকের তুলনায় টেমপ্লেটগুলি আপনাকে কী প্রস্তাব দেয় তার একটি দুর্দান্ত ব্যাখ্যা।
জেমস ম্যাকমাহন

6
@ জোনাস: এটির কোনও মানে নেই। ক্যাশে প্রতিবন্ধকতার জন্য ঘড়ির চক্র ব্যয় হয়, এ কারণেই এটি গুরুত্বপূর্ণ। দিনের শেষে, এটি ঘড়ির চক্র, না ক্যাশে, যা কার্য সম্পাদনকে সংজ্ঞায়িত করে। স্মৃতি এবং ক্যাশে কেবলমাত্র এতদূর পর্যন্ত গুরুত্বপূর্ণ যেহেতু এটি ব্যয় করা ঘড়ির চক্রকে প্রভাবিত করে। তাছাড়া পরীক্ষাটিও সহজেই করা যায়। তুলনা করুন, বলুন, std :: for_Each সমতুল্য OOP / vtable পদ্ধতির সাথে একটি ফান্টার আর্গুমেন্ট সহ কল ​​করা হয়েছে। পারফরম্যান্সের পার্থক্য বিস্ময়কর । যে কারণে টেমপ্লেট সংস্করণ ব্যবহৃত হয়।
jalf

7
এবং রিডানড্যান্ট কোডটি আইচাটি পূরণ করার কোনও কারণ নেই। আমি যদি আমার প্রোগ্রামে ভেক্টর <চাপ> এবং ভেক্টর <int> ইনস্ট্যান্ট করি তবে ভেক্টর <int> প্রক্রিয়াকরণ করার সময় কেন ভেক্টর <char> কোড আইচাশে লোড করা উচিত? প্রকৃতপক্ষে, ভেক্টর <int> এর কোডটি ছাঁটাই করা হয়েছে কারণ এতে vালাই, ভিটিবেলস এবং ইন্ডায়ারেশনের জন্য কোড অন্তর্ভুক্ত নয়।
জালফ

3
অ্যালেক্স স্টেপানোভ ব্যাখ্যা করেছেন যে উত্তরাধিকার এবং সমতা কেন একসাথে ভাল খেলছে না।
ফ্রেডওভারফ্লো

6
@ বারান্দজেন্দ্রিসেক: আহ, নিকট, কিন্তু নিজে নেই। হ্যাঁ, মেমোরি ব্যান্ডউইথ এবং ক্যাশে ব্যবহারের ক্ষেত্রে আরও কোড ব্যয় হয় যদি এটি আসলে ব্যবহার করা হয় । তবে একই সাথে একটি ব্যবহার vector<int>এবং প্রত্যাশার কোনও বিশেষ কারণ নেই vector<char>। এগুলি, অবশ্যই, তবে আপনি একই সময়ে কোনও দুটি টুকরো কোড ব্যবহার করতে পারেন । টেমপ্লেট, সি ++ বা এসটিএল এর সাথে কোনও সম্পর্ক নেই। ইনস্ট্যান্টেশনে এমন কিছু নেই vector<int>যা vector<char>কোড লোড বা সম্পাদন করতে প্রয়োজন ।
জলফ

উত্তর:


607

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

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

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

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

এসটিএল জাভা যেমন সংজ্ঞায়িত করে ওওপি-র বিধি অনুসরণ না করে তবে ওওপির লক্ষ্য অর্জন করে না ? এটি পুনরায় ব্যবহারযোগ্যতা, কম সংযোজন, মডুলারিটি এবং এনক্যাপসুলেশন অর্জন করে না?

এবং এটি ওওপি-আইএফআইডি সংস্করণের চেয়ে এই লক্ষ্যগুলি আরও ভাল অর্জন করতে পারে না ?

কেন এসটিএলটিকে ভাষায় গ্রহণ করা হয়েছিল, বেশ কয়েকটি বিষয় এসটিএলকে পরিচালিত করেছিল।

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

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

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

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

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

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

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

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


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

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

5
@ আইনপোকলুম এবং একটি বিমূর্ত বেস ক্লাস থেকে আপনি ঠিক কী অর্জন করবেন? std::setউদাহরণ হিসাবে নিন । এটি একটি বিমূর্ত বেস বর্গ থেকে উত্তরাধিকারী হয় না। কীভাবে এটি আপনার ব্যবহারকে সীমাবদ্ধ করে std::set? std::setএটি একটি বিমূর্ত বেস বর্গ থেকে উত্তরাধিকারী না হওয়ায় আপনি কি করতে পারেন না এমন কিছু আছে ?
ফ্রেডওভারফ্লো

22
@ আইনপোকলুম দয়া করে স্মার্টটাক ভাষাটি দেখুন, যা অ্যালান কে ওও শব্দটি আবিষ্কার করার সময় একটি ওওপি ভাষা হিসাবে নকশাকৃত করেছিলেন। এটি ইন্টারফেস ছিল না। ওওপি ইন্টারফেস বা বিমূর্ত বেস ক্লাস সম্পর্কে নয়। আপনি বলতে যে "জাভা, যা কি মেয়াদ গলি মনের মধ্যে ছিল উদ্ভাবক সি ++ চেয়ে বেশি গলি যা মত কিছুই নেই যাচ্ছেন এছাড়াও মত কি শব্দটি গলি উদ্ভাবক মনের মধ্যে ছিল কিছু নয়"? আপনি যা বলতে চাইছেন তা হ'ল "সি ++ জাভা-মতো আমার স্বাদের জন্য যথেষ্ট নয়"। এটি ন্যায্য, তবে ওওপি-র সাথে এর কোনও যোগসূত্র নেই।
জলফ

8
@ ম্যাসনহিলার যদি এই উত্তরটি একগুচ্ছ নির্বুদ্ধি হয়ে থাকে তবে আপনি বিশ্বজুড়ে শত শত বিকাশকারীকে আক্ষরিক অর্থে দেখতে পাবেন না এটির জন্য +1 শুধুমাত্র তিন জন অন্যথায় করছেন
পান্ডা-34

88

আপনি যে সম্পর্কে জিজ্ঞাসা / অভিযোগ করছেন তার সর্বাধিক প্রত্যক্ষ উত্তর হ'ল সি ++ একটি ওওপি ভাষা হ'ল ধারণাটি একটি ভ্রান্ত অনুমান।

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

সি ++ এর ডিজাইনাররা এটিকে একটি সুবিধা হিসাবে দেখেন, তাই তারা যুক্তি দেখান যে জেনেরিক প্রোগ্রামিং যখন সমস্যাটিকে আরও ভাল সমাধান করে এবং, আরও সাধারণভাবে , আরও সাধারণভাবে , তখন একটি ধাপ পিছনে যেতে সি -++ কে খাঁটি ওওপি ভাষার মতো কাজ করতে বাধ্য করা উচিত।


4
"এবং সি ++ 0 এক্সের সাহায্যে কিছু জিনিস এমনকি কার্যক্রমে প্রোগ্রাম করা যায়" - এগুলি বৈশিষ্ট্যগুলি ছাড়াই এটিকে কার্যকরীভাবে প্রোগ্রাম করা যেতে পারে, কেবল আরও মৌখিকভাবে।
জোনাস কলকার

3
@ টাইলার প্রকৃতপক্ষে আপনি যদি সি ++ কে খাঁটি ওওপিতে সীমাবদ্ধ করেন তবে আপনাকে উদ্দেশ্য-সি এর সাথে ছেড়ে দেওয়া হবে।
জাস্টিকাল

@TylerMcHenry: শুধু জিজ্ঞাসা রয়ে এই , আমি এটি আমি শুধু আপনাকে যেমন একই উত্তর ব্যক্ত করেছি! মাত্র একটি পয়েন্ট। আমি আশা করি আপনি এই সত্যটি যুক্ত করবেন যে স্ট্যান্ডার্ড গ্রন্থাগারটি অবজেক্ট-ওরিয়েন্টড কোড লেখার জন্য ব্যবহার করা যাবে না।
einpoklum

74

আমার উপলব্ধি হ'ল স্ট্রস্ট্রুপ মূলত একটি "ওওপি-স্টাইলযুক্ত" ধারক নকশাকে পছন্দ করেছিলেন এবং বাস্তবে এটি করার কোনও অন্য উপায় দেখেনি। আলেকজান্ডার স্টেপানোভ এসটিএল-র জন্য দায়বদ্ধ এবং তাঁর লক্ষ্যগুলিতে "এটিকে উদ্দেশ্যমূলক করে তোলা" অন্তর্ভুক্ত ছিল না :

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

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

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

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

স্টেপানোভ একবার তাঁর গ্রন্থাগারটিকে স্ট্রোস্ট্রুপের কাছে উপস্থাপন করার পরে স্ট্রোস্ট্রপ এবং অন্যান্যরা একে একে সি সি ++ স্ট্যান্ডার্ডে (একই সাক্ষাত্কারে) প্রবেশের জন্য হারকিউলিয়ান প্রচেষ্টা চালিয়েছিলেন:

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


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

3
প্রোগ্রামিং সম্পর্কে একটি আকর্ষণীয় সাক্ষাত্কার যা আমি কখনও পড়েছি যদিও এটি আমাকে আরও তৃষ্ণার্ত করে দিয়েছে ...
ফেলিক্সিজ

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

1
@ সোমেগুই তারা প্রতি সেভা জাভা সম্পর্কে অভিযোগ নন। তিনি "ছোট" বা " জাভা " এর "স্ট্যান্ডার্ড" ওও প্রোগ্রামিংয়ের কথা বলছেন । সাক্ষাত্কারটি 90 এর দশকের শেষের দিকে (তিনি এসজিআইতে কাজ করার উল্লেখ করেছিলেন, যা তিনি 2000 এ টি এন্ড টি তে কাজ করার জন্য রেখে গিয়েছিলেন)। জেনারিকস কেবল 2004 এ 1.5 এর সংস্করণে জাভাতে যুক্ত হয়েছিল এবং এগুলি "স্ট্যান্ডার্ড" ওও মডেল থেকে বিচ্যুতি।
মেলপোমেন

24

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

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


চমৎকার রত্ন; আপনি কি জানেন যে এটি কোন বছর থেকে আসে?
কোস

2
@Kos অনুযায়ী web.archive.org/web/20000607205939/http://www.stlport.org/... লিঙ্ক পৃষ্ঠার প্রথম সংস্করণ 7 জুন 2001 থেকে নীচে পৃষ্ঠায় সরাসরি বলেছেন কপিরাইট 2001- 2008।
alfC

@ কোস স্টেপানভ প্রথম উত্তরে এসজিআইতে কাজ করার কথা উল্লেখ করেছেন। তিনি 2000 সালের মে মাসে এসজিআই ছেড়েছিলেন, সম্ভবতঃ সাক্ষাত্কারটি তার চেয়েও পুরনো।
মেলপোমেন

18

কোনও ডেটা স্ট্রাকচার এবং অ্যালগরিদম লাইব্রেরিতে খাঁটি ওওপি নকশা কেন ভাল হবে !? ওওপি প্রতিটি জিনিসের সমাধান নয়।

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

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

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

তথাকথিত খাঁটি ওওপি ভাষাগুলির কদর্য অনুমানগুলি লুকানোর জন্য আপনার বক্সিং এবং আনবক্সিংয়ের মতো বোকা জিনিস দরকার need

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

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


12
কি, তাজমহল ছোট এবং মার্জিত, এবং আপনার বাড়ি একটি পাহাড়ের আকার এবং সম্পূর্ণ জগাখিচুড়ি? ;)
জাল্ফ

ধারণাগুলি আর সি ++ 0x এর অংশ নয়। কিছু ত্রুটি বার্তা static_assertসম্ভবত ব্যবহার করে প্রাক-খালি করা যেতে পারে ।
কিটসুনওয়াইএমজি

জিসিসি 4.6 টেমপ্লেট ত্রুটি বার্তাগুলির উন্নতি করেছে এবং আমি বিশ্বাস করি যে এটির সাথে 4.7+ আরও ভাল।
ডেভিড স্টোন

একটি ধারণাটি অপরিহার্যভাবে "ইন্টারফেস" যা ওপি জিজ্ঞাসা করেছিল। পার্থক্যটি হ'ল কনসেপ্টের "উত্তরাধিকার" অন্তর্নিহিত (যদি কোনও শ্রেণীর সমস্ত সঠিক সদস্যের কার্য থাকে তবে এটি স্বয়ংক্রিয়ভাবে কনসেপ্টের একটি সাব টাইপ) পরিবর্তে (একটি জাভা শ্রেণিকে স্পষ্টভাবে ঘোষণা করতে হবে যে এটি একটি ইন্টারফেস প্রয়োগ করে) । যাইহোক, অন্তর্ভুক্ত এবং স্পষ্টত উভয় সাব টাইপিং বৈধ ওও এবং কিছু ওও ভাষার অন্তর্নিহিত উত্তরাধিকার রয়েছে যা ধারণার মতো কাজ করে। সুতরাং এখানে যা বলা হচ্ছে তা হ'ল মূলত "OO sucks: টেমপ্লেট ব্যবহার করুন temp
কিছু

11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


সুস্পষ্টভাবে ঘোষিত ইন্টারফেসে, দুটি শব্দ: ক্লাস টাইপ করুন। (যা ইতিমধ্যে স্টেপানোভ "ধারণা" দ্বারা বোঝায়))
পাইয়ন

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

সত্য, আমি "বৈধ" শব্দটি সহ দ্রুত এবং আলগা খেলছিলাম। আমি কেবল বোঝাতে চেয়েছিলাম যে যদি সংকলক প্রয়োজনীয় এক্সপ্রেশনগুলির মধ্যে একটি সঙ্কলন করতে না পারে, তবে এটি কিছু রিপোর্ট করবে।
স্টিভ জেসোপ

8

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

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


7

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

শুধু অন্য রেফারেন্স সরবরাহ করতে:

আল স্টিভেনস সাক্ষাত্কার অ্যালেক্স স্টেপানভ, মার্চ 1995 সালে ডিডিজে:

স্টেপানোভ তার কাজের অভিজ্ঞতা এবং অ্যালগরিদমের একটি বৃহত গ্রন্থাগারের দিকে তৈরি পছন্দ ব্যাখ্যা করেছিলেন যা শেষ পর্যন্ত এসটিএলে রূপান্তরিত হয়েছিল।

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

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

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


5

সঙ্গে মূল সমস্যা

void MyFunc(ForwardIterator *I);

পুনরুদ্ধারকারী যে জিনিসটি ফেরত দেবে তার প্রকারটি আপনি কীভাবে নিরাপদে পাবেন? টেমপ্লেটগুলি সহ, এটি আপনার জন্য সংকলনের সময় করা হয়।


1
ভাল, আমি হয়: 1. এটি পাওয়ার চেষ্টা করবেন না, যেহেতু আমি জেনেরিক কোড লিখছি। অথবা, ২. এই দিনগুলিতে সি ++ যে কোনও প্রতিবিম্ব প্রক্রিয়াটি ব্যবহার করে এটি ব্যবহার করুন।
einpoklum

2

এক মুহুর্তের জন্য আসুন আমরা স্ট্যান্ডার্ড লাইব্রেরিটিকে মূলত সংগ্রহ এবং অ্যালগরিদমের একটি ডাটাবেস হিসাবে ভাবি।

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

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

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

উভয় শ্রেণিবদ্ধ মডেল এবং নেটওয়ার্ক মডেল ডাটাবেসগুলি বেশিরভাগ সাধারণ উদ্দেশ্য ব্যবহার থেকে ম্লান হয়ে গেছে (যদিও কয়েকটি মোটামুটি নির্দিষ্ট কুলুঙ্গিতে রয়ে গেছে)। বেশিরভাগ উদ্দেশ্যে, সেগুলি সম্পর্কিত ডেটাবেস দ্বারা প্রতিস্থাপিত হয়েছে।

রিলেশনাল ডাটাবেসগুলি গ্রহণ করার বেশিরভাগ কারণ ছিল বহুমুখিতা। রিলেশনাল মডেলটি কার্যত নেটওয়ার্ক মডেলের একটি সুপারসেট (যা ঘুরে ফিরে, শ্রেণিবিন্যাসের মডেলটির একটি সুপারসেট)।

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

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

যাই হোক না কেন, আমি মনে করি এটিই সর্বাধিক আসল কারণ C ++ এর ধারকগুলির জন্য উত্তরাধিকার ব্যবহার করে না - এটি করার কোনও আসল কারণ নেই, কারণ উত্তরাধিকার কেবলমাত্র টেমপ্লেটগুলি সরবরাহ করে এমন ক্ষমতাগুলির একটি উপসেট সরবরাহ করে। যেহেতু কিছু ক্ষেত্রে টেমপ্লেটগুলি একটি প্রয়োজনীয়তা তাই সেগুলি প্রায় সর্বত্র ব্যবহৃত হতে পারে।


0

আপনি কীভাবে ফরোয়ার্ডআইট্রেটারের সাথে তুলনা করবেন? এটি হ'ল আপনি কীভাবে যাচাই করবেন যে আপনার কাছে থাকা আইটেমটি আপনি যা খুঁজছেন তা বা আপনি এটি পাস করেছেন?

বেশিরভাগ সময়, আমি এই জাতীয় কিছু ব্যবহার করতাম:

void MyFunc(ForwardIterator<MyType>& i)

যার অর্থ আমি জানি যে আমি মাইটাইপগুলির প্রতি ইঙ্গিত করছি এবং আমি কীভাবে এটিগুলির তুলনা করতে জানি। এটি দেখতে কোনও টেমপ্লেটের মতো হলেও এটি সত্যই (কোনও "টেম্পলেট" কীওয়ার্ড নয়)।


আপনি কেবল এই টাইপের <,> এবং = অপারেটরগুলি ব্যবহার করতে পারেন এবং সেগুলি কী তা জানেন না (যদিও এটি আপনি বোঝাতে চেয়েছিলেন তা নাও হতে পারে)
লাহ্নে

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

0

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

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

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;});

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

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

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()()এবং এর রিটার্নের ধরণের জন্য আমাদের কয়েকটি গাণিতিক অপারেটর ব্যবহার করতে সক্ষম হতে হবে। সুতরাং, সি ++ অপারেটর ওভারলোডিং না থাকলে এই ক্ষেত্রে টেম্পলেট যন্ত্রপাতিটি ভেঙে যাবে।


-1

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

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


সম্মত হয়েছেন যে ইন্টারফেসগুলি কেবল ওও নয়। তবে টাইপ সিস্টেমে ক্ষমতা বহুমুখিতা (এটি 60 এর দশকে সিমুলায় ছিল)। মডিউল ইন্টারফেসগুলি মডিউলা -2 এবং অ্যাডায় বিদ্যমান ছিল, তবে এগুলি টাইপ সিস্টেমে অন্যভাবে চালিত হয় বলে আমি মনে করি।
andygavin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.