Projektowanie interfejsu API biblioteki C ++

12

Szukam dobrego zasobu do nauki o dobrym projektowaniu API dla bibliotek C ++, przeglądaniu współdzielonych obiektów / bibliotek dll itp. Istnieje wiele zasobów na temat pisania fajnych API, ładnych klas, szablonów itp. Na poziomie źródła, ale prawie nic o łączenie rzeczy we wspólnych bibliotekach i plikach wykonywalnych. Książki takie jak Large-Scale C ++ Software Design autorstwa John Lakos są interesujące, ale bardzo przestarzałe.

To, czego szukam, to porady dotyczące obsługi szablonów. Dzięki szablonom w moim interfejsie API często kończę na kodzie biblioteki w pliku wykonywalnym (lub innej bibliotece), więc jeśli naprawię tam błąd, nie mogę po prostu uruchomić nowej biblioteki, ale muszę ponownie skompilować i rozprowadzić wszystkich klientów tego kodu. (i tak, znam niektóre rozwiązania, takie jak próba utworzenia przynajmniej najpopularniejszych wersji w bibliotece itp.)

Szukam również innych zastrzeżeń i rzeczy do zapamiętania dla zachowania zgodności binarnej podczas pracy z bibliotekami C ++.

Czy istnieje dobra strona internetowa lub książka na takie tematy?

Johnnes
źródło
Poradziłem sobie z tym w ten sposób: sivut.koti.soon.fi/~terop/GameApi.html - tzn. Gdy w bibliotece znajdują się szablony, żaden z nich nie jest w api ...
tp1
1
std::unique_ptrto całkiem nowe rzeczy. Co Twoim zdaniem było bardziej odpowiednie w proponowanym interfejsie API? Sposób, w jaki musiałeś ręcznie zarządzać wszystkimi zasobami, na przykład praktycznie gwarantując wycieki i podwójne usuwanie? Lub sposób, w jaki wielu twoich typów miało jedną lub dwie litery, uniemożliwiając określenie ich celu?
DeadMG,
1
@ tp1: Ale nie zwracałeś uwagi na to, że sobie z nimi poradziłem. Właśnie powiedziałeś „Radzę sobie z nimi”, nie robiąc nic w tej sprawie. Nie poradziłem sobie z nimi i co teraz? Zamiast używać klasy RAII, która nie dopuszcza takich błędów. Gdybyś użył unique_ptr, nie byłoby możliwe napisanie takiego kodu.
DeadMG,
1
@ tp1: Zauważyłem, że Env można zniszczyć. To prawie wszystko. Wygląda na to, że nie ma żadnej funkcji zarządzania obiektami. Gdybym chciał zarządzać pamięcią bardziej drobnoziarnistą niż „Wszystko, co kiedykolwiek stworzyłem” lub „Nic”, wyglądałoby na to, że jestem wkręcony.
DeadMG,
3
Prosimy o przedłużenie rozmowy na czacie inżynierii oprogramowania . Czy w pytaniu lub odpowiedzi mogą być zawarte przydatne informacje?
ChrisF

Odpowiedzi:

12

W rzeczywistości istnieje książka, której dokładnie szukasz. Jest to odpowiednio wywołanie API Design dla C ++. Witryna książki zawiera kod źródłowy książki oraz Errata .

Inżynier świata
źródło
1
Określone +1 dla książki! Przyszedłem zasugerować to, ale okazało się, że mnie pobiłaś.
zxcdw,
+1: Kończę czytanie tej książki i jest to świetny zasób. Wysoce rekomendowane.
Korchkidu,
3

To jest prawie niemożliwe. Prostym faktem jest to, że czasami potrzebujesz kompilatora do wykonania pracy i nie możesz po prostu zrzucić tej konieczności. Nie ma funkcji, która nie mogłaby tworzyć std::vectorbiblioteki tylko nagłówków. Kompilator może sprawić, że wiele magii zadziała, ale nie możesz ich mieć bez inwokacji, a to fakt.

Oto, co możesz zrobić: nie używaj szablonów tam, gdzie ich nie potrzebujesz. Oto, czego nie możesz zrobić: nic innego.

Prostym faktem jest to, że rekompilacja z nową wersją nie jest tak naprawdę dużym obciążeniem w porównaniu z zaletami wydajności, bezpieczeństwa i funkcjonalności, które można uzyskać dzięki bibliotekom o typie statycznym.

DeadMG
źródło
2
Wspomniałem o tym jako przykład do przemyślenia. to, czego szukam, to wskazówki dotyczące innych podobnych problemów, na które powinienem się przygotować, oraz najlepsze praktyki, aby sobie z nimi poradzić.
johannes
Cóż, jeśli wszystkie nowe wersje naruszające kompatybilność ABI zostaną umieszczone w nowej przestrzeni nazw inline, to czy ma to znaczenie, czy jest to biblioteka tylko w nagłówku, czy nie?
Deduplicator