হেডার ফাইলগুলিতে সি ++ সংজ্ঞা স্থাপন করা কি ভাল অনুশীলন?


196

সি ++ এর সাথে আমার ব্যক্তিগত স্টাইলটি সর্বদা একটি অন্তর্ভুক্ত ফাইলে শ্রেণি ঘোষণা এবং একটি .cpp ফাইলে সংজ্ঞা রাখতে হবে, অনেকটা সি ++ শিরোলেখ ফাইলগুলি, কোড পৃথকীকরণের লোকির উত্তরে বর্ণিত । স্বীকার করা যায়, আমার এই স্টাইলটি যে কারণে পছন্দ করেছে তার একটি অংশ সম্ভবত মডিউল -২ এবং অ্যাডা কোডিংয়ে সমস্ত বছর ব্যয় করেছে যা উভয়েরই স্পেসিফিকেশন ফাইল এবং বডি ফাইলগুলির সাথে একই স্কিম রয়েছে।

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

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

উত্তরগুলিতে কেবল কিছু কাঠামো দেওয়ার জন্য: এটি এখন কী উপায় , খুব সাধারণ, কিছুটা সাধারণ, অস্বাভাবিক বা বাগ-আউট পাগল?


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

আমি এখনও পর্যন্ত আমার শ্রেনীর সমস্ত সংজ্ঞা হেডারে রেখেছি। পিম্পল ক্লাসের কেবল সংজ্ঞাগুলি ব্যতিক্রম are আমি কেবল তাদের হেডারগুলিতে ঘোষণা করি।
জোহানেস স্কাউব -

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

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

1
@ মারকলাকাটা - তিনি যে বিষয়গুলিতে ইঙ্গিত করেছেন সেটি এটিই একটি। আমি এই যুক্তিটি ইদানীং তার কাছ থেকে শুনিনি, তবে আইআইআরসি তিনি যুক্তি দিয়েছিলেন যে জাভা এবং সি # এভাবে কাজ করে, এবং সি # তখন একেবারে নতুন ছিল, যার ফলে এটি সমস্ত ভাষায় শিগগিরই অনুসরণ করা হবে
টেড

উত্তর:


209

আপনার সহকর্মী ভুল, সাধারণ উপায় always

হেডারে কোড লাগানোর জন্য মাঝে মাঝে কিছু যোগ্যতা থাকে, এটি সংকলক দ্বারা আরও চতুর অন্তর্নিহিত মঞ্জুরি দেয়। তবে একই সাথে, এটি আপনার সংকলনের সময়গুলিকে ধ্বংস করতে পারে যেহেতু প্রত্যেকটি কোডই সংকলক দ্বারা অন্তর্ভুক্ত করার সময় প্রতিটি প্রক্রিয়া করা উচিত has

সবশেষে যখন কোডগুলি শিরোনাম হয় তখন অবশেষে বৃত্তাকার অবজেক্টের সম্পর্কগুলি (কখনও কখনও পছন্দসই) হওয়া প্রায়শই বিরক্ত হয়।

নীচের লাইন, আপনি ঠিক বলেছেন, তিনি ভুল।

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

সম্পাদনা: কিছু লোকেরা আরও কিছুটা ব্যাখ্যা চান, "শিরোনাম কেবলমাত্র" কোডটি লেখার জন্য এখানে কিছু চিন্তা রয়েছে:

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

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

চূড়ান্ত পয়েন্ট হিসাবে, কেবলমাত্র শিরোনামের কোড হিসাবে উদাহরণ হিসাবে বুস্ট ব্যবহার করার সময়, একটি বিশাল বিবরণ প্রায়শই মিস হয়ে যায়।

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


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

14
এটি একটি খারাপ তর্ক তিনি করছেন, আপনার বন্দুকগুলিকে আটকে রাখুন :)
ইভান তেরান

11
"এক্সপোর্ট" কীওয়ার্ড সমর্থিত হলে টেমপ্লেট সংজ্ঞা সিপিপি ফাইলগুলিতে থাকতে পারে। এটি সি ++ এর একটি অন্ধকার কোণ যা সাধারণত আমার জ্ঞানের সেরা হিসাবে সর্বাধিক সংকলন দ্বারা প্রয়োগ করা হয় না।
আন্দ্রেই তারানচেঙ্কো

2
উদাহরণস্বরূপ এই উত্তরের নীচের অংশটি
ইভান তেরান

3
এটি "হুরারে, কোনও লিঙ্কারের ত্রুটি নেই" এ এই আলোচনার অর্থবহ হতে শুরু করে।
ইভান তেরান

158

যেদিন সি ++ কোডাররা ওয়েতে একমত হবেন, ভেড়ার বাচ্চা সিংহের সাথে শুয়ে থাকবে, ফিলিস্তিনিরা ইস্রায়েলীয়দের জড়িয়ে ধরবে, এবং বিড়াল এবং কুকুরকে বিবাহ করার অনুমতি দেওয়া হবে।

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


140
"যেদিন সি ++ কোডাররা ওয়েতে সম্মত হন ..." কেবলমাত্র একটি সি ++ কোডার বাকি থাকবে!
ব্রায়ান এনসিংক

9
আমি ভেবেছিলাম তারা ইতিমধ্যেই পথে একমত, এ .cpp জ মধ্যে ঘোষণা এবং সংজ্ঞা
hasen

6
আমরা সবাই অন্ধ মানুষ এবং সি ++ একটি হাতি।
রডারিক টেলর

অভ্যাস? তাই স্কোপ সংজ্ঞায়িত করতে .h ব্যবহার সম্পর্কে কী? কোন জিনিস দ্বারা এটি প্রতিস্থাপন করা হয়েছে?
হার্নান এচে

28

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

শিরোলেখ ফাইলগুলিতে কোড থাকার কারণ হ'ল সাধারনত কীওয়ার্ডটি সঠিকভাবে কাজ করার জন্য এবং অন্যান্য সিপিপি ফাইলগুলিতে টেমপ্লেটগুলি ব্যবহার করার সময় এটি প্রয়োজন হয়।


1
"এটি ঘোষণার পরিবর্তে প্রকৃত কোড পরিবর্তন করার সাথে সাথে শিরোনামযুক্ত সমস্ত ফাইলের পুনঃসংশোধন করতে বাধ্য করে" আমি মনে করি এটিই সবচেয়ে আসল কারণ; .c ফাইলগুলিতে প্রয়োগের চেয়ে শিরোনামে ঘোষণাগুলি কম ঘন ঘন পরিবর্তিত হয় এই সত্যের সাথেও যায়।
নিনাদ

20

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

আমি এই দৃষ্টিকোণের সাথে একমত নই, তবে এটি যেখান থেকে এসেছে তা হতে পারে।


আমি মনে করি আপনি এই সম্পর্কে সঠিক। আমরা যখন এটি আলোচনা করি তখন তিনি সর্বদা টেম্পলেটগুলির উদাহরণ ব্যবহার করেন, যেখানে আপনার কমবেশি এটি করতে হবে। আমি "করতে হবে" এর সাথেও একমত নই, তবে আমার বিকল্পগুলি বরং বিশৃঙ্খলাযুক্ত।
টেড

1
@ted - টেম্প্লেটেড কোডের জন্য আপনার প্রয়োগটি শিরোনামে রাখতে হবে। 'এক্সপোর্ট' কীওয়ার্ড কোনও সংকলককে টেম্পলেটগুলির ঘোষণা এবং সংজ্ঞা পৃথক করার পক্ষে সমর্থন করে, তবে রফতানির জন্য সমর্থনটি বেশ অ-অরক্ষিত। anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf
মাইকেল

একটি শিরোনাম, হ্যাঁ, তবে এটি একই শিরোনাম হতে হবে না। নীচে অজানা এর উত্তর দেখুন।
টেড

এটি বোধগম্য হয়, তবে আমি বলতে পারি না আমি এর আগে এই স্টাইলটি পেরিয়ে এসেছি।
মাইকেল বারার 0

14

আমি মনে করি আপনার সহকর্মী স্মার্ট এবং আপনিও সঠিক।

দরকারী জিনিসগুলি আমি খুঁজে পেলাম যে শিরোনামে সমস্ত কিছু puttingোকানো:

  1. লিখন এবং সিঙ্ক শিরোনাম এবং উত্সগুলির প্রয়োজন নেই।

  2. কাঠামোটি সরল এবং কোনও বিজ্ঞপ্তি নির্ভরতা কোডারকে "আরও ভাল" কাঠামো তৈরি করতে বাধ্য করে না।

  3. পোর্টেবল, নতুন প্রকল্পে এম্বেড করা সহজ।

আমি সংকলনের সময় সমস্যার সাথে একমত নই, তবে আমি মনে করি আমাদের এটি লক্ষ্য করা উচিত:

  1. উত্স ফাইলের পরিবর্তনের ফলে শিরোনামের ফাইলগুলি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে যা পুরো প্রকল্পটিকে পুনরায় সংযুক্ত করে নিয়ে যায়।

  2. সংকলনের গতি আগের চেয়ে অনেক দ্রুত is এবং যদি আপনার একটি দীর্ঘ সময় এবং উচ্চ ফ্রিকোয়েন্সি দিয়ে তৈরি করার কোনও প্রকল্প থাকে তবে এটি আপনার প্রকল্পের ডিজাইনের ত্রুটি রয়েছে বলে ইঙ্গিত দিতে পারে। বিভিন্ন প্রকল্পে টাস্কগুলি আলাদা করুন এবং মডিউলটি এই সমস্যাটি এড়াতে পারে।

শেষ পর্যন্ত আমি কেবল আমার ব্যক্তিগত দৃষ্টিতে আপনার সহকর্মীকে সমর্থন করতে চাই।


3
+1 টি। আপনারা ছাড়া অন্য কারও ধারণা ছিল না যে শিরোনামে কেবলমাত্র দীর্ঘ প্রকল্পের প্রকল্পের সময় খুব বেশি নির্ভরশীলতার দিকে ইঙ্গিত করতে পারে যা খারাপ নকশা। ভাল যুক্তি! কিন্তু এই নির্ভরশীলতাগুলি এমন কি মুছে ফেলা যেতে পারে যেখানে সংকলনের সময়টি খুব কম?
টোবিএমসিএনবিবি

@ টোবিএমসিএনএমবি: খারাপ ডিজাইনের সিদ্ধান্তের বিষয়ে আরও ভাল মতামত পেতে আমি "স্ল্যাকিং" ধারণাটি পছন্দ করি। তবে শিরোনাম-কেবল বনাম পৃথকভাবে সংকলিত ক্ষেত্রে, আমরা যদি এই ধারণার উপর স্থির করে থাকি তবে আমরা একক সংকলন ইউনিট এবং বিশাল সংকলনের সময় শেষ করি। এমনকি ডিজাইন আসলে দুর্দান্ত।
জো সো

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

1
আমি ভাবতে শুরু করি যে আধুনিক ভাষাগুলির মতো পুরোপুরি শিরোনামগুলি ড্রপ করার ক্ষেত্রে কোনও ত্রুটি রয়েছে কিনা।
জো সো

12

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

মনে রাখবেন: একটি মূর্খ ধারাবাহিকতা হ'ল অল্প মনের হাবগোব্লিন


হ্যাঁ, আমি এটিও করি। আমি যে সাধারণ নিয়মটি ব্যবহার করি তা "যদি কোডের একটি লাইনে ফিট করে তবে এটি শিরোনামে রেখে দিন" এর লাইন ধরে কিছু মনে হচ্ছে।
টেড

যখন কোনও লাইব্রেরি A<B>সিপিপি ফাইলে একটি টেম্পলেট শ্রেণীর বডি সরবরাহ করে এবং তখন ব্যবহারকারী কোনও চান A<C>?
jww

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

7

টুওমাস যেমন বলেছিল, আপনার শিরোনামটি ন্যূনতম হওয়া উচিত। সম্পূর্ণ হতে আমি কিছুটা প্রসারিত করব।

আমি আমার C++প্রকল্পগুলিতে ব্যক্তিগতভাবে 4 ধরণের ফাইল ব্যবহার করি :

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

তদ্ব্যতীত, আমি এটি অন্য নিয়মের সাথে যুগল: আপনি কী ঘোষণা করতে পারেন তা নির্ধারণ করবেন না। যদিও আমি সেখানে যুক্তিসঙ্গত (পিম্পল সর্বত্র ব্যবহার করা বেশ ঝামেলা)।

এর অর্থ হ'ল আমি #includeযখনই আমি এগুলি থেকে দূরে সরে যেতে পারি তখন আমার হেডারগুলিতে কোনও নির্দেশের চেয়ে অগ্রণী ঘোষণাকে অগ্রাধিকার দিই।

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

এটি পুরোপুরি করা:

// example_fwd.hpp
// Here necessary to forward declare the template class,
// you don't want people to declare them in case you wish to add
// another template symbol (with a default) later on
class MyClass;
template <class T> class MyClassT;

// example.hpp
#include "project/example_fwd.hpp"

// Those can't really be skipped
#include <string>
#include <vector>

#include "project/pimpl.hpp"

// Those can be forward declared easily
#include "project/foo_fwd.hpp"

namespace project { class Bar; }

namespace project
{
  class MyClass
  {
  public:
    struct Color // Limiting scope of enum
    {
      enum type { Red, Orange, Green };
    };
    typedef Color::type Color_t;

  public:
    MyClass(); // because of pimpl, I need to define the constructor

  private:
    struct Impl;
    pimpl<Impl> mImpl; // I won't describe pimpl here :p
  };

  template <class T> class MyClassT: public MyClass {};
} // namespace project

// example_impl.hpp (not visible to clients)
#include "project/example.hpp"
#include "project/bar.hpp"

template <class T> void check(MyClass<T> const& c) { }

// example.cpp
#include "example_impl.hpp"

// MyClass definition

এখানে লাইফসেভারটি হ'ল বেশিরভাগ সময় ফরোয়ার্ড শিরোনামটি অকেজো থাকে: কেবলমাত্র তেমন ক্ষেত্রে typedefবা templateতাই বাস্তবায়ন শিরোনামের প্রয়োজন;)


6

আরও মজা যুক্ত করতে আপনি .ippএমন ফাইল যুক্ত করতে পারেন যা টেম্পলেট বাস্তবায়ন (যেটিতে অন্তর্ভুক্ত করা হচ্ছে .hpp) .hppরয়েছে, সেই সাথে ইন্টারফেস রয়েছে।

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


টেমপ্লেট সংজ্ঞা নিয়েও আমি এটি করতে পেরেছি (যদিও আমি নিশ্চিত নই যে আমি একই এক্সটেনশনটি ব্যবহার করেছি ... এটি একটি সময় হয়ে গেছে)।
টেড

5

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


4

যদি এই নতুন উপায়টি সত্যই পথ হয় তবে আমরা আমাদের প্রকল্পগুলিতে বিভিন্ন দিক থেকে চলতে পারি।

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

প্রযোজ্য ক্ষেত্রে আমরা "অস্বচ্ছ পয়েন্টার" -প্যাটার্নটি ব্যবহার করি ।

এই অনুশীলনগুলির সাহায্যে আমরা আমাদের বেশিরভাগ সমবয়সীদের তুলনায় দ্রুত বিল্ডগুলি করতে পারি। এবং হ্যাঁ ... কোড পরিবর্তন করা বা শ্রেণীর সদস্যরা বিশাল পুনর্নির্মাণের কারণ হবে না।


4

আমি ব্যক্তিগতভাবে আমার হেডার ফাইলগুলিতে এটি করি:

// class-declaration

// inline-method-declarations

ক্লাসের সাথে পদ্ধতিগুলির জন্য কোডটি মিশ্রিত করতে আমি পছন্দ করি না কারণ জিনিসগুলি দ্রুত দেখার জন্য আমার খুব কষ্ট হয়।

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

ক্লাসে পদ্ধতিগুলি করা বৈধ ... তবে পঠনযোগ্য দৃষ্টিকোণ থেকে আমি এটি পছন্দ করি না। পদ্ধতিগুলিকে শিরোনামে রাখার অর্থ এই যে, যখন সম্ভব হবে তখন সেগুলি অন্তর্ভুক্ত হবে।


2

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


2

আমি সমস্ত বাস্তবায়ন ক্লাস সংজ্ঞা থেকে দূরে রেখেছি। ক্লাসের সংজ্ঞা থেকে আমি ডক্সিজেন মন্তব্য করতে চাই।


1
আমি জানি যে দেরি হয়ে গেছে, কিন্তু ডাউনভাইটাররা (বা সহানুভূতিশীল) কেন মন্তব্য করতে আগ্রহী? এটি আমার কাছে যুক্তিসঙ্গত বক্তব্য বলে মনে হচ্ছে। আমরা ডক্সিজেন ব্যবহার করি এবং সমস্যাটি অবশ্যই সামনে এসেছিল।
টেড

2

আমি মনে করি যে শিরোনাম ফাইলটিতে আপনার সমস্ত ফাংশন সংজ্ঞা যুক্ত করা একেবারেই অযৌক্তিক। কেন? কারণ শিরোনাম ফাইলটি আপনার শ্রেণিতে পাবলিক ইন্টারফেস হিসাবে ব্যবহৃত হয়। এটি "ব্ল্যাক বক্স" এর বাইরের অংশ।

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


1

এটি কি আসলেই সিস্টেমের জটিলতা এবং অভ্যন্তরীণ সম্মেলনের উপর নির্ভর করে না?

এই মুহুর্তে আমি একটি নিউরাল নেটওয়ার্ক সিমুলেটর নিয়ে কাজ করছি যা অবিশ্বাস্যরকম জটিল এবং আমি যে স্বীকৃত শৈলীটি ব্যবহার করব বলে আশা করি তা হ'ল:

ক্লাসেরনেমে ক্লাস সংজ্ঞা। ক্লাসের নাম
কোডে ক্লাস কোড। ক্লাসনেম
কোডে পিপি

এটি বিকাশকারী-নির্মিত বেস ক্লাসগুলি থেকে ব্যবহারকারী-নির্মিত সিমুলেশনগুলি বিভক্ত করে এবং পরিস্থিতিতে সেরা কাজ করে।

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


1
"ক্লাস কোড" এবং "এক্সিকিউটেবল কোড" এর মধ্যে পার্থক্যটি ঠিক কী?
টেড

যেমনটি আমি বলেছি, এটি একটি নিউরাল সিমুলেটর: ব্যবহারকারী এক্সিকিউটেবল সিমুলেশন তৈরি করে যা অনেকগুলি শ্রেণীর উপর নির্মিত যা নিউরন ইত্যাদি হিসাবে কাজ করে So যে সিমুলেটর জিনিস করতে না।
এড জেমস

সাধারণত, আপনি বলতে পারবেন না যে কোনও প্রোগ্রামের বিশাল সংখ্যাগরিষ্ঠতার জন্য (পুরোপুরি না হলে) আসলে "নিজেই কিছু করতে পারে না"? আপনি কি বলছেন যে "প্রধান" কোডটি একটি সিপিসিতে চলে যায়, তবে অন্য কিছু করে না?
টেড

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

0

টেমপ্লেট কোডটি কেবল শিরোনামে থাকা উচিত। এ ছাড়া ইনলাইনগুলি ব্যতীত সমস্ত সংজ্ঞা .cpp এ থাকা উচিত। এটির জন্য সর্বোত্তম যুক্তি হ'ল স্ট্যান্ড লাইব্রেরি বাস্তবায়ন যা একই নিয়ম অনুসরণ করে। আপনি এই বিষয়ে std lib বিকাশকারীদের সঠিক হতে হবে তা দ্বিধা করবেন না।


কোন স্টাডলিবস? জিসিসির libstdc++মনে হয় (এএএফআইসিএস) 'হ'ল ' শিরোনামে থাকা উচিত কিনা ' srcএবং প্রায় সব কিছুতে কিছু না put includeসুতরাং আমি এটি সঠিক / দরকারী উদ্ধৃতি বলে মনে করি না। যাইহোক, আমি মনে করি না stdlibs ব্যবহারকারী কোডের জন্য অনেকগুলি মডেল: এগুলি স্পষ্টতই উচ্চ দক্ষ কোডার দ্বারা রচিত, তবে ব্যবহার করার জন্য , পড়তে হবে না: তারা উচ্চ জটিলতা দূরে সরিয়ে দেয় যা বেশিরভাগ কোডারদের চিন্তা করার দরকার নেই should , _Reserved __namesব্যবহারকারীর সাথে দ্বন্দ্ব এড়াতে সর্বত্র কুৎসিত হওয়া দরকার , মন্তব্য এবং ব্যবধান আমার পরামর্শের চেয়ে নীচে রয়েছে etc. তারা সংকীর্ণভাবে উদাহরণস্বরূপ're
আন্ডারস্কোর_ডি

0

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

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


1
হাঃ হাঃ হাঃ. 2 বছর পরে, এটি কাউকে ধরে ফেলার একটি অদ্ভুত উপায়। আমার কাছে এখনও একটি অনুলিপি রয়েছে কিনা তা আমি খতিয়ে দেখব, তবে সম্ভবত না not আমি এআই ক্লাসের জন্য এটি করেছি যাতে আমি আডায় আমার কোডটি করতে পারি, তবে উদ্দেশ্যমূলকভাবে প্রকল্পটি সিসি0 (মূলত অসমর্থিত) তৈরি করে এই আশায় যে কেউ নির্লজ্জভাবে এটি গ্রহণ করবে এবং এটি দিয়ে কিছু করবে।
টেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.