Decoupling
এটি শেষ পর্যন্ত আমাদের সংকলক এবং লিঙ্কারগুলির বৈশিষ্ট্যগুলিকে উপেক্ষা করে অত্যন্ত মৌলিক নকশার স্তরে আমার কাছে ডাকাডোল সম্পর্কে। আমি বলতে চাইছি আপনি প্রতিটি শিরোনামকে কেবলমাত্র একটি শ্রেণি সংজ্ঞায়িত করা, পিম্পলগুলি ব্যবহার করতে পারেন, কেবলমাত্র ঘোষিত হওয়া দরকার এমন সংখ্যায় ফরোয়ার্ড ঘোষণা, সংজ্ঞায়িত নয়, এমনকি <iosfwd>
উত্স ফাইলের জন্য একটি শিরোলেখ যেমন সামনের ফরওয়ার্ড ডিক্লেয়ারেশন (উদাহরণ:) রয়েছে এমনগুলিও ব্যবহার করতে পারেন , ঘোষিত / সংজ্ঞায়িত, ইত্যাদির উপর ভিত্তি করে ধারাবাহিকভাবে সিস্টেমটি সংগঠিত করুন etc.
"সংকলন-সময় নির্ভরতা" হ্রাস করার কৌশলগুলি
এবং কিছু কৌশলগুলি বেশ খানিকটা সহায়তা করতে পারে তবে আপনি নিজেকে এই অভ্যাসগুলিকে ক্লান্তিকর অবস্থায় খুঁজে পেতে পারেন এবং এখনও আপনার সিস্টেমে আপনার গড় উত্স ফাইলটি দুটি পৃষ্ঠার উপস্থাপকের প্রয়োজন রয়েছে #include
যদি আপনি আপনার ইন্টারফেস ডিজাইনে যৌক্তিক নির্ভরতা হ্রাস না করে শিরোলেখের স্তরে কমপ্লাই-টাইম নির্ভরতা হ্রাস করার বিষয়ে খুব বেশি ফোকাস রাখেন এবং আকাশে শৃঙ্খলাবদ্ধ শিরোনামকে কঠোরভাবে বললে, আমি আকাশছোঁয়া বিল্ড টাইমের সাথে কিছুটা অর্থবহ কিছু করার নির্দেশনা দেয় I 'এখনও বলছি এটি বাস্তবে উত্পাদনশীলতার সাথে একই ধরনের ক্ষতিকারক সমস্যাগুলিকে অনুবাদ করে। দিনের শেষে যদি আপনার সংকলন ইউনিটগুলিতে কিছু করার জন্য এখনও একটি নৌকা বোঝা তথ্য প্রয়োজন হয়, তবে এটি বিল্ডিং সময়গুলিতে বৃদ্ধি করতে এবং আপনার সম্ভাব্য পিছনে ফিরে যাওয়ার কারণগুলি এবং বহুগুণে বিকাশকারীদের তৈরি করার সময় অনুবাদ করতে চলেছে transla তারা মনে করে যে তারা কেবল তাদের প্রতিদিনের কোডিং শেষ করার জন্য সিস্টেমটি হেডবুট করছে। এটা '
আপনি উদাহরণস্বরূপ, প্রতিটি উপ-সিস্টেমকে একটি খুব বিমূর্ত শিরোনাম ফাইল এবং ইন্টারফেস সরবরাহ করতে পারেন। তবে যদি সাবসিস্টেমগুলি একে অপরের থেকে ডুপ্লল না হয়ে থাকে, তবে কাজ করার জন্য কোনও গণ্ডগোলের মতো দেখায় এমন নির্ভরতা গ্রাফের সাথে অন্য সাবসিস্টেম ইন্টারফেসের উপর নির্ভর করে আপনি আবার সাবসিস্টেম ইন্টারফেসের সাথে আবার স্প্যাগেটির অনুরূপ কিছু পাবেন।
বাহ্যিক প্রকারে ঘোষণা ফরোয়ার্ড করুন
প্রাক্তন কোডবেসটি তৈরি করতে দুই ঘন্টা সময় লাগার চেষ্টা করার জন্য আমি ক্লান্ত হয়ে পড়েছিলাম যদিও বিকাশকারীরা মাঝে মাঝে আমাদের বিল্ড সার্ভারগুলিতে সিআই-তে ফিরে যাওয়ার জন্য 2 দিন অপেক্ষা করেছিলেন (আপনি প্রায় সেই বিল্ডিং মেশিনগুলিকে বোঝার উত্সাহিত পশু হিসাবে ভেবে দেখতে পারেন) বিকাশকারীরা তাদের পরিবর্তনগুলি ধাক্কা দেওয়ার সময় ধরে রাখতে এবং ব্যর্থ হওয়ার জন্য), আমার কাছে সবচেয়ে প্রশ্নবিদ্ধ ছিল অন্যান্য শিরোলেখগুলিতে সংজ্ঞায়িত প্রকারগুলি ঘোষণা করার জন্য এগিয়ে ছিল। এবং আমি এই কোডবেসটিকে 40 মিনিট বা তারও বেশি সময় ধরে সামান্য বর্ধনমূলক পদক্ষেপে করার পরে "শিরোলেখের স্প্যাগেটি" হ্রাস করার চেষ্টা করার চেষ্টা করেছি, যা হ্যান্ডসাইটের সবচেয়ে প্রশ্নবিদ্ধ অভ্যাস ছিল (যেহেতু আমাকে মৌলিক প্রকৃতির দৃষ্টিশক্তি হারিয়ে ফেলেছে) শিরোনাম আন্তঃনির্ভরতার উপর সুড়ঙ্গ দেখার সময় ডিজাইন করা ছিল) অন্যান্য শিরোনামগুলিতে সংজ্ঞায়িত ধরণের ফরোয়ার্ড ছিল।
আপনি যদি এমন একটি Foo.hpp
শিরোনাম কল্পনা করেন তবে এর মতো কিছু রয়েছে:
#include "Bar.hpp"
এবং এটি কেবল Bar
শিরোনামে এমনভাবে ব্যবহার করে যাতে এর ঘোষণার প্রয়োজন হয়, সংজ্ঞা নয়। তারপরে এটি শিরোনামের class Bar;
সংজ্ঞাটি Bar
দৃশ্যমান হওয়া এড়াতে কোনও মস্তিষ্কের মত ঘোষণা করার মতো মনে হতে পারে । অনুশীলন ছাড়া প্রায়শই আপনি বেশিরভাগ সংকলন ইউনিট খুঁজে পাবেন যা Foo.hpp
এখনও তাদের উপরে নিজেকে Bar
অন্তর্ভুক্ত করার অতিরিক্ত বোঝা দিয়ে যে কোনও উপায়ে সংজ্ঞায়িত করা দরকার , অথবা আপনি এমন কোনও দৃশ্যে চলে যান যেখানে এটি সত্যিকারের সাহায্য করে এবং 99 আপনার সংকলন ইউনিটগুলির%% অন্তর্ভুক্ত ব্যতীত কাজ করতে পারে , তবে এটি কেন আরও মৌলিক নকশার প্রশ্ন উত্থাপন করে (বা কমপক্ষে আমি মনে করি এটি আজকাল হওয়া উচিত) কেন তাদের ঘোষণাপত্রটি এমনকি কেন দেখার প্রয়োজন এবং কেনBar.hpp
Foo.hpp
Bar.hpp
Bar
Foo
এমনকি এটি সর্বাধিক ব্যবহারের ক্ষেত্রে অপ্রাসঙ্গিক হলে এটি সম্পর্কে উদ্বিগ্ন হওয়া প্রয়োজন (কেন সর্বাধিক ব্যবহারের ক্ষেত্রে নির্ভরশীলতার সাথে নকশার বোঝা কেন?)।
কারণ ধারণার দিক থেকে আমরা সত্যিই পৃথক নি Foo
থেকে Bar
। আমরা সবেমাত্র এটি তৈরি করেছি যাতে শিরোলেখটির শিরোলেখক Foo
সম্পর্কে তত বেশি তথ্যের প্রয়োজন হয় না Bar
এবং এটি এমন ডিজাইনের মতো প্রায় পর্যাপ্ত নয় যা এই দুটি একে অপরের থেকে সম্পূর্ণ স্বাধীন করে তোলে।
এম্বেড স্ক্রিপ্টিং
এটি সত্যিই বৃহত্তর স্কেল কোডবেসের জন্য তবে অন্য যে কৌশলটি আমি অত্যন্ত কার্যকর বলে মনে করি তা হ'ল আপনার সিস্টেমের কমপক্ষে উচ্চ-স্তরের অংশগুলির জন্য একটি এম্বেডড স্ক্রিপ্টিং ভাষা ব্যবহার করা। আমি দেখতে পেলাম যে আমি লুয়াকে এম্বেড করতে সক্ষম হয়েছি এবং এটি আমাদের সিস্টেমে সমস্ত কমান্ড কল করতে একইভাবে সক্ষম হয়েছি (কমান্ডগুলি বিমূর্ত ছিল, ধন্যবাদ জানাই)। দুর্ভাগ্যক্রমে আমি এমন এক রাস্তা অবরোধ করে গিয়েছিলাম যেখানে ডিভগুলি অন্য ভাষার প্রবর্তনকে অবিশ্বস্ত করেছিল এবং সম্ভবত সবচেয়ে উদ্ভটভাবে তাদের সবচেয়ে বড় সন্দেহ হিসাবে অভিনয় দিয়েছিল। তবুও আমি অন্যান্য উদ্বেগগুলি বুঝতে পারার সময়, পারফরম্যান্সটি একটি অ-ইস্যু হওয়া উচিত যদি আমরা যখন ব্যবহারকারীরা বোতামগুলি ক্লিক করেন তখন কমান্ডগুলি আহ্বান করতে স্ক্রিপ্টটি ব্যবহার করি, উদাহরণস্বরূপ, যা তাদের নিজস্ব কোনও লুপ সঞ্চালন করে না (আমরা কী করার চেষ্টা করছি, একটি বোতাম ক্লিকের জন্য প্রতিক্রিয়া সময়ে ন্যানোসেকেন্ড পার্থক্য সম্পর্কে উদ্বেগ?)
উদাহরণ
এদিকে সবচেয়ে কার্যকর উপায় আমি কখনো কৌশল ক্লান্তিকর বৃহৎ codebases মধ্যে কম্পাইল বার কমাতে পর সাক্ষী করেছি আর্কিটেকচারের যা হয় সত্যি সত্যি কাজ সিস্টেমের মধ্যে যে কোনো একটি জিনিসের জন্য প্রয়োজনীয় তথ্য পরিমাণ হ্রাস, শুধু একটি কম্পাইলার থেকে অন্য এক হেডার decoupling না দৃষ্টিভঙ্গি তবে এই ইন্টারফেসগুলির ব্যবহারকারীদের জেনে যাওয়ার সময় তাদের যা করা দরকার তা করা প্রয়োজন (উভয় মানব এবং সংকলক দৃষ্টিকোণ থেকে, সত্য সংক্ষিপ্ত বিবরণ যা সংকলক নির্ভরতার বাইরে চলে যায়) কেবল সর্বনিম্ন।
ইসিএস কেবল একটি উদাহরণ (এবং আমি আপনাকে এটি ব্যবহার করার পরামর্শ দিচ্ছি না), তবে এটির মুখোমুখি হ'ল আমাকে প্রমাণিত হয়েছে যে আপনি সত্যিকারের কিছু মহাকাব্য কোডবেস পেতে পারেন যা এখনও খুব খুশীভাবে টেমপ্লেট এবং প্রচুর অন্যান্য গুডি ব্যবহারের সময় অবাক করে দেয় কারণ ইসিএস দ্বারা, প্রকৃতি, একটি খুব decoupled আর্কিটেকচার তৈরি করে যেখানে সিস্টেমগুলি কেবল ECS ডাটাবেস সম্পর্কে জানতে পারে এবং সাধারণত তাদের কাজটি করার জন্য কেবল কয়েক মুঠো উপাদান উপাদান (কখনও কখনও কেবল একটি):
ডিজাইন, ডিজাইন, ডিজাইন
এবং আপনার কোডবেস বাড়ার সাথে সাথে বেড়ে ওঠার সাথে সাথে উপরে উল্লিখিত যে কোনও কৌশলগুলির তুলনায় কমপাইল-টাইপ হ্রাস করার ক্ষেত্রে মানবিক, ধারণাগত স্তরে এই ধরণের ডিকپلড আর্কিটেকচারাল ডিজাইনগুলি আরও কার্যকর, কারণ সেই বৃদ্ধিটি আপনার গড় হিসাবে অনুবাদ করে না সংকলন ও কাজের সময় সংযোগের সময় প্রয়োজনীয় পরিমাণে গুণমান সংকলন ইউনিট (যে কোনও সিস্টেমের জন্য আপনার গড় বিকাশকারীকে কিছু করার জন্য একটি বোতল বোঝা অন্তর্ভুক্ত করতে প্রয়োজন সেগুলিও প্রয়োজন এবং কেবল সংকলককে কিছু করার জন্য বিশাল পরিমাণের তথ্য সম্পর্কে জানার দরকার নেই )। এটি বিল্ড টাইম হ্রাস এবং অপরিবর্তনীয় শিরোলেখগুলির চেয়ে আরও বেশি সুবিধা রয়েছে কারণ এটির অর্থ হ'ল আপনার বিকাশকারীদের সাথে কিছু করার জন্য তাত্ক্ষণিক প্রয়োজনীয়তার বাইরেও সিস্টেম সম্পর্কে বেশি কিছু জানতে হবে না।
উদাহরণস্বরূপ, যদি আপনি আপনার এএএ গেমের জন্য একটি পদার্থবিজ্ঞান ইঞ্জিন বিকাশের জন্য একজন বিশেষজ্ঞ পদার্থবিজ্ঞান বিকাশকারীকে নিয়োগ করতে পারেন যা কয়েক মিলিয়ন এলওসি ছড়িয়ে পড়ে, এবং ধরণের ন্যূনতম ন্যূনতম তথ্য জানার সময় এবং প্রকার এবং ইন্টারফেসের মতো জিনিসগুলি উপলব্ধ করার জন্য তিনি খুব দ্রুত শুরু করতে পারেন available পাশাপাশি আপনার সিস্টেমের ধারণাগুলি, তারপরে স্বভাবতই তাঁর পদার্থবিজ্ঞানের ইঞ্জিন তৈরির জন্য তাঁর এবং সংকলক উভয়ের জন্য তথ্য হ্রাসের পরিমাণে অনুবাদ করতে চলেছে এবং একইভাবে বিল্ড টাইমগুলিতে একটি বিরাট হ্রাসকে অনুবাদ করবে যখন স্পষ্টভাবে বোঝা যাচ্ছে যে স্প্যাগেটির অনুরূপ কিছুই নেই lying সিস্টেমের যে কোনও জায়গায়। এবং এটিই আমি এই সমস্ত কৌশলগুলির চেয়ে অগ্রাধিকার দেওয়ার পরামর্শ দিচ্ছি: আপনি কীভাবে আপনার সিস্টেমগুলি ডিজাইন করেন। ক্লান্তিকর অন্যান্য কৌশলগুলি যদি আপনি এটি করার সময় করেন তবে উপরের দিকে আইসিং থাকবে, অন্যথায়,