Некоторое время я задавался вопросом, почему языки, не связанные с C ++ (не уверены, есть ли другие, использующие заголовки), не имеют заголовочных файлов?
Что меня больше всего беспокоит, так это то, что в C ++ я могу кодировать заголовок класса и отправлять его своему партнеру, чтобы скомпилировать другой код против него, в то время как я счастлив, кодируя фактическую реализацию класса в моем собственном темпе.
Как это может быть достигнуто в языках, которые не имеют заголовков? Или, может быть, мне чего-то не хватает в моем понимании?
Как я могу заключить классный контракт с другими коллегами, чтобы оба могли писать в своем темпе? Должен ли я просто создать какой-нибудь фиктивный класс без какой-либо реализации методов, просто с фиктивным возвратом, чтобы удовлетворить эту потребность или как?
Заголовочные файлы унаследованы от того времени, когда компиляторы не обладали достаточными возможностями для компиляции всех ваших исходных файлов без намеков со стороны разработчика.
Современные языки (и в действительности C ++ тоже могут это делать) используют интерфейсы или базовые классы для реализации проектирования по контракту.
C и C ++ — очень старые языки, созданные в то время, когда нужен компилятор предварительная декларация идентификаторов для того, чтобы сделать компиляцию за один проход и минимальное использование памяти (который был основной рассмотрение производительности в то время). Основное назначение файлов заголовков — предоставить эти объявления, чтобы компилятор мог облегчить необходимые настройки стекового фрейма, выделения памяти, проверки типов и т. Д. И т. Д.
Более поздние языки вращаются вокруг «более чистых» языковых структур и получают информацию о том, что C / C ++ нужны заголовки для соглашения, проверки, вывода или их комбинации, за счет некоторой гибкости и производительности. Первое не всегда необходимо, последнее в значительной степени не имеет значения, учитывая производительность систем, которые мы используем сегодня …
Что касается «контракта класса» … в C / C ++, ваша библиотека может определять тысячи функций, и независимо от того, какие из них вы объявили в своем «экспортированном» заголовке, все они доступны и могут быть вызваны напрямую. То же самое относится и к более новым языкам; в принципе, документация занял место декларация (то есть, сделать доступ к этим функциям «простым»), но все они должны быть вызваны в любом случае.
Так технически вам также не нужны заголовки C ++ для «проектирования по контракту». Вы могли бы просто сказать клиенту «объявить void foo( int )
и назовите это «. Современные языки просто удалили посредника и сразу указывают на документы. 😉