la for...each
construcción no es la herramienta adecuada a utilizar para obtener el comportamiento específico que está después que la cuestión está redactada, sin tener más características en el objeto Cat
. El clásico Iterator
está diseñado para proporcionar solo este tipo de funcionalidad. Creo que la pregunta ilustra que el diseño es defectuoso, más sobre este último.
Suponiendo que el no es una lista ordenada de gatos llamada cats
. Un List
que no garantiza la orden de recorrido no sería un buen candidato para la iteración, independientemente de cómo se recorre la lista.
final Iterator<Cat> iterator = cats.iterator();
while (iterator.hasNext())
{
final Cat cat = iterator.next();
this.feedDryCatFood(cat);
// special case, if there are no more cats in the list
// feed the last one tuna as well.
if (!iterator.hasNext())
{
this.alsoFeedTuna(cat);
}
}
una mejor solución sería tener un método miembro en Cat
. Cat.isSpecial()
que devuelve un boolean
.Esto sería más auto documentado y mover el comportamiento de la construcción de bucle. Entonces podría usar un constructo for...each
con una prueba simple que sea autocontenida y auto documentada.
if (cat.isSpecial())
{
this.feedTuna(cat);
}
creo que el "último elemento de un bucle for..each
" en la pregunta es una pista falsa. Creo que el problema es más un problema de diseño que un problema de lógica de negocios, y el hecho de que el bucle for...each
no puede acomodar la regla es indicativo de que debería producirse una refactorización.
Este nuevo diseño también podría acomodar múltiples gatos "especiales" sin ninguna complicación al código.
Otras soluciones más elegantes orientadas a objetos serían el Visitor Pattern o el Chain of Responsibility Pattern. El patrón de visitante resumiría la lógica de quién es el favorito del Cat
y en la implementación del visitante. Lo mismo con la cadena de responsabilidad. Tenga una cadena de objetos CatFeeder
y déjelos decidir si "manejarán" la alimentación o la pasarán por la cadena. De cualquier manera sería un acoplamiento más flexible y una cohesión más estrecha.
¿Cuál es su uso real de esto? ¿Puedes tratar el primer artículo especialmente en su lugar? – starblue
El uso real, no lo sé, pero definitivamente estoy aprendiendo mucho de la gente agradable e inteligente aquí. – Russell
¡la cantidad de soluciones pobres con múltiples votos positivos es muy preocupante! –