Jak zdefiniować dobre lub złe API? [zamknięte]

Background:

Chodzę na zajęcia na mojej uczelni o nazwie "Software Constraints". Na pierwszych wykładach uczyliśmy się jak budować dobre API.

Dobrym przykładem naprawdę złej funkcji API jest gniazdo public static void Select(IList checkRead, IList checkWrite, IList checkError, int microseconds); W C#. Funkcja otrzymuje 3 listy gniazd i niszczy je, przez co użytkownik musi sklonować wszystkie gniazda przed przekazaniem ich do Select(). Posiada również timeout (w mikrosekundach), który jest int, który ustawia maksymalny czas oczekiwania serwera na gniazdo. Limity tego to + / -35 minut (ponieważ jest to int).


Pytania:

  1. Jak zdefiniować API jako "źle"?
  2. Jak zdefiniować API jako "dobre"?

Punkty do rozważenia:

  • nazwy funkcji, które są trudne do zapamiętania.
  • parametry funkcji, które są trudne do zrozumienia.
  • zła dokumentacja.
  • Wszystko jest tak połączone, że jeśli chcesz zmienić 1 linijkę kodu, możesz będzie musiał zmienić setki linii w innych miejscach.
  • Funkcje niszczące ich argumenty.
  • zła skalowalność z powodu "ukrytej" złożoności.
  • od użytkownika/dewelopera wymagane jest zbudowanie wrapperów wokół API, aby można było z niego korzystać.
Author: fmsf, 2009-01-22

14 answers

W projektowaniu API zawsze uważałem ten keynote za bardzo pomocny:
Jak zaprojektować dobre API i dlaczego ma to znaczenie-by Joshua Bloch

Oto fragment, polecam przeczytać całość / obejrzeć film.

II. Zasady ogólne

  • API powinno zrobić jedną rzecz i zrobić to dobrze
  • API powinno być jak najmniejsze, ale nie mniejsze
  • implementacja nie powinna mieć wpływu na API
  • Minimalizuj Dostępność wszystkiego
  • imiona mają znaczenie-API to mały język
  • Dokumentacja Ma Znaczenie
  • Dokument
  • rozważmy konsekwencje wydajnościowe decyzji projektowych API
  • wpływ decyzji projektowych API na wydajność jest rzeczywisty i trwały
  • API musi spokojnie współistnieć z platformą

III. konstrukcja klasy

  • Minimalizuj Zmienność
  • podklasa tylko tam, gdzie ma to sens
  • wzór i dokument do dziedziczenia albo inaczej go zabronić

IV. projektowanie metod

  • nie zmuszaj Klienta do niczego, co mógłby zrobić moduł
  • nie naruszaj zasady najmniejszego zdziwienia
  • Fail Fast-zgłaszaj błędy jak najszybciej po ich wystąpieniu
  • zapewnić programowy dostęp do wszystkich danych dostępnych w postaci ciągu
  • Overload With Care
  • użyj odpowiednich typów parametrów i ZWROTÓW
  • Użyj Spójnego Porządkowania Parametrów W Różnych Metodach
  • Unikaj Długich List Parametrów
  • unikaj zwracanych wartości, które wymagają wyjątkowego przetwarzania
 103
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:30:37

Nie musisz czytać dokumentacji, aby poprawnie z niej korzystać.

Znak awesome API.

 36
Author: Quibblesome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:12:12

Wiele standardów kodowania i dłuższe dokumenty, a nawet książki (Framework Design Guidelines) zostało napisanych na ten temat, ale wiele z tego pomaga tylko na dość niskim poziomie.

Jest też kwestia gustu. APIs może przestrzegać każdej reguły w jakimkolwiek zbiorze przepisów i nadal jest do bani, ze względu na niewolnicze przestrzeganie różnych modnych ideologii. Ostatnim winowajcą jest orientacja wzorca, w którym wzorce Singletona (niewiele więcej niż zainicjalizowane zmienne globalne) i Fabryka Wzorce (sposób parametryzacji konstrukcji, ale często implementowany, gdy nie jest potrzebny) są nadużywane. Ostatnio jest bardziej prawdopodobne, że Inwersja sterowania (IoC) I związana z tym eksplozja w liczbie małych typów interfejsów, które dodają redundantnej złożoności koncepcyjnej do projektów.

Najlepsze korepetycje dla smaku to imitacja (czytanie dużo kodu i API, dowiadywanie się, co działa, a co nie), doświadczenie( popełnianie błędów i uczenie się na nim) i myślenie (nie rób tylko tego, co modne dla własnego dobra, pomyśl zanim zaczniesz działać).

 14
Author: Barry Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 13:54:27
  • użyteczne-odpowiada na potrzeby, które nie są już spełnione (lub ulepsza istniejące)
  • Łatwe do wyjaśnienia-podstawowe zrozumienie tego, co robi, powinno być proste do zrozumienia
  • podąża za jakimś modelem obiektowym jakiejś domeny problemowej lub świata rzeczywistego. Używa konstrukcji, które mają sens
  • poprawne użycie wywołań synchronicznych i asynchronicznych. (nie blokuj rzeczy, które wymagają czasu)
  • dobre domyślne zachowanie - w miarę możliwości pozwalają na rozszerzalność i poprawianie, ale zapewniają defaults for all that is necessary for simple cases
  • przykładowe zastosowania i działające przykładowe aplikacje. To chyba najważniejsze.
  • Doskonała dokumentacja
  • jedz własną karmę dla psa (jeśli dotyczy)
  • zachowaj ją małą lub podziel ją na segmenty, aby nie była jedną wielką zanieczyszczoną przestrzenią. Zachowaj zestawy funkcjonalności odrębne i odizolowane z kilkoma, jeśli istnieją, zależnościami.
Jest ich więcej, ale to dobry początek]}
 12
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:07:27

Dobre API pozwala klientowi zrobić prawie wszystko, co jest mu potrzebne, ale nie wymaga od niego wielu bezmyślnej pracy. Przykładami "bezmyślnej zajętej pracy"byłoby inicjowanie pól struktury danych, wywołanie kilku procedur w sekwencji, która nigdy nie zmienia się bez rzeczywistego kodu niestandardowego między nimi, itp.

Najpewniejszą oznaką złego API jest to, że wszyscy twoi klienci chcą owinąć go własnym kodem pomocniczym. Co najmniej Twój API powinien dostarczyć ten kod pomocniczy. Najprawdopodobniej powinien być zaprojektowany, aby zapewnić wyższy poziom abstrakcji klienci toczą się na własną rękę za każdym razem.

 7
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 15:32:08

Dobre API ma Model semantyczny zbliżony do tego, co opisuje.

Na przykład, API do tworzenia i manipulowania arkuszami kalkulacyjnymi Excel miałby takie klasy jak Workbook, Sheet, i Cell, metodami takimi jak Cell.SetValue(text) i Workbook.listSheets().

 6
Author: Dan Vinton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:12:07

Zawsze lubiłem ten artykuł w kolejce pod tytułem API Design Matters

Http://queue.acm.org/detail.cfm?id=1255422

I ta kolumna również, która zajmuje się kwestiami projektowania API:

Http://queue.acm.org/detail.cfm?id=1229903

 6
Author: jasonco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 07:19:00

Złe API to takie, które nie jest używane przez docelową grupę odbiorców.

Dobre API to takie, które jest używane przez docelową grupę odbiorców w celu, dla którego zostało zaprojektowane.

Świetne API to takie, które jest używane zarówno przez zamierzoną grupę odbiorców, zgodnie z jej przeznaczeniem, jak i niezamierzoną grupę odbiorców z powodów nieprzewidzianych przez jej projektantów.

Jeśli Amazon opublikuje swoje API zarówno jako SOAP, jak i REST, a wersja REST wygra, nie oznacza to, że bazowe API SOAP było źle.

Wyobrażam sobie, że to samo będzie prawdą dla Ciebie. Możesz przeczytać wszystko, co chcesz o projektowaniu i spróbować swoich sił, ale test kwasu będzie używany. Poświęć trochę czasu na budowanie sposobów, aby uzyskać informacje zwrotne na temat tego, co działa, a co nie, i przygotuj się na refaktoring w razie potrzeby, aby go ulepszyć.

 3
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:59:25

Dobre API to takie, które sprawia, że proste rzeczy są proste (minimalna plansza i krzywa uczenia się, aby robić najczęstsze rzeczy) i skomplikowane rzeczy możliwe (maksymalna elastyczność, jak najmniej założeń). Przeciętne API to takie, które robi jedno z nich dobrze (albo szalenie proste, ale tylko wtedy, gdy próbujesz zrobić naprawdę podstawowe rzeczy, albo szalenie potężne, ale z naprawdę stromą krzywą uczenia się itp.). Straszne API to taki, który nie robi żadnego z nich dobrze.

 2
Author: dsimcha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 18:01:34

Jest już kilka innych dobrych odpowiedzi na ten temat, więc pomyślałem, że dorzucę kilka linków, których nie widziałem.

Artykuły

  1. "A Little Manual of API Design" Jasmin Blanchette z Trolltech
  2. "Definiowanie interfejsów API C++ w stylu QT" również Trolltech

Książki:

  1. "skuteczna Java" Joshua Bloch
  2. "praktyka programowania" Kernighan i Pike
 2
Author: Lorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 18:14:00

Myślę, że dobre API powinno zezwalać na niestandardowe Hooki WE / WY i zarządzania pamięcią, jeśli ma zastosowanie.

Typowym przykładem jest własny skompresowany format Archiwum dla danych na dysku, a biblioteka innej firmy ze słabym api chce uzyskać dostęp do danych na dysku i oczekuje ścieżki do pliku, w którym może załadować swoje dane.

Ten link ma kilka dobrych punktów: http://gamearchitect.net/2008/09/19/good-middleware/

 1
Author: Laserallan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:41:11

Jeśli interfejs API generuje komunikat o błędzie, upewnij się, że komunikat i diagnostyka pomogą programiście rozwiązać problem.

Oczekuję, że wywołujący API przekazuje poprawne dane wejściowe. Programista jest konsumentem wszelkich komunikatów o błędach generowanych przez API (Nie użytkownik końcowy), a wiadomości skierowane do programisty pomagają programiście debugować ich program wywołujący.

 1
Author: Alan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 01:37:02

API jest złe, gdy jest źle udokumentowane .

API jest dobre, gdy jest dobrze udokumentowane i zgodne ze standardem kodowania.

Teraz są to dwa, bardzo proste i bardzo trudne punkty do naśladowania, to wprowadza jeden w obszar architektury oprogramowania. Potrzebujesz dobrego architekta, który konstruuje system i pomaga frameworkom podążać za własnymi wytycznymi.

Komentowanie kodu, pisanie dobrze objaśnionej instrukcji dla API jest Obowiązkowe.

API może być dobre, jeśli ma dobrą dokumentację, która wyjaśnia, jak z niego korzystać. Ale jeśli kod jest czysty, dobry i podąża za standardem wewnątrz siebie, nie ma znaczenia, czy ma przyzwoitą dokumentację.

Napisałem trochę o strukturze kodowania tutaj

 0
Author: Filip Ekberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:07:07

Myślę, że najważniejsza jest czytelność, przez którą mam na myśli jakość, która sprawia, że największa liczba programistów ma sens tego, co robi kod w jak najkrótszym czasie. Ale ocenianie, który kawałek oprogramowania jest czytelny, a który nie ma tej nieopisanej ludzkiej jakości: fuzziness. Punkty, o których wspominasz, częściowo go krystalizują. Jednak w całości musi pozostać sprawą indywidualną i naprawdę trudno byłoby wymyślić uniwersalną Zasady.

 0
Author: Frederick The Fool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 14:07:10