Modern C++ Design
মডার্ন সি + + ডিজাইনঃ জেনেরিক প্রোগ্রামিং অ্যান্ড ডিজাইন প্যাটার্নস অ্যাপ্লায়েড হল আন্দ্রেই আলেকজান্দ্রেস্কু রচিত একটি বই, যা 2001 সালে অ্যাডিসন-ওয়েসলি দ্বারা প্রকাশিত হয়। স্কট মেয়ার্স এটিকে "সবচেয়ে গুরুত্বপূর্ণ সি + + বইগুলির মধ্যে একটি" হিসাবে বিবেচনা করেছেন। বইটি টেমপ্লেট মেটাপ্রোগ্রামিং নামে একটি সি + + প্রোগ্রামিং কৌশল ব্যবহার করে এবং অন্বেষণ করে। আলেকজান্দ্রেস্কু এই কৌশলটি উদ্ভাবন না করলেও তিনি প্রোগ্রামারদের মধ্যে এটি জনপ্রিয় করে তুলেছেন। তাঁর বইয়ে ব্যবহারিক সমস্যাগুলির সমাধান রয়েছে যা সি + + প্রোগ্রামাররা সম্মুখীন হতে পারে। বইটির বেশ কয়েকটি বাক্যাংশ এখন সি + + সম্প্রদায়ের মধ্যে সাধারণ শব্দ হিসাবে ব্যবহৃত হয়ঃ আধুনিক সি + + (সি/সি + + শৈলীর বিপরীতে), নীতি-ভিত্তিক নকশা এবং টাইপলিস্ট। বইটিতে বর্ণিত সমস্ত কোড তাঁর গ্রন্থাগার লোকিতে বিনামূল্যে পাওয়া যায়। বইটি 2001 সাল থেকে বেশ কয়েকটি ভাষায় পুনরায় প্রকাশিত এবং অনুবাদ করা হয়েছে। নীতি-ভিত্তিক নকশা নীতি-ভিত্তিক নকশা, যা নীতি-ভিত্তিক শ্রেণী নকশা বা নীতি-ভিত্তিক প্রোগ্রামিং নামেও পরিচিত, হল আধুনিক সি + + ডিজাইনে ব্যবহৃত শব্দ যা সি + + এর জন্য একটি প্রবাদের উপর ভিত্তি করে নকশা পদ্ধতির জন্য ব্যবহৃত হয় যা নীতি হিসাবে পরিচিত। এটি কৌশলগত প্যাটার্নের একটি সংকলন-সময় বৈকল্পিক হিসাবে বর্ণনা করা হয়েছে, এবং সি + + টেমপ্লেট মেটাপ্রোগ্রামিংয়ের সাথে সংযোগ রয়েছে। এটি প্রথম সি + +-এ আধুনিক সি + + ডিজাইনের সাথে এবং সি/সি + + ব্যবহারকারীদের জার্নালে তার কলাম জেনেরিক <প্রোগ্রামিং> দিয়ে আন্দ্রেই আলেকজান্দ্রেস্কু দ্বারা জনপ্রিয় করা হয়েছিল এবং এটি বর্তমানে সি + + এবং ডি-এর সাথে ঘনিষ্ঠভাবে যুক্ত কারণ এটির জন্য টেমপ্লেটগুলির জন্য অত্যন্ত শক্তিশালী সমর্থন সহ একটি সংকলক প্রয়োজন, যা প্রায় 2003 সালের আগে প্রচলিত ছিল না। প্যারামিটারাইজড জেনেরিক কোডের উপর ভিত্তি করে এই নকশা পদ্ধতির পূর্ববর্তী উদাহরণগুলির মধ্যে রয়েছে এমএল ভাষার প্যারামেট্রিক মডিউল (ফাংক্টর) এবং মেমরি ম্যানেজমেন্ট নীতির জন্য সি + + বরাদ্দকারী। নীতি-ভিত্তিক নকশায় কেন্দ্রীয় প্রবাদটি হল একটি শ্রেণী টেমপ্লেট (যাকে হোস্ট ক্লাস বলা হয়), যা ইনপুট হিসাবে বিভিন্ন ধরনের পরামিতি গ্রহণ করে, যা ব্যবহারকারীর দ্বারা নির্বাচিত প্রকারের (যাকে পলিসি ক্লাস বলা হয়) সঙ্গে তাত্ক্ষণিকভাবে সংযুক্ত করা হয়, প্রতিটি একটি নির্দিষ্ট অন্তর্নিহিত ইন্টারফেস (যাকে নীতি বলা হয়) প্রয়োগ করে এবং তাত্ক্ষণিক হোস্ট ক্লাসের আচরণের কিছু অর্থোগোনাল (বা বেশিরভাগ অর্থোগোনাল) দিককে অন্তর্ভুক্ত করে। প্রতিটি নীতির জন্য বিভিন্ন, টিনজাত বাস্তবায়নের একটি সেটের সাথে মিলিত একটি হোস্ট ক্লাস সরবরাহ করে, একটি লাইব্রেরি বা মডিউল বিভিন্ন আচরণ সংমিশ্রণের একটি সূচকীয় সংখ্যাকে সমর্থন করতে পারে, যা সংকলনের সময় সমাধান করা হয় এবং হোস্ট ক্লাস টেমপ্লেটের তাৎক্ষণিকভাবে বিভিন্ন সরবরাহকৃত নীতি ক্লাসগুলিকে মিশ্রিত ও মেলানো দ্বারা নির্বাচিত করা হয়। উপরন্তু, একটি প্রদত্ত নীতির একটি কাস্টম বাস্তবায়ন লিখে, একটি নীতি-ভিত্তিক গ্রন্থাগার এমন পরিস্থিতিতে ব্যবহার করা যেতে পারে যেখানে গ্রন্থাগার প্রয়োগকারীর দ্বারা অপ্রত্যাশিত আচরণের প্রয়োজন হয়। এমনকি এমন ক্ষেত্রেও যেখানে প্রতিটি নীতির একাধিক বাস্তবায়ন কখনও ব্যবহার করা হবে না, একটি শ্রেণীকে নীতিতে বিভক্ত করা নকশা প্রক্রিয়াকে সহায়তা করতে পারে, মডুলারিটি বৃদ্ধি করে এবং ঠিক কোথায় অর্থোগোনাল ডিজাইনের সিদ্ধান্ত নেওয়া হয়েছে তা হাইলাইট করে। বিনিময়যোগ্য মডিউল থেকে সফ্টওয়্যার উপাদানগুলি একত্রিত করা নতুন ধারণা থেকে অনেক দূরে, নীতি-ভিত্তিক নকশা একটি পৃথক শ্রেণীর আচরণ সংজ্ঞায়িত করার (তুলনামূলকভাবে নিম্ন) স্তরে সেই ধারণাটি প্রয়োগ করার পদ্ধতিতে একটি উদ্ভাবনের প্রতিনিধিত্ব করে। পলিসি ক্লাসগুলির কলব্যাকের সাথে কিছু মিল রয়েছে, তবে এর মধ্যে পার্থক্য রয়েছে, একটি একক ফাংশন নিয়ে গঠিত হওয়ার পরিবর্তে, একটি পলিসি ক্লাসে সাধারণত বেশ কয়েকটি সম্পর্কিত ফাংশন (পদ্ধতি) থাকে, যা প্রায়শই স্টেট ভেরিয়েবল বা নেস্টেড প্রকারের মতো অন্যান্য সুবিধার সাথে মিলিত হয়। একটি নীতি-ভিত্তিক হোস্ট ক্লাসকে এক ধরনের মেটাফাংশান হিসাবে ভাবা যেতে পারে, যা ইনপুট হিসাবে প্রকার দ্বারা প্রতিনিধিত্ব করা আচরণের একটি সেট গ্রহণ করে এবং আউটপুট হিসাবে এমন একটি প্রকারের প্রত্যাবর্তন করে যা সেই আচরণগুলিকে একটি কার্যকরী সামগ্রিকভাবে একত্রিত করার ফলাফলের প্রতিনিধিত্ব করে। (এম. পি. এল মেটাফাংশনের বিপরীতে, আউটপুট সাধারণত একটি নেস্টেড আউটপুট প্রকারের পরিবর্তে ইনস্ট্যান্টিয়েটেড হোস্ট শ্রেণী দ্বারা প্রতিনিধিত্ব করা হয়।) নীতির প্রবাদের একটি মূল বৈশিষ্ট্য হল, সাধারণত (যদিও এটি কঠোরভাবে প্রয়োজনীয় নয়), আয়োজক শ্রেণী তার প্রতিটি নীতি শ্রেণী থেকে (পাবলিক) একাধিক উত্তরাধিকার ব্যবহার করে (নিজেকে একটি শিশু শ্রেণীতে পরিণত করবে)। (বিকল্পগুলি হল হোস্ট শ্রেণীর জন্য প্রতিটি পলিসি ক্লাসের ধরনের একটি সদস্য পরিবর্তনশীল অন্তর্ভুক্ত করা, অথবা অন্যথায় ব্যক্তিগতভাবে পলিসি ক্লাসের উত্তরাধিকারী হওয়া; তবে পলিসি ক্লাসগুলি প্রকাশ্যে উত্তরাধিকার সূত্রে পাওয়ার প্রধান সুবিধা হল যে একটি পলিসি ক্লাস নতুন পদ্ধতি যুক্ত করতে পারে, যা তাৎক্ষণিক হোস্ট ক্লাস দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত এবং তার ব্যবহারকারীদের কাছে অ্যাক্সেসযোগ্য, যা হোস্ট ক্লাসের নিজেরও জানার দরকার নেই।) নীতির প্রবাদের এই দিকটির একটি উল্লেখযোগ্য বৈশিষ্ট্য হল যে, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে সম্পর্কিত নীতিগুলি বেস ক্লাস এবং ডিরাইভড ক্লাসের মধ্যে সম্পর্ককে বিপরীত করে-যেখানে ওওপি ইন্টারফেসে ঐতিহ্যগতভাবে (বিমূর্ত) বেস ক্লাস এবং ইন্টারফেসের বাস্তবায়ন দ্বারা প্রতিনিধিত্ব করা হয় ডিরাইভড ক্লাস দ্বারা, নীতি-ভিত্তিক ডিজাইনে ডিরাইভড (হোস্ট) ক্লাস ইন্টারফেসের প্রতিনিধিত্ব করে এবং বেস (নীতি) ক্লাসগুলি সেগুলি প্রয়োগ করে। নীতির ক্ষেত্রে, সরকারি উত্তরাধিকার আয়োজক এবং নীতিনির্ধারণী শ্রেণীর মধ্যে একটি সম্পর্ককে উপস্থাপন করে না। যদিও এটি ঐতিহ্যগতভাবে ওওপি প্রসঙ্গে একটি নকশা ত্রুটির প্রমাণ হিসাবে বিবেচিত হবে, এটি নীতির প্রবাদের প্রসঙ্গে প্রযোজ্য নয়। তাদের বর্তমান অবতারে নীতিগুলির একটি অসুবিধা হ 'ল নীতি ইন্টারফেসের কোডে সরাসরি, স্পষ্ট উপস্থাপনা নেই, বরং হাঁস টাইপিংয়ের মাধ্যমে অন্তর্নিহিতভাবে সংজ্ঞায়িত করা হয় এবং মন্তব্যে আলাদাভাবে এবং ম্যানুয়ালি নথিভুক্ত করা আবশ্যক। মূল ধারণাটি হল নির্দিষ্ট বাস্তবায়ন এবং ইন্টারফেস, নীতি-ভিত্তিক শ্রেণী এবং বিভিন্ন নীতিতে বিভক্ত করার জন্য সাধারণতা-পরিবর্তনশীলতা বিশ্লেষণ ব্যবহার করা। কৌশলটি হল প্রধান শ্রেণীতে কী যায় এবং কোন নীতিগুলি তৈরি করা উচিত তা জানা। উপরে উল্লিখিত নিবন্ধটি নিম্নলিখিত উত্তর দেয়ঃ যেখানেই আমাদের সম্ভাব্য সীমিত নকশার সিদ্ধান্ত নেওয়ার প্রয়োজন হবে, আমাদের সেই সিদ্ধান্তটি স্থগিত করা উচিত, আমাদের উচিত এটি যথাযথভাবে নামকরণ করা নীতিতে অর্পণ করা। নীতির শ্রেণীগুলিতে বাস্তবায়ন, প্রকারের সংজ্ঞা ইত্যাদি থাকতে পারে। মূলত, প্রধান টেমপ্লেট ক্লাসের ডিজাইনার নির্ধারণ করবেন যে পলিসি ক্লাসগুলির কী প্রদান করা উচিত, তাদের কী কাস্টমাইজেশন পয়েন্টগুলি বাস্তবায়ন করতে হবে। নীতিগুলির একটি ভাল সেট তৈরি করা একটি সূক্ষ্ম কাজ হতে পারে, কেবল সঠিক সংখ্যা (যেমন, ন্যূনতম প্রয়োজনীয়)। বিভিন্ন কাস্টমাইজেশন পয়েন্ট, যা একসাথে সম্পর্কিত, একটি নীতি যুক্তিতে যাওয়া উচিত, যেমন স্টোরেজ নীতি, বৈধতা নীতি ইত্যাদি। গ্রাফিক ডিজাইনাররা তাদের নীতিগুলিকে একটি নাম দিতে সক্ষম, যা ধারণাগুলির প্রতিনিধিত্ব করে, এবং যা অপারেশন বা ছোটখাটো বাস্তবায়নের বিবরণের প্রতিনিধিত্ব করে না। নীতি-ভিত্তিক নকশায় অন্যান্য দরকারী কৌশল অন্তর্ভুক্ত থাকতে পারে। উদাহরণস্বরূপ, টেমপ্লেট পদ্ধতির প্যাটার্নটি সংকলন সময়ের জন্য পুনরায় ব্যাখ্যা করা যেতে পারে, যাতে একটি প্রধান শ্রেণীর একটি কঙ্কাল অ্যালগরিদম থাকে, যা কাস্টমাইজেশনে কিছু নীতির উপযুক্ত কার্যকারিতা নির্দেশ করে। এটি সি + +-এর ভবিষ্যৎ সংস্করণগুলিতে ধারণাগুলির দ্বারা গতিশীলভাবে অর্জন করা হবে। নীচে উপস্থাপিত সহজ উদাহরণটি একটি সি + + হ্যালো ওয়ার্ল্ড প্রোগ্রামের একটি সহজ (পরিকল্পিত) উদাহরণ, যেখানে মুদ্রিত পাঠ্য এবং এটি মুদ্রণের পদ্ধতি নীতি ব্যবহার করে বিচ্ছিন্ন করা হয়। এই উদাহরণে, হ্যালোওয়ার্ল্ড একটি হোস্ট ক্লাস যেখানে এটি দুটি নীতি নেয়, একটি বার্তা কীভাবে দেখানো উচিত তা নির্দিষ্ট করার জন্য এবং অন্যটি আসল বার্তাটি ছাপানোর জন্য। লক্ষ্য করুন যে সাধারণ বাস্তবায়ন রান-এ রয়েছে এবং তাই উভয় নীতি (মুদ্রণ এবং বার্তা) প্রদান না করা পর্যন্ত কোডটি সংকলিত করা যাবে না। #include <আইওস্ট্রিম> #include <স্ট্রিং> টেমপ্লেট <টাইপনাম আউটপুট পলিসি, টাইপনাম ল্যাঙ্গুয়েজ পলিসি> ক্লাস হ্যালোওয়ার্ল্ডঃ প্রাইভেট আউটপুট পলিসি, প্রাইভেট ল্যাঙ্গুয়েজ পলিসি {সর্বজনীনঃ// আচরণ পদ্ধতি। শূন্য রান () কনস্ট {// দুটি নীতি পদ্ধতি। প্রিন্ট (মেসেজ ());} প্রাইভেটঃ ল্যাঙ্গুয়েজপলিচি ব্যবহার করেঃঃ মেসেজ; আউটপুটপলিচি ব্যবহার করেঃঃ প্রিন্ট;}; ক্লাস আউটপুটপলিচি রাইট টু কাউট {সুরক্ষিতঃ টেমপ্লেট <টাইপনাম মেসেজ টাইপ> অকার্যকর প্রিন্ট (মেসেজ টাইপ & & বার্তা) কনস্ট {STD:: cout <<বার্তা <<STD:: এন্ডল;}}; ক্লাস ল্যাঙ্গুয়েজপলিচি ইংলিশ {সুরক্ষিতঃ STD:: স্ট্রিং মেসেজ () কনস্ট {ফেরত "হ্যালো, ওয়ার্ল্ড! ";}}; শ্রেণী LanguagePoliceGerman {সুরক্ষিতঃ std:: স্ট্রিং বার্তা () কনস্ট {ফেরত" হ্যালো ওয়েল্ট! ";}}; ইন্ট মেইন () {// উদাহরণ 1 ব্যবহার করে হ্যালোওয়ার্ল্ডইংলিশ = হ্যালোওয়ার্ল্ড <আউটপুটপোলিচি রাইট টু কাউট, ল্যাঙ্গুয়েজপোলিচিইংলিশ>; হ্যালোওয়ার্ল্ডইংলিশ হ্যালো _ ওয়ার্ল্ড; hello_world.Run ();// প্রিন্ট করে" হ্যালো, ওয়ার্ল্ড! "। //উদাহরণ 2// একই কাজ করে, কিন্তু অন্য ভাষা নীতি ব্যবহার করে। ব্যবহার করা হচ্ছে হ্যালোওয়ার্ল্ড জার্মান = হ্যালোওয়ার্ল্ড <আউটপুটপোলিজ রাইট টু কাউট, ল্যাঙ্গুয়েজপোলিজ জার্মান>; হ্যালোওয়ার্ল্ড জার্মান হ্যালো _ ওয়ার্ল্ড2; hello_world2.Run ();// প্রিন্ট "হ্যালো ওয়েল্ট!"। ডিজাইনাররা সহজেই সদস্য ফাংশন প্রিন্টের সাথে নতুন ক্লাস যুক্ত করে আরও আউটপুট নীতি লিখতে পারেন এবং সেগুলিকে নতুন আউটপুট নীতি হিসাবে নিতে পারেন। লোকী লাইব্রেরি হল একটি সি + + সফ্টওয়্যার লাইব্রেরির নাম যা আন্দ্রেই আলেকজান্দ্রেস্কু তাঁর মডার্ন সি + + ডিজাইন বইয়ের অংশ হিসাবে লিখেছেন। গ্রন্থাগারটি সি + + টেমপ্লেট মেটাপ্রোগ্রামিংয়ের ব্যাপক ব্যবহার করে এবং বেশ কয়েকটি সাধারণভাবে ব্যবহৃত সরঞ্জাম প্রয়োগ করেঃ টাইপলিস্ট, ফানক্টর, সিঙ্গেলটন, স্মার্ট পয়েন্টার, অবজেক্ট ফ্যাক্টরি, ভিজিটর এবং মাল্টিমেথড। মূলত গ্রন্থাগারটি শুধুমাত্র দুটি সর্বাধিক মানসম্মত সি + + সংকলকের (কোড ওয়ারিয়র এবং কোমো সি/সি + +) সাথে সামঞ্জস্যপূর্ণ ছিলঃ পরবর্তী প্রচেষ্টাগুলি এটিকে বিস্তৃত সংকলকের সাথে ব্যবহারযোগ্য করে তুলেছে (পুরানো ভিজ্যুয়াল সি + + 6.0, বোরল্যান্ড সি + + বিল্ডার 6.0, ক্ল্যাং এবং জিসিসি সহ)। সংকলক বিক্রেতারা লোকিকে সামঞ্জস্যের মাপকাঠি হিসাবে ব্যবহার করেছিলেন, যা অনুবর্তী সংকলকদের সংখ্যা আরও বাড়িয়েছিল। সোর্সফোর্জ প্রকল্প হিসাবে পিটার কুমেল এবং রিচার্ড স্পোসাতোর নেতৃত্বে একটি ওপেন সোর্স সম্প্রদায়ের মাধ্যমে লোকির রক্ষণাবেক্ষণ এবং আরও উন্নয়ন অব্যাহত রয়েছে। বহু মানুষের অব্যাহত অবদান গ্রন্থাগারের সামগ্রিক দৃঢ়তা এবং কার্যকারিতা উন্নত করেছে। লোকি আর বইয়ের সঙ্গে যুক্ত নয় কারণ এতে ইতিমধ্যেই অনেক নতুন উপাদান রয়েছে (যেমন। স্ট্রং পিটিআর, প্রিন্টএফ এবং স্কোপগার্ড)। লোকি অনুরূপ সরঞ্জাম এবং কার্যকারিতা অনুপ্রাণিত করেছে যা এখন বুস্ট লাইব্রেরি সংগ্রহেও উপস্থিত রয়েছে। আরও দেখুন বুস্ট (সি + + লাইব্রেরি) মিক্সিন রেফারেন্স এক্সটার্নাল লিঙ্ক আলেকজান্দ্রেস্কুর ওয়েবসাইট (বইয়ের ত্রুটি সহ) স্মার্ট পয়েন্টারস (বই থেকে নমুনা অধ্যায়) বই প্রকাশক 2001 অ-কথাসাহিত্য বই থেকে মূল উৎস কোড সি + + সম্পর্কে বই