Considero le interfacce fluenti molto convenienti per molte attività. Ma mi sento a disagio quando finisco per mescolare metodi fluenti e metodi di modifica in una classe.Miscelazione di un'interfaccia fluente e non fluente in una classe
Solo un esempio (è un po 'forzato, si prega di portare con me):
Ipotizzando una classe di utilità stringa, rifilatura sembra buono per il concatenamento:
Str & Str::Trim() { return TrimLeft().TrimRight(); }
Altri metodi sarebbe naturalmente restituire un nuovo oggetto :
Str Str::GetFirstToken() const
{
// result = first token;
return result;
}
e c'è un terzo tipo, che - di per sé - sarebbe logicamente mutare l'oggetto e ret urna uno nuovo:
Str Str::SplitFirstToken()
{
result = GetFirstToken();
// this = remainder
return result;
}
Quando uso la firma che è più evidente per ogni metodo individualmente, io alla fine con questi tre tipi, e temo che non è molto intuitivo per consumare la classe che è che, specialmente dal momento che il tipo di ritorno è mroe o meno uguale.
ho già deciso di non fare Str
immutabile - dal momento che metodi come SplitToken
forniscono funzionalità di base. Il mio problema principale è mescolare metodi fluenti Cosa faresti?
non usano metodi fluente in tale interfaccia
- loro
passare ad un sub-interfaccia (vedi sotto)
"Se uno è fluente, tutti i metodi di modifica dovrebbero essere fluente"?
utilizzare un prefisso seocifico per i metodi fluenti?
non ti preoccupare?
??? Interfaccia
sub idea:
void CStr::Trim() { TrimLeft(); TrimRight(); }
CStrFluent & Str::Fluent() { return CStrFluent(*this); }
....
str.Fluent().TrimLeft().TrimRight();
Sono indeciso su questo, mi piace non è davvero il più "fluida" - soprattutto che si tratta di una chiamata di metodo in C++
Cosa fare tu pensi?
[modifica] Sto usando "fluente" qui nel significato di base del concatenamento di chiamate di metodo su una singola istanza, non nel senso avanzato della creazione di frasi inglesi nel codice.
"stai passando a nuovi oggetti nel mezzo della catena" - esattamente questo è il nocciolo della mia preoccupazione, ben detto! Cercherò di passare avanti senza il concatenamento per ora, anche se firstName = line.SplitToken (...). Trim() sembra una cosa canonica da fare. – peterchen