Я планирую закодировать библиотеку, которая должна использоваться большинством людей на широком спектре платформ. Что я должен рассмотреть, чтобы правильно его исправить? Чтобы сделать эти вопросы более конкретными, в конце есть четыре "подзапроса".
Выбор языка
Учитывая все известные требования и подробности, я пришел к выводу, что библиотека, написанная на C или С++, - это путь. Я думаю, что основное использование моей библиотеки будет в программах, написанных на C, С++ и Java SE, но я также могу думать о причинах использовать его из Java ME, PHP,.NET, Objective C, Python, Ruby, bash и т.д.. Возможно, я не могу настроить их для всех, но если это возможно, я сделаю это.
Требования
Было бы очень много описать всю цель моей библиотеки здесь, но есть некоторые аспекты, которые могут быть важны для этого вопроса:
- Сама библиотека начнет небольшую, но определенно будет расти до огромной сложности, поэтому не стоит параллельно поддерживать несколько версий.
- Большая часть сложности будет скрыта внутри библиотеки, хотя
- Библиотека построит граф объектов, который сильно используется внутри. Некоторые клиенты библиотеки будут интересоваться только конкретными атрибутами конкретных объектов, в то время как другие клиенты должны каким-то образом пересекать граф объектов.
- Клиенты могут изменять объекты, и библиотека должна быть уведомлена об этом.
- Библиотека может изменять объекты, и клиент должен быть уведомлен об этом, если он уже имеет дескриптор этого объекта
- Библиотека должна быть многопоточной, поскольку она будет поддерживать сетевые подключения к нескольким другим хостам.
- В то время как некоторые запросы к библиотеке могут обрабатываться синхронно, многие из них будут занимать слишком много времени и должны обрабатываться в фоновом режиме и уведомлять клиента об успехе (или сбое)
Конечно, ответы приветствуются независимо от того, отвечают ли они моим конкретным требованиям или отвечают на вопрос в целом, что важно для более широкой аудитории!
Мои предположения, пока
Итак, вот некоторые из моих предположений и выводов, которые я собрал в последние месяцы:
- Внутри я могу использовать все, что захочу, например. С++ с перегрузкой оператора, множественным наследованием, мета-программированием шаблонов... пока есть переносимый компилятор, который его обрабатывает (подумайте о gcc/g++)
- Но мой интерфейс должен быть чистым интерфейсом C, который не связан с изменением имени
- Кроме того, я думаю, что мой интерфейс должен состоять только из функций с базовыми/примитивными типами данных (и, возможно, указателями), переданными как параметры и возвращаемыми значениями
- Если я использую указатели, я думаю, что я должен использовать их только для их возврата в библиотеку, а не для работы непосредственно в указанной памяти
- Для использования в приложении С++ я также могу предложить объектно-ориентированный интерфейс (который также подвержен манипулированию именами, поэтому приложение должно либо использовать один и тот же компилятор, либо включить библиотеку в исходную форму).
- Это также верно для использования в С#?
- Для использования в Java SE/Java EE применяется родной интерфейс Java (JNI). У меня есть некоторые базовые знания об этом, но я определенно должен дважды проверить это.
- Не все языки клиента хорошо обрабатывают многопоточность, поэтому должен быть один поток, разговаривающий с клиентом
- Для использования на Java ME нет такой вещи, как JNI, но я могу пойти с Вложенная виртуальная машина
- Для использования в сценариях bash должен быть исполняемый файл с интерфейсом командной строки
- Для других языков клиента я понятия не имею
- Для большинства языков клиентов было бы неплохо иметь интерфейс адаптера, написанный на этом языке. Я думаю, что есть инструменты для автоматического создания этого для Java и некоторых других.
- Для объектно-ориентированных языков может быть возможно создать объектно-ориентированный адаптер, который скрывает тот факт, что интерфейс к библиотеке основан на функциях, но я не знаю, стоит ли его усилий
Возможные подзапросы
- Это возможно с управляемыми усилиями, или это слишком большая переносимость?
- Есть ли хорошие книги/веб-сайты об этих типах критериев дизайна?
- Являются ли какие-либо из моих допущений неправильными?
- какие библиотеки с открытым исходным кодом стоит изучить, чтобы учиться на их дизайне/интерфейсе/суме?
- meta: Этот вопрос довольно длинный, вы видите какой-либо способ разбить его на несколько более мелких? (Если вы ответите на это, сделайте это как комментарий, а не как ответ)