শিরোলেখ ফাইলগুলি কি আসলেই ভাল? [বন্ধ]


20

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


আমি সি এবং সি ++ এর সরঞ্জামগুলির সাথে পরিচিত নই, তবে বেশিরভাগ আইডিই / কোড সম্পাদকদের মধ্যে আমি কাজ করেছি "কাঠামো" বা "রূপরেখা" দেখুন have
মাইকেল কে

1
হেডার ফাইলগুলি ভাল নয় - সেগুলি প্রয়োজনীয়! - এসও-তে এই উত্তরটি দেখুন: stackoverflow.com/a/1319570/158483
পিট

উত্তর:


31

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

সি ++ সি এর সাথে পিছনের দিকে সামঞ্জস্যপূর্ণ হ্যাডার ফাইলগুলি রাখার জন্য প্রয়োজনীয় ছিল তবে তাদের উপরে অনেকগুলি সংযুক্ত করা হয়েছিল যার ফলস্বরূপ বেশ সমস্যাযুক্ত ডিজাইন তৈরি হয়েছিল। আরো FQA

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

তাই না হেডার ফাইলগুলি ভাল নয় not আমাদের তখনও পৃথক ফ্লপিতে সংকলক এবং লিঙ্কার থাকতে হয়েছিল এবং সংকলনটি 30 মিনিট সময় নিয়েছিল। আজকাল, তারা কেবল পথে আসে এবং খারাপ ডিজাইনের চিহ্ন।


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

3
@ হঙ্ক আমি আমার প্রশ্নটি নিয়ে যাচ্ছিলাম। তবে আমি মনে করি যে আধুনিক আইডিইগুলি (এল ইউসুবোভের পরামর্শ অনুসারে) এটিকে অবহেলা করে।
ম্যাট ফিচম্যান

5
আপনি যুক্ত করতে পারেন যে সি ++ কমিটি মডিউলগুলিতে কাজ করছে যা সি এবং সি ++ কোনও শিরোনাম ছাড়াই বা আরও কার্যকর উপায়ে ব্যবহৃত শিরোনাম ছাড়া কাজ করতে সক্ষম করবে। এই উত্তর আরও ন্যায্য করতে হবে।
ক্লাইম

2
@ ম্যাটফিচম্যান: কিছু শিরোনাম ফাইল তৈরি করা একটি জিনিস (যা বেশিরভাগ প্রোগ্রামারের সম্পাদক / আইডিই কোনওভাবে স্বয়ংক্রিয়ভাবে করতে পারে), তবে একটি পাবলিক এপিআই সম্পর্কে মূল বিষয়টি এটি একটি কার্যকর মানুষের দ্বারা কার্যকরভাবে সংজ্ঞায়িত এবং ডিজাইন করা প্রয়োজন।
বেনিয়ামিন ব্যানিয়ার

2
@ হংক হ্যাঁ তবে এটি আলাদা ফাইলগুলিতে সংজ্ঞায়িত করার কোনও কারণ নেই। এটি বাস্তবায়ন হিসাবে একই কোড হতে পারে। যেমন সি # এটি করছে।
ইউফোরিক

17

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

সি ডিজাইন করা হয়েছিল যাতে প্রতিটি সংকলন পাস একটি একক মডিউল তৈরি করে; প্রতিটি উত্স ফাইল সংকলক পৃথক রান মধ্যে সংকলিত হয়। অন্যদিকে, শিরোনাম ফাইলগুলি প্রতিটি উত্স ফাইলের জন্য যে সংকলন পদক্ষেপে তা উল্লেখ করা হয় সেগুলি ইনজেকশনের সাথে যুক্ত হয়।

এর অর্থ হ'ল যদি আপনার শিরোনাম ফাইলটি 300 উত্স ফাইলগুলিতে অন্তর্ভুক্ত করা হয়, তবে এটি আপনার প্রোগ্রামটি তৈরি হওয়ার সময় 300 টি আলাদা সময় পার্স করা এবং সংকলিত হয়ে যায়। ঠিক একই ফলাফল, একই সাথে বার বার। এটি একটি বিশাল সময়ের অপচয়, এবং সি এবং সি ++ প্রোগ্রামগুলি তৈরিতে এত বেশি সময় নেয় কেন এমন প্রাথমিক কারণগুলির মধ্যে একটি।

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

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

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


5
কঠোরভাবে সত্য নয় - বেশিরভাগ, না থাকলেও, সংকলকগুলি শিরোনামগুলি প্রাক-সংকলন করে যেমন তারা দেখতে পায় তাই পরবর্তী সংকলন ইউনিটে তাদের অন্তর্ভুক্ত করা প্রাক-সংকলিত কোডের ব্লক খুঁজে পাওয়ার চেয়ে খারাপ নয়। এটির থেকে আলাদা নয়, বলুন। নেট কোডটি বারবার 'বিল্ডিং' system.data.typs প্রতি সি # ফাইলের জন্য আপনার সঙ্কলন করে file সি / সি ++ প্রোগ্রামগুলি এত দীর্ঘ সময় নেওয়ার কারণ হ'ল এগুলি আসলে সংকলিত (এবং অনুকূলিত)। নেট নেটওয়ার্কের সমস্ত প্রয়োজনের দরকার হয় আইএল-তে পার্স করা, রানটাইমটি জেআইটি-র মাধ্যমে প্রকৃত সংকলন করে। এটি বলেছিল যে সি # কোডে 300 উত্স ফাইলগুলিও সংকলন করতে বেশ কিছুটা সময় নেয়।
gbjbaanb

7

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

উদাহরণস্বরূপ: ভিজ্যুয়াল স্টুডিওতে রয়েছে Class Viewএবং Object browserএটি আপনার অনুরোধকৃত কার্যকারিতা সরবরাহ করে। নীচের স্ক্রিন-শটগুলিতে পছন্দ করুন।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


4

শিরোলেখ ফাইলগুলির একটি অতিরিক্ত অসুবিধা হ'ল প্রোগ্রামটি তাদের অন্তর্ভুক্তির ক্রমের উপর নির্ভর করে এবং প্রোগ্রামারকে সঠিকতা নিশ্চিত করতে অতিরিক্ত পদক্ষেপ নিতে হবে।

এটি সি এর ম্যাক্রো সিস্টেমের সাথে (সি ++ দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত) অনেকগুলি ক্ষতি এবং বিভ্রান্তিকর পরিস্থিতির দিকে নিয়ে যায়।

উদাহরণস্বরূপ, যদি একটি শিরোনাম ম্যাক্রো ব্যবহারের জন্য কিছু চিহ্নকে সংজ্ঞায়িত করে এবং অন্য শিরোনামটি অন্য ফ্যাশনে যেমন একটি ফাংশনের নাম হিসাবে চিহ্ন ব্যবহার করে, তবে অন্তর্ভুক্তির ক্রম চূড়ান্ত ফলাফলকে ব্যাপকভাবে প্রভাবিত করবে। এরকম অনেক উদাহরণ রয়েছে।


2

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

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

সুতরাং সি / সি ++ শিরোনাম ফাইলগুলিতে একটি ইন্টারফেসের সমতুল্য (প্রকারের) বাধ্যতামূলক করা ভাল জিনিস।

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


ইন্টারফেস এবং বিভিন্ন ফাইলের প্রয়োগ? ডিজাইনের মাধ্যমে আপনার যদি এটির প্রয়োজন হয় তবে জাভা / সি # এর মতো একটি ফাইলের ইন্টারফেস (বা বিমূর্ত শ্রেণি) একটি ফাইলে সংজ্ঞায়িত করা এবং অন্যান্য ফাইলগুলিতে প্রয়োগ (গুলি) আড়াল করা খুব সাধারণ বিষয়। এটির জন্য পুরানো এবং কৌতুকপূর্ণ হেডার ফাইলগুলির প্রয়োজন নেই।
পিটার নর্ডল্যান্ডার

অঁ্যা? আমি যা বলেছিলাম তা নয় - আপনি ইন্টারফেস এবং শ্রেণি প্রয়োগ 2 টি ফাইলে সংজ্ঞায়িত করেন।
gbjbaanb

2
ভাল, এর জন্য হেডার ফাইলগুলির প্রয়োজন হয় না এবং এটি হেডার ফাইলগুলি আরও ভাল করে না। হ্যাঁ, তাদের উত্তরাধিকার সহ ভাষাগুলিতে প্রয়োজন, তবে ধারণা হিসাবে তাদের বিভিন্ন ফাইলগুলিতে ইন্টারফেস / প্রয়োগের বিভাজন করা প্রয়োজন হয় না (আসলে তারা এটিকে আরও খারাপ করে তোলে)।
পিটার নর্ডল্যান্ডার

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

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

1

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

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

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

কেন অন্য ভাষা একই বৈশিষ্ট্যটি প্রয়োগ করে না? ঠিক আছে, কারণ অন্যান্য ভাষা অন্যান্য লোকের কাছ থেকে আসে এবং কীভাবে কীভাবে কাজ করা উচিত সে সম্পর্কে ডিজাইনার / স্রষ্টাদের আলাদা দৃষ্টি রয়েছে।

সর্বোত্তম উত্তর হ'ল আপনার যে কাজটি করা দরকার তা কী করা উচিত এবং আপনাকে খুশি করে তোলে।


0

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.