আমি কীভাবে হেডার হেলকে আটকাতে পারি?


44

আমরা স্ক্র্যাচ থেকে একটি নতুন প্রকল্প শুরু করছি। চারটি বা পাঁচটি উত্স ফাইল সহ প্রায় আটটি বিকাশকারী, এক ডজন বা আরও উপ-সিস্টেম।

"হেডার হেল্ক", একেএ "স্প্যাগেটি শিরোলেখ" রোধ করতে আমরা কী করতে পারি?

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

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

এটি একটি সি ++ প্রকল্প হবে তবে সি তথ্য ভবিষ্যতের পাঠকদের সহায়তা করবে।


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

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

1
আমি নিশ্চিত যে আমি আপনার সাথে আগে কাজ করেছি। প্রায়শ :-(
মাওগ

5
আপনি যা বর্ণনা করছেন তা কোনও বড় প্রকল্প নয়। ভাল ডিজাইন সর্বদা স্বাগত, তবে আপনি কখনও "বৃহত্তর স্কেল সিস্টেম" সমস্যার মুখোমুখি হতে পারেন না।
স্যাম

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

উত্তর:


39

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

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

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


যেখানে এটি জটিল হয়ে ওঠে তা হ'ল ক্রস-সাবসিস্টেম ফাংশন কলগুলি, অন্য সাবসিস্টেমটিতে প্রকারের পরামিতিগুলি ঘোষণা করা হয়।
মাওগ

6
কৌতুকপূর্ণ বা না, "# অন্তর্ভুক্ত <সাবসিস্টেম 1.h>" সংকলন করা উচিত। আপনি কীভাবে তা অর্জন করবেন you @ ফ্র্যাঙ্কপুফার: কেন?
gnasher729

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

8
শিরোনামটি স্বতন্ত্র হওয়ার বিষয়টি নিশ্চিত করার জন্য একটি ভাল কৌশলটির একটি নিয়ম রয়েছে যে উত্স ফাইলটিতে সর্বদা তার নিজস্ব শিরোনামটি আগে অন্তর্ভুক্ত থাকে । এটি আপনার ক্ষেত্রে নির্ভরতা স্থানান্তর করতে হবে এমন ক্ষেত্রে হোল্ডার ফাইলের মধ্যে বাস্তবায়ন ফাইলের বাইরে অন্তর্ভুক্ত রয়েছে catch
doug65536

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

18

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

আপনি এটিকে অন্যভাবেও দেখতে পারেন: আপনার প্রকল্পটিতে ইতিমধ্যে যদি শিরোনাম হয় তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে সফ্টওয়্যার নকশাটি উন্নত করা দরকার।

আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে:

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

12

নির্ভরতা হ্রাস করার লাইন ধরে অন্যান্য প্রস্তাবনার পাশাপাশি (মূলত সি ++ এর ক্ষেত্রে প্রযোজ্য):

  1. কেবলমাত্র আপনার যা প্রয়োজন সেখানে অন্তর্ভুক্ত করুন যেখানে আপনার এটি প্রয়োজন (সর্বনিম্ন স্তরের সম্ভব)। E. g। যদি আপনার কেবলমাত্র উত্সে কলগুলির প্রয়োজন হয় তবে কোনও শিরোনামে অন্তর্ভুক্ত করবেন না।
  2. যেখানেই সম্ভব হেডারগুলিতে ফরোয়ার্ড ডিক্লেয়ারেশন ব্যবহার করুন (শিরোনামটিতে কেবলমাত্র অন্য পর্বের পয়েন্টার বা রেফারেন্স রয়েছে)।
  3. প্রতিটি রিফ্যাক্টরিংয়ের পরে অন্তর্ভুক্তগুলি পরিষ্কার করুন (তাদের মন্তব্য করুন, সংকলন ব্যর্থ হয় তা দেখুন, সেখানে সেখানে সরান, এখনও মন্তব্য করা লাইনগুলি অন্তর্ভুক্ত করুন)।
  4. একই ফাইলে খুব বেশি সাধারণ সুবিধাদি প্যাক করবেন না; এগুলি কার্যকারিতা দ্বারা বিভক্ত করুন (উদাঃ লগার একটি শ্রেণি, সুতরাং একটি শিরোনাম এবং একটি উত্স ফাইল; সিস্টেমহেল্পার ডিটো ইত্যাদি)))
  5. ওও নীতিগুলিতে আটকে থাকুন, এমনকি আপনার প্রাপ্ত সমস্ত কিছুই সম্পূর্ণ স্ট্যাটিক পদ্ধতির (স্ট্যান্ডেলোন ফাংশনগুলির পরিবর্তে) সমন্বিত একটি শ্রেণি - বা পরিবর্তে একটি নেমস্পেস ব্যবহার করুন
  6. নির্দিষ্ট সাধারণ সুবিধার জন্য সিঙ্গলটন প্যাটার্নটি বরং দরকারী, কারণ আপনাকে অন্য কোনও সম্পর্কযুক্ত সম্পর্কযুক্ত বস্তুর কাছ থেকে উদাহরণটির অনুরোধ করতে হবে না।

5
# 3-এ, সরঞ্জামটি অন্তর্ভুক্ত করে - আপনি কী ব্যবহার করতে পারেন তা অনুমান-এবং-চেক ম্যানুয়াল পুনঃসংশোধন পদ্ধতির এড়ানো।
আরএম

1
এই প্রসঙ্গে সিলেটলেটগুলির সুবিধা কী তা আপনি ব্যাখ্যা করতে পারেন? আমি সত্যিই এটি পাই না।
ফ্র্যাঙ্ক পাফার

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

1
# 2 (ফরোয়ার্ড ঘোষণা) সংকলন সময় এবং নির্ভরতা যাচাইয়ে একটি বিশাল পার্থক্য করতে পারে। এই উত্তরটি ( স্ট্যাকওভারফ্লো.com / a / 9999752 / 509928 ) দেখায়, এটি সি ++ এবং সি উভয়ের জন্যই প্রযোজ্য
ডেভ কমপটন

3
মান দ্বারা পাস করার সময় আপনি ফরোয়ার্ড ডিক্লেয়ারেশনগুলি ব্যবহার করতে পারেন, যতক্ষণ না ফাংশনটি ইনলাইনটি সংজ্ঞায়িত করা না হয়। একটি ফাংশন ঘোষণা কোনও প্রসঙ্গ নয় যেখানে পূর্ণ টাইপ সংজ্ঞা প্রয়োজন (একটি ফাংশন সংজ্ঞা বা ফাংশন কল যেমন একটি প্রসঙ্গ)।
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

6

উত্স ফাইল প্রতি এক শিরোনাম, যা এর উত্স ফাইলটি প্রয়োগ করে / রফতানি করে তা নির্ধারণ করে।

প্রতিটি সোর্স ফাইলে অন্তর্ভুক্ত প্রয়োজনীয় যতগুলি শিরোলেখ ফাইল (তার নিজস্ব শিরোনাম দিয়ে শুরু)।

অন্যান্য হেডার ফাইলের মধ্যে (অন্তর্ভুক্তিকে হ্রাস করুন) অন্তর্ভুক্ত করবেন না (বৃত্তাকার নির্ভরতা এড়াতে)। বিশদগুলির জন্য এই উত্তরটি দেখুন "দুটি শ্রেণি কি সি ++ ব্যবহার করে একে অপরকে দেখতে পাবে?"

লাকোস দ্বারা লার্জ-স্কেল সি ++ সফ্টওয়্যার ডিজাইন এই বিষয়ে একটি সম্পূর্ণ বই আছে । এটি সফ্টওয়্যারটির "স্তর" রয়েছে তা বর্ণনা করে: উচ্চ-স্তরের স্তরগুলি নিম্ন স্তরের স্তরগুলি বিপরীতভাবে ব্যবহার করে না, যা আবার বিজ্ঞপ্তি নির্ভরতা এড়িয়ে চলে।


4

আমি দাবি করব যে আপনার প্রশ্নটি মৌলিকভাবে অযোগ্য অযোগ্য, যেহেতু এখানে দুটি ধরণের শিরোলেখ রয়েছে:

  • আপনি যেখানে দশ মিলিয়ন আলাদা আলাদা শিরোনাম অন্তর্ভুক্ত করতে পারেন এবং नरकात যারা এই সমস্ত কি মনে রাখতে পারে? এবং হেডারগুলির সেই তালিকাগুলি বজায় রাখবেন? বিতৃষ্ণা।
  • আপনি যেখানে একটি জিনিস অন্তর্ভুক্ত করেছেন সেই ধরণের এবং আপনি বাবেলের পুরো টাওয়ারটি অন্তর্ভুক্ত করেছেন (বা আমি বোস্টের টাওয়ার বলতে পারি? ...)

জিনিসটি হ'ল, যদি আপনি প্রাক্তনটিকে এড়িয়ে চলার চেষ্টা করেন তবে আপনি কিছুটা হলেও শেষোক্ত এবং তদ্বিপরীত।

তৃতীয় ধরণের নরকও রয়েছে, যা বৃত্তাকার নির্ভরতা। এগুলি পপ আপ হতে পারে যদি আপনি সাবধান না হন ... এড়ানো এড়াও জটিল-জটিল নয়, তবে কীভাবে এটি করবেন তা চিন্তা করার জন্য আপনার সময় নিতে হবে। জন লাকোস সিপ্পিসন ২০১ Level (বা কেবল স্লাইডগুলি ) -র স্তরেরীকরণের বিষয়ে আলাপ দেখুন ।


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

2
@ নেপালি: আমার অর্থ কোডের নয়, শিরোনামগুলির বিজ্ঞপ্তি নির্ভরতা এড়ানো ছিল ... আপনি যদি বিজ্ঞপ্তি শিরোনাম নির্ভরতা এড়াতে না পারেন তবে আপনি সম্ভবত তৈরি করতে পারবেন না। তবে হ্যাঁ, পয়েন্ট নেওয়া হয়েছে, +1।
einpoklum - মনিকা

1

Decoupling

এটি শেষ পর্যন্ত আমাদের সংকলক এবং লিঙ্কারগুলির বৈশিষ্ট্যগুলিকে উপেক্ষা করে অত্যন্ত মৌলিক নকশার স্তরে আমার কাছে ডাকাডোল সম্পর্কে। আমি বলতে চাইছি আপনি প্রতিটি শিরোনামকে কেবলমাত্র একটি শ্রেণি সংজ্ঞায়িত করা, পিম্পলগুলি ব্যবহার করতে পারেন, কেবলমাত্র ঘোষিত হওয়া দরকার এমন সংখ্যায় ফরোয়ার্ড ঘোষণা, সংজ্ঞায়িত নয়, এমনকি <iosfwd>উত্স ফাইলের জন্য একটি শিরোলেখ যেমন সামনের ফরওয়ার্ড ডিক্লেয়ারেশন (উদাহরণ:) রয়েছে এমনগুলিও ব্যবহার করতে পারেন , ঘোষিত / সংজ্ঞায়িত, ইত্যাদির উপর ভিত্তি করে ধারাবাহিকভাবে সিস্টেমটি সংগঠিত করুন etc.

"সংকলন-সময় নির্ভরতা" হ্রাস করার কৌশলগুলি

এবং কিছু কৌশলগুলি বেশ খানিকটা সহায়তা করতে পারে তবে আপনি নিজেকে এই অভ্যাসগুলিকে ক্লান্তিকর অবস্থায় খুঁজে পেতে পারেন এবং এখনও আপনার সিস্টেমে আপনার গড় উত্স ফাইলটি দুটি পৃষ্ঠার উপস্থাপকের প্রয়োজন রয়েছে #includeযদি আপনি আপনার ইন্টারফেস ডিজাইনে যৌক্তিক নির্ভরতা হ্রাস না করে শিরোলেখের স্তরে কমপ্লাই-টাইম নির্ভরতা হ্রাস করার বিষয়ে খুব বেশি ফোকাস রাখেন এবং আকাশে শৃঙ্খলাবদ্ধ শিরোনামকে কঠোরভাবে বললে, আমি আকাশছোঁয়া বিল্ড টাইমের সাথে কিছুটা অর্থবহ কিছু করার নির্দেশনা দেয় I 'এখনও বলছি এটি বাস্তবে উত্পাদনশীলতার সাথে একই ধরনের ক্ষতিকারক সমস্যাগুলিকে অনুবাদ করে। দিনের শেষে যদি আপনার সংকলন ইউনিটগুলিতে কিছু করার জন্য এখনও একটি নৌকা বোঝা তথ্য প্রয়োজন হয়, তবে এটি বিল্ডিং সময়গুলিতে বৃদ্ধি করতে এবং আপনার সম্ভাব্য পিছনে ফিরে যাওয়ার কারণগুলি এবং বহুগুণে বিকাশকারীদের তৈরি করার সময় অনুবাদ করতে চলেছে transla তারা মনে করে যে তারা কেবল তাদের প্রতিদিনের কোডিং শেষ করার জন্য সিস্টেমটি হেডবুট করছে। এটা '

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

বাহ্যিক প্রকারে ঘোষণা ফরোয়ার্ড করুন

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

আপনি যদি এমন একটি Foo.hppশিরোনাম কল্পনা করেন তবে এর মতো কিছু রয়েছে:

#include "Bar.hpp"

এবং এটি কেবল Barশিরোনামে এমনভাবে ব্যবহার করে যাতে এর ঘোষণার প্রয়োজন হয়, সংজ্ঞা নয়। তারপরে এটি শিরোনামের class Bar;সংজ্ঞাটি Barদৃশ্যমান হওয়া এড়াতে কোনও মস্তিষ্কের মত ঘোষণা করার মতো মনে হতে পারে । অনুশীলন ছাড়া প্রায়শই আপনি বেশিরভাগ সংকলন ইউনিট খুঁজে পাবেন যা Foo.hppএখনও তাদের উপরে নিজেকে Barঅন্তর্ভুক্ত করার অতিরিক্ত বোঝা দিয়ে যে কোনও উপায়ে সংজ্ঞায়িত করা দরকার , অথবা আপনি এমন কোনও দৃশ্যে চলে যান যেখানে এটি সত্যিকারের সাহায্য করে এবং 99 আপনার সংকলন ইউনিটগুলির%% অন্তর্ভুক্ত ব্যতীত কাজ করতে পারে , তবে এটি কেন আরও মৌলিক নকশার প্রশ্ন উত্থাপন করে (বা কমপক্ষে আমি মনে করি এটি আজকাল হওয়া উচিত) কেন তাদের ঘোষণাপত্রটি এমনকি কেন দেখার প্রয়োজন এবং কেনBar.hppFoo.hppBar.hppBarFoo এমনকি এটি সর্বাধিক ব্যবহারের ক্ষেত্রে অপ্রাসঙ্গিক হলে এটি সম্পর্কে উদ্বিগ্ন হওয়া প্রয়োজন (কেন সর্বাধিক ব্যবহারের ক্ষেত্রে নির্ভরশীলতার সাথে নকশার বোঝা কেন?)।

কারণ ধারণার দিক থেকে আমরা সত্যিই পৃথক নি Fooথেকে Bar। আমরা সবেমাত্র এটি তৈরি করেছি যাতে শিরোলেখটির শিরোলেখক Fooসম্পর্কে তত বেশি তথ্যের প্রয়োজন হয় না Barএবং এটি এমন ডিজাইনের মতো প্রায় পর্যাপ্ত নয় যা এই দুটি একে অপরের থেকে সম্পূর্ণ স্বাধীন করে তোলে।

এম্বেড স্ক্রিপ্টিং

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

উদাহরণ

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

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

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

ডিজাইন, ডিজাইন, ডিজাইন

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

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


1
একটি দুর্দান্ত উত্তর! Althoguh আমি আবিষ্কার কি একটু খনন ছিল pimpls হয় :-)
Mawg

0

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

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

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

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

আপনি যা চান তা হ'ল প্রতিটি উপ-সিস্টেম এবং ফাইলের জন্য এটির জন্য প্রধান দায়িত্বরত সনাক্ত করা।

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

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

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

লক্ষ্য করুন যে সি ++ তে, মানক শিরোনাম ফাইলগুলি প্রচুর কোড টানছে । উদাহরণস্বরূপ #include <vector>লিনাক্সে (18100 লাইন) আমার জিসিসি 6 তে দশ হাজারেরও বেশি লাইন টানছে। এবং #include <map> প্রায় 40KLOC এ প্রসারিত হয়। অতএব, যদি আপনার কাছে স্ট্যান্ডার্ড শিরোনাম সহ অনেকগুলি ছোট শিরোনাম ফাইল থাকে তবে আপনি বিল্ড চলাকালীন অনেক হাজার লাইনের পুনঃ-পার্সিং শেষ করেন এবং আপনার সংকলনের সময়টি ভোগে। এ কারণেই আমার কাছে অনেকগুলি ছোট সি ++ উত্স লাইন রয়েছে (সর্বাধিক কয়েকশ লাইনের), তবে কম তবে বৃহত্তর সি ++ ফাইল রয়েছে (বেশ কয়েক হাজার লাইনের) favor

(সুতরাং সর্বদা অপ্রত্যক্ষভাবে অন্তর্ভুক্ত রয়েছে শত শত ছোট সি ++ ফাইল থাকা- বেশ কয়েকটি মানক শিরোনাম ফাইল বিশাল বিল্ড সময় দেয় যা বিকাশকারীদের বিরক্ত করে)

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

অনুপ্রেরণার জন্য, বিদ্যমান ফ্রি সফ্টওয়্যার প্রকল্পগুলির পূর্ব অনুশীলনের ক্ষেত্রেও দেখুন (উদাহরণস্বরূপ গিথুব )।

লক্ষ্য করুন যে নির্ভরতাগুলি একটি ভাল বিল্ড অটোমেশন সিস্টেমের সাথে মোকাবিলা করা যেতে পারে । জিএনইউ মেকের ডকুমেন্টেশন অধ্যয়ন করুনজিসিসিতে বিভিন্ন -Mপ্রিপ্রোসেসর পতাকা সম্পর্কে সচেতন হন (স্বয়ংক্রিয়ভাবে নির্ভরতা তৈরি করতে দরকারী)।

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

("শিরোলেখ হেল্প" - আপনার জন্য প্রয়াসগুলি ফোকাস করবেন না - যা আপনার পক্ষে একটি নন-ইস্যু - তবে একটি ভাল আর্কিটেকচার ডিজাইনে তাদের ফোকাস করবেন না))


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

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