Quando scrivi una libreria, quanto dovrebbe fare l'utente?

5

Prima di tutto, questa domanda va oltre il mio esempio (non voglio che questo sia troppo localizzato o migrato allo Stack Overflow), ma mi sono imbattuto in questo quando ho pensato a qualcosa che volevo provare in C così ho pensato che io ' d utilizzalo come esempio.

Quindi la mia idea è di creare una lista concatenata generica in C e l'ho iniziata la scorsa notte e sta procedendo piuttosto bene per essere nuova in C. Il problema che ho incontrato è tipo casting e mi porta a questa domanda: come molto lavoro dovrebbe un progettista di biblioteca si aspetta che l'utente faccia quando usa la libreria?

Se segui il mio esempio, al momento, non eseguo alcun cast e restituisco un oggetto (che è un typedef di void *). È ragionevole assicurarsi che l'utente finale tenga traccia dei propri tipi o che il progettista della biblioteca si assicuri che l'elenco sia sicuro per il tipo (penso di avere un'idea generale su come implementarlo per almeno i tipi di dati integrati) ? È ragionevole, quando si progetta una libreria di aspettarsi una certa quantità di lavoro da parte degli utenti finali per utilizzare la libreria o dovrebbe essere minimizzata il più possibile? Ci sono fattori che influenzano questa decisione, come il linguaggio?

    
posta Jetti 17.08.2011 - 16:38
fonte

6 risposte

4

La tua biblioteca dovrebbe essere considerata una scatola nera. L'utente della biblioteca non deve avere alcuna conoscenza preliminare nel processo. Dovrebbero essere in grado di chiamare semplicemente i metodi nella libreria con la seguente comprensione:

Calling method X with parameter Y produces Z
z = x(y);

Dovrebbero conoscere il tipo che entra come parametro e dovrebbero conoscere il tipo che esce come parametro. All'utente non dovrebbe essere richiesto di avere alcuna conoscenza interna della tua libreria o di come produce il tipo, solo che il tipo che viene prodotto è ciò che è previsto.

    
risposta data 17.08.2011 - 16:47
fonte
2

Per chi è la biblioteca è sicuramente una considerazione. Se la libreria è utilizzata da altre persone nella tua squadra, non direi irragionevole aspettarsi un po 'di lavoro extra da parte loro per usarla (cast di tipo e così. Forse un po' meno clemenza sui dati che arrivano a funzioni e simili).

Se la libreria è di uso pubblico, mi aspetto di ridurre la quantità di lavoro richiesta il più possibile, per ridurre la "difficoltà" di usarlo.

    
risposta data 17.08.2011 - 16:47
fonte
2

Prima di tutto, potresti non voler reinventare la ruota. GLib ha una libreria di elenchi collegati molto utile in C.

Tuttavia, se sei intenzionato a far girare il tuo, GLib e GTK + sono buoni modelli per le API relativamente pulite. Tieni presente che alcuni principi di progettazione in altre lingue non si applicano in realtà in C a causa dei suoi limiti. Ad esempio, GTK + richiede agli utenti di eseguire tipecche in diversi punti, ma forniscono macro per semplificare, come GTK_WINDOW() in:

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

In un'altra lingua, sarebbe considerata una cattiva pratica non utilizzare il polimorfismo per la variabile window . In C, cast come questo sono la regola per il corso. Allo stesso modo per aver bisogno di lanciare un valore di ritorno void* in qualcosa di utile. In altre lingue, le migliori pratiche imporranno l'utilizzo di qualcosa come i modelli per darti il giusto tipo di reso. In C, questo non è disponibile e, cosa più importante, i programmatori C non si aspettano che lo sia. Le API soddisfano tutte le aspettative degli utenti con la minima sorpresa.

    
risposta data 17.08.2011 - 18:54
fonte
2

Ho attraversato esattamente la stessa fase, penso davvero che dovresti controllare l'implementazione del kernel Linux degli elenchi collegati, trovato in include / linux / list.h

Puoi trovare una descrizione molto bella dell'uso e dell'implementazione di questo elenco qui

Inoltre, assicurati di controllare i sorgenti di Linux. L'idea è geniale, i nodi contengono puntatori alle liste e non viceversa !! Questo piccolo inversione rende indipendente il tipo di implementazione.

saluti,

Yati

    
risposta data 18.08.2011 - 13:57
fonte
1

Penso che dipenda dalla libreria che stai costruendo. Se stai costruendo una libreria con implementazioni di Abstract Data Types come nel tuo esempio, non vorrei fare nulla da me. Mi aspetterei qualcosa che è completamente finito e supporta un modo tipicamente di aggiungere / rimuovere / selezionare / iterare.

La ragione di questo è che è un dominio di cui chiunque può avere una comprensione molto completa. Mi aspetterei che chiunque costruisca una biblioteca e si aspetti che io lo usi per essere un esperto nel dominio per cui sta costruendo la biblioteca (se non lo è, posso anche costruirlo da solo). Per me la sicurezza dei dati nelle strutture dati è un requisito assoluto.

Se hai un dominio problematico che è molto più flessibile (o che non è ancora così coltivato) mi aspetto che una libreria lasci più spazio per le regolazioni consumando il codice in quanto potrebbero essere possibili più implementazioni. Ma come ho detto prima, lo sviluppatore deve essere un vero esperto nel dominio, quindi probabilmente saprà dove rendere la sua libreria estensibile (dato che questa è una parte fondamentale della conoscenza di un dominio).

E in ogni caso, dedica molto tempo alla tua interfaccia pubblica in quanto questa sarà la cosa principale che i tuoi utenti vedranno quando consumano la tua libreria. Se devono controllare la documentazione per ogni singola funzione che vogliono usare, perché non può dire dalla firma cosa farà, i benefici sono ridotti al minimo

    
risposta data 17.08.2011 - 18:59
fonte
0

Quando scrivi "utente finale", presumo tu intenda lo "sviluppatore del codice chiamante".

La metodologia TDD ti fa scrivere prima i test, poi il codice.

Tra gli altri, un enorme vantaggio è che la tua API è progettata per essere utilizzabile (perché il codice di prova chiama il tuo codice, proprio come un normale chiamante della tua API). Il codice chiamante diventa semplice e molto leggibile. Dovrebbe rispondere a tutte le domande che hai sull'esatta API che dovresti offrire.

Tieni presente che un'API spesso consente di cambiare il livello della lingua . Ad esempio, un codice funzionale relativo alle mucche e ai maiali della fattoria può utilizzare un'API per mascherarli, prima di poter giocare a tartarughe ninja ;-) Oppure raggruppare i clienti puoi utilizzare la struttura dati Elenco e non prendere in considerazione nemmeno i dettagli tecnici.

    
risposta data 29.08.2011 - 21:52
fonte

Leggi altre domande sui tag