Nano Hash - криптовалюты, майнинг, программирование

Профессиональный #include content

Мне нужно создать API, который позволит разработчикам моего клиента использовать проприетарный модуль C, который будет выпущен в виде библиотеки (подумайте .lib или .so, но не исходный код).

Я хотел бы сделать заголовок максимально удобным для разработчиков (так что мне это не понадобится), следуя передовым методам и предоставляя комментарии с описаниями, примерами, предостережениями и т. Д..

Что еще мне следует учитывать с точки зрения бизнеса, техники и здравого смысла?

Спасибо!

10.11.2008

Ответы:


1

Сам заголовочный файл должен быть чистым и аккуратным и, вероятно, минимальным. Он должен указывать, где можно найти документацию. Вероятно, он не должен включать полные примеры (несмотря на некоторые из моих собственных заголовков, которые это делают). Он должен включать основную информацию об авторских правах и лицензии, а также данные об авторе. Он должен содержать только то, что нужно конечным пользователям - ничего, что нужно только разработчикам. Он должен быть автономным; он должен включать любые другие заголовки, необходимые для его работы (чтобы пользователь мог написать «#include "your-header.h"», и код будет компилироваться чисто, даже если это первый или единственный заголовок, который они включают).

Добавлено: заголовок также должен включать некоторую базовую информацию о версии (номер версии файла и дату модификации и / или номер версии продукта и дату выпуска). Это помогает людям смотреть на две версии программного обеспечения, а успешное программное обеспечение выпускается более одного раза.

Добавлено: Адам попросил меня расширить тему «и ничего, что нужно только разработчикам». Это означает, например, что даже несмотря на то, что внутренние функции могут использовать некоторый тип структуры, если ни один из внешних интерфейсов не использует этот тип структуры, то общедоступный заголовок не должен содержать определение этого типа структуры. Он должен быть в частном заголовке, который не распространяется (или распространяется только с полным исходным кодом). Это не должно загрязнять публичный заголовок. Заманчиво сказать: «Но это всего лишь небольшая часть потраченного впустую пространства», и это правильно, но если каждый будет тратить впустую немного места и времени, тогда общие отходы могут стать дорогостоящими.

Ключевым моментом в общедоступном заголовке является то, что он должен содержать все, что нужно пользователю библиотеки (набор функций), и ничего лишнего.

10.11.2008
  • Не могли бы вы пояснить: «разработчикам ничего не нужно» - я полагаю, вы имеете в виду наших разработчиков; вещи, которые нужны разработчикам заказчиков, остались, не так ли? Я надеялся, что кто-то упомянет лицензионные / юридические аспекты. Спасибо! 10.11.2008
  • @Adam: ничего, что нужно только разработчикам, не означает, что люди создают заголовок. В частности, общедоступный заголовок не должен включать никаких определений типов или перечислений (или просто структур или объединений), которые не требуются для явных функций открытого интерфейса (и глобальных переменных, если они у вас есть). 16.11.2008

  • 2

    Один из вариантов - создать документацию API из заголовка, используя (например) Doxygen. Очевидно, вы все равно будете отправлять документы вместе с кодом.

    Это дает вам два преимущества:

    1) Вы не особо беспокоитесь о том, должно ли что-то быть «в документации» или просто «в комментариях в заголовке», потому что изменить одно так же просто, как изменить другое. Так что все идет в документации.

    2) Пользователи с меньшей вероятностью начнут читать ваш файл заголовка, потому что они могут быть достаточно уверены, что все интересующее находится в документации. Но даже если они непоколебимы типа «я не доверяю документам, я читаю код», они все равно видят все, что вы хотите, чтобы они видели.

    Обратной стороной автоматически сгенерированных документов API является то, что они могут быть кошмаром для поиска, поэтому, IMO, стоит приложить дополнительные усилия для написания действительно хорошей «вводной» документации. Это может быть или не быть частью сгенерированной документации API, в зависимости от того, что вы предпочитаете. Для небольшого API просто список всех функций в "логическом", а не в алфавитном или исходном порядке, описанных в соответствии с тем, для чего они для, а не с тем, что они делают, может значительно упростить получить доступ к документации API. Под «логическим» я имею в виду сначала перечислить часто используемые функции в том порядке, в котором их будет вызывать клиент, с сгруппированными вместе альтернативами, которые «делают то же самое» (например, send и sendTo для сокетов). Затем перечислите менее часто используемые функции и, наконец, непонятные вещи для опытных пользователей и необычных вариантов использования.

    Одна из основных трудностей этого подхода, которая может стать препятствием, заключается в том, что в зависимости от вашей организации у вас может быть группа разработчиков документации, и они могут не иметь возможности редактировать заголовок. В лучшем случае они копируют-редактируют то, что вы сделали, а вы вносите изменения и отправляете их обратно. В худшем случае вся идея останавливается, потому что «только команда документации должна писать документацию для клиентов, и она должна быть в стандартном формате, и мы не можем сделать вывод Doxygen в таком формате».

    Что касается того, «что еще вы должны учитывать» - вы уже сказали, что будете следовать лучшим практикам, поэтому сложно добавить много :-)

    10.11.2008
  • На сегодняшний день мы работаем в очень ручном магазине; мы только начинаем изучать автоматизацию. Doxygen находится в моем списке утилит, которые нужно исследовать - вы только что повысили его приоритет. В этом случае нет проблем между разработчиками и техническими писателями. Спасибо! 10.11.2008

  • 3

    Пожалуйста, убедитесь, что вы не (повторно) определяете символы, которые могут быть определены где-либо еще. Я имею в виду не только стандартные имена, пожалуйста, перед всеми символами, объявленными / определенными в общедоступных заголовках, укажите конкретную строку и избегайте любых имен, которые кто-то мог бы когда-либо использовать.

    Я говорю это после того, как увидел слишком много такого безумия в "профессиональных" общедоступных заголовках:

    typedef unsigned short uchar;
    
    11.11.2008
  • Мы даже не будем упоминать некоторые определения ИСТИНА, ЛОЖЬ и МОЖЕТ БЫТЬ, которые мы все видели. Спасибо за хороший совет! 12.11.2008

  • 4

    Другие люди упоминали о проблемах с документацией, поэтому я буду держаться подальше от них :-P. Во-первых, убедитесь, что у вас есть вменяемые охранники. лично мне нравится:

    FILENAME_20081110_H_, в основном имя файла заглавными буквами, затем полная дата, это помогает гарантировать, что оно достаточно уникально, даже если в дереве есть другой заголовок с таким же именем. (Например, вы можете представить себе два config.h, включенные из 2 разных каталогов lib, в которых есть охранники, которые используют CONFIG_H_ или что-то в этом роде, и, таким образом, возникают конфликты. Неважно, что вы выберете, если он, вероятно, будет уникальным .

    Кроме того, если есть какая-либо вероятность, что этот заголовок будет использоваться в проекте C ++, заключите свои заголовки в такие блоки:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    /* your stuff */
    
    #ifdef __cplusplus
    }
    #endif
    

    Это избавит от некоторых головных болей, связанных с проблемами искажения имен, и избавит их от необходимости оборачивать ими заголовок извне.

    10.11.2008
  • Мы остерегаемся множественного включения - хороший совет. Мы также будем следовать вашим предложениям по обеспечению безопасности в будущем. Спасибо! 10.11.2008

  • 5

    Рассмотрите возможность написания отдельной документации. Я думаю, что страницы man / info являются хорошим примером того, какой должна быть документация по API.

    10.11.2008
  • Или напишите документацию в шапку в какой-нибудь грамотной системе программирования. 10.11.2008
  • Отличный момент - мы предоставим документ с подробным описанием API, но также будут полезны страницы man (или .html). Спасибо! 10.11.2008

  • 6

    Подумайте о размещении документации в Интернете в дополнение к тому, что поставляется, и поместите URL-адрес в заголовок. Это позволит некоторым программистам через несколько лет получить доступ к документам, даже если оригиналы были потеряны.

    10.11.2008
  • Это не подходит для данного конкретного случая, но определенно хороший совет для будущего проекта - спасибо! 10.11.2008
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..