la construction for...each
n'est pas l'outil approprié à utiliser pour obtenir le comportement spécifique que vous êtes après que la question est formulée, sans avoir plus de fonctionnalités dans l'objet Cat
. Le Iterator
classique est conçu pour fournir ce type de fonctionnalité. Je pense que la question illustre que la conception est défectueuse, plus sur ce dernier. En supposant qu'il existe une liste triée de chats appelée cats
. Un List
qui ne garantit pas l'ordre de traversée ne serait pas un bon candidat pour l'itération, quelle que soit la manière dont la liste est traversée.
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);
}
}
une meilleure solution serait d'avoir une méthode membre sur Cat
. Cat.isSpecial()
qui renvoie un boolean
.Cela serait plus auto-documenté et déplacer le comportement hors de la construction de la boucle. Vous pouvez ensuite utiliser une construction for...each
avec un test simple, autonome et auto-documenté.
if (cat.isSpecial())
{
this.feedTuna(cat);
}
Je pense que le « dernier élément d'une boucle for..each
» dans la question est un faux problème. Je pense que le problème est plus un problème de conception qu'un problème de logique métier, et le fait que la boucle for...each
ne puisse pas accepter la règle indique qu'un refactoring doit avoir lieu.
Cette nouvelle conception pourrait également accueillir plusieurs chats «spéciaux» sans aucune complication au code.
D'autres solutions orientées objet plus élégantes seraient le Visitor Pattern ou le Chain of Responsibility Pattern. Le modèle de visiteur résumerait la logique de qui est le favori du Cat
et de l'implémentation du visiteur. Pareil avec la chaîne de responsabilité. Avoir une chaîne de CatFeeder
objets, et laissez-les décider si «gérer» l'alimentation ou le transmettre sur la chaîne. Dans les deux cas, ce serait un couplage plus lâche et une cohésion plus serrée.
Quelle est votre utilisation réelle de ceci? Pouvez-vous traiter le premier article spécialement à la place? – starblue
L'utilisation réelle, je ne sais pas, mais je suis certainement apprendre beaucoup de gens gentils et intelligents ici. – Russell
le nombre de solutions médiocres avec des votes multiples est très inquiétant! –