Beim Entwurf einer C-API für die Konfiguration einer Bibliothek/eines Dienstprogramms zieht es ein Kollege von mir vor, alle Konfigurationsparameter in einem Funktionsaufruf zusammenzufassen. Zum Beispiel:
int set_diagnostic_email_config( char *to_address,
bool include_timestamp,
bool send_for_crashes,
bool send_daily_status,
bool send_on_event1,
bool send_on_event2 )
Eine ähnliche "get"-Funktion existiert mit vielen Parametern. Der Hauptvorteil dieser Methode ist, dass, wenn jemand eine neue Option hinzufügt, z. B. "bool send_on_event3", dann, weil sich der Prototyp geändert hat, Sie gezwungen sind, jeden Ort zu aktualisieren, an dem dieser Funktionsaufruf verwendet wird (unter der Annahme, dass es mehrere Orte gibt, an denen Leute diese Funktion aufrufen).
Ich bevorzuge eine Formulierung, die in etwa so lautet:
int get_diagnostic_email_config( struct email_config *p_config );
int set_diagnostic_email_config( struct email_config *p_config );
wo Sie einfach die Strukturelemente nach Bedarf ändern. Aber... wenn jemand die email_config"-Struktur aktualisiert, zwingt das die Leute nicht dazu, alle Stellen zu aktualisieren, an denen sie verwendet wird (obwohl wir das oft wollen). Außerdem beschwert sich mein Kollege, dass, wenn jemand einfach versucht, "email_config" von Hand zu initialisieren, diese neuen Felder ohne Warnungen nicht initialisiert werden, wenn später etwas hinzugefügt wird.
Gibt es einen Konsens darüber, welche Methode vorzuziehen ist, oder gibt es vielleicht eine andere Alternative, die ich übersehe?