Progettazione API: come specificare un albero arbitrario?

3

Sto scrivendo un'API, in cui una delle chiamate di funzione di cui è destinata a essere una chiamata ad una fabbrica per una serie di nodi ad albero che prendono un numero di parametri, alcuni dei quali sono gli stessi e alcuni di che sono diversi. Il kicker è che è sull'utente specificare la struttura esatta dell'albero - farlo algoritmicamente andrebbe contro quello che sto cercando di fornire. La domanda che ho è, qual è il modo migliore (più intuitivo, soprattutto) per strutturare la chiamata di funzione? Finora, la mia migliore idea è qualcosa del genere:

void FooClass::createTree(
    {
        {2},
        {4, 5},
        {2, 2, 2, 2, 2, 2, 2, 2, 0}
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    },
    {
        {"N1"},
        {"N2-1", "N2-2"},
        {"N3-1", "N3-2", "N3-3", "N3-4", "N3-5", "N3-6", "N3-7", "N3-8", "N3-9"},
        {"N4-1", "N4-2", "N4-3", "N4-4", "N4-5", "N4-6", "N4-7", "N4-8", "N4-9", "N4-10", "N4-11", "N4-12", "N4-13", "N4-14", "N4-15", "N4-16"}
    },
    other_args...
)

Dove, ovviamente, uno 0 significherebbe la cessazione di un particolare ramo. Questo viene costruito in C ++ e deve essere fornito come parte di una funzione di libreria in cui l'albero viene utilizzato internamente da FooClass .

Mi rendo conto che, alla fine, avrò bisogno di chiamate diverse per combinazioni diverse di parametri variabili / non variabili, ma quello su cui sono confuso è il formato "caso base". Mi piacerebbe anche evitare l'uso di un oggetto Builder (come è stato suggerito), poiché l'albero che viene infine specificato dall'utente deve essere costruito dal basso verso l'alto (un risultato del dominio problematico - questo è un vincolo inevitabile).

    
posta Sebastian Lenartowicz 08.07.2016 - 20:02
fonte

1 risposta

2

Ho deciso di andare con un semplice oggetto costruttore, dopo tutto. La chiamata idiomatica assomiglia un po 'a questo:

FooClass.createTree(
    TreeBuilder("N1")
        .addSubNodes("N1", {"N2-1", "N2-2"})
        .addSubNodes("N2-1", {"N3-1", "N3-2", "N3-3"})
        .addSubNodes("N2-2", {"N3-4", "N3-5"}),
    other_args...
);
    
risposta data 09.07.2016 - 07:27
fonte

Leggi altre domande sui tag