13.8. راهنمای سبک کدنویسی C++
برخی نکات متفرقه درباره نحوه نوشتن کدهای C++ توسط ما. قالببندی کدهایی که امیدواریم در نهایت به طور خودکار استانداردسازی شوند، بنابراین این بخش آزاد است که صرفاً به دغدغههای سطح بالا بپردازد.
الگوی *-impl.hh
بیایید ابتدا با مقداری اطلاعات پسزمینه شروع کنیم. سرآیندها قرار است حاوی اعلانها باشند، نه تعریفها. این امر به ما اجازه میدهد که یک تعریف را بدون تغییر دادن اعلان، تغییر دهیم و در طول توسعه، ساخت (build) بسیار کوچکی داشته باشیم. با این حال، قالبها (Templates) باید برای محلهای استفاده (use-sites) تخصصیسازی شوند. در غیاب تکنیکهای پیشرفتهتر، قالبها نیازمند این هستند که تعریف آنها — و نه صرفاً اعلانشان — در محلهای استفاده در دسترس باشد تا بتوان آن تخصصیسازی را به صورت on-the-fly به عنوان بخشی از کامپایل کردن آن محلهای استفاده انجام داد. در دسترس قرار دادن تعریفها بدین معناست که آنها را در سرآیندها قرار دهیم، اما این متأسفانه به این معناست که تمام ساختهای اضافی (rebuilds) را که میخواستیم با قرار دادن صرفاً اعلانها در آنجا (همانطور که در بالا توضیح داده شد) از آنها اجتناب کنیم، دریافت میکنیم.
الگوی *-impl.hh یک راه حل جزئی و تا حدودی خشن برای این مشکل است.
این الگو شامل موارد زیر است:
اعلان موارد فقط در
foo.hhاصلی، از جمله قالبها.قرار دادن تعریفهای قالب در یک سرآیند همراه به نام
foo-impl.hh.
بیشتر برنامهنویسان C++ این کار را با گنجاندن foo-impl.hh درون foo.hh همراهی میکنند تا اطمینان حاصل شود که هر فایلی که اعلانهای قالب را دریافت میکند، تعریفهای قالب را نیز دریافت میکند.
اما ما متوجه شدهایم که انجام ندادن این کار مزایایی دارد و معایب آن کمتر از حد تصور است.
واقعیت این است که سرآیندها به ندرت به اندازهٔ ممکن مینیمال هستند؛
اغلب کدهایی وجود دارند که به اعلانهای موجود در سرآیندها نیاز دارند اما به قالبهای درون آنها نیازی ندارند.
با الگوی ما که در آن foo.hh فایل foo-impl.hh را شامل نمیشود، این بدان معناست که آنها میتوانند صرفاً foo.hh را شامل شوند.
کدی که به هر دو نیاز دارد، به سادگی هم foo.hh و هم foo-impl.hh را شامل میشود.
این کار خطاهای لینککردن احتمالی را ممکن میسازد، یعنی زمانی که کدی به آن نیاز دارد ولی فراموش میکند foo-impl.hh را شامل کند، اما این خطاها تنها مختص زمان ساخت (build-time) هستند و به راحتی قابل رفعاند.