Considero que las interfaces fluidas son muy convenientes para muchas tareas. Pero me siento incómodo cuando termino mezclando métodos fluidos y modificando métodos en una clase.Mezcla de una interfaz fluida y no fluida en una clase
Sólo un ejemplo (que es un poco artificial, por favor tengan paciencia conmigo):
Suponiendo una clase de utilidad cadena, el recorte parece buena para encadenar:
Str & Str::Trim() { return TrimLeft().TrimRight(); }
Otros métodos naturalmente devolver un nuevo objeto :
Str Str::GetFirstToken() const
{
// result = first token;
return result;
}
y hay una tercera tipo, que - por sí mismo - lógicamente sería mutar el objeto y ret urna una nueva:
Str Str::SplitFirstToken()
{
result = GetFirstToken();
// this = remainder
return result;
}
Cuando uso la firma que es más obvio para cada método de forma individual, termino con estos tres tipos, y me temo que no es muy intuitiva para el consumo de la clase que es la que, especialmente porque el tipo de retorno es menos o menos igual.
ya he decidido no hacer Str
inmutable - ya que los métodos como SplitToken
proporcionan la funcionalidad básica. Mi problema principal es mezclar métodos fluidos ¿Qué harías?
no utilizan métodos fluidez en esa interfaz
moverlos a una sub-interfaz (ver más abajo)
"Si uno es fluido, todos los métodos de modificación debe ser fluido"?
usa un prefijo seocífico para los métodos fluidos?
no te preocupes?
???
sub idea de interfaz:
void CStr::Trim() { TrimLeft(); TrimRight(); }
CStrFluent & Str::Fluent() { return CStrFluent(*this); }
....
str.Fluent().TrimLeft().TrimRight();
estoy indeciso sobre esto, yo realmente no me gusta el extra "fluidez" - sobre todo que se trata de una llamada de método en C++
Qué hacer ¿Crees?
[edit] Estoy usando "fluido" aquí en el significado básico de las llamadas al método de encadenamiento en una sola instancia, no en el sentido avanzado de crear oraciones en inglés en el código.
"Estás haciendo la transición a nuevos objetos en el medio de la cadena" - exactamente ese es el núcleo de mi preocupación, ¡bien dicho! Voy a tratar de pasar sin el encadenamiento por ahora, aunque firstName = line.SplitToken (...). Trim() parece una cosa canónica para hacer. – peterchen