Over the flows

personal space about software engineering


Pattern Automate - boucle avec état

Quand on a besoin de parser un document complexe, on peut utiliser un pattern de programmation qui consiste à maintenir un état ou un contexte entre les itérations d’une boucle.

Ce pattern permet de traiter un flux séquentiel de données en maintenant un état qui évolue au fil des itérations. L’état accumulé peut influencer le comportement des itérations suivantes.

Ce pattern de programmation peut être appelé boucle avec état ou boucle à mémoire. Je le cite pour l’imager comme pattern Automate. A chaque itération, l’automate oublie ce qu’il a vu précédemment, sauf ce qu’il a explicitement enregistré dans ses registres et peut continuer comme ça indéfiniment.

Exemple

treadmill_fruits = ["pomme", "pomme", "banane", "orange", "orange", "orange", "banane", "fraise", "kiwi"]

# état
total_fruits = 0
max_cumulated_fruits = {}
cumulated_fruit = 0
previous_fruit = None

# boucle infini
i = 0
for fruit in treadmill_fruits:
    if fruit not in max_cumulated_fruits:
        max_cumulated_fruits[fruit] = 1

    if previous_fruit == fruit:
        cumulated_fruit += 1
    
    if previous_fruit != fruit:
        if max_cumulated_fruits[fruit] < cumulated_fruit:
            max_cumulated_fruits[previous_fruit] = cumulated_fruit
        
        cumulated_fruit = 1
         
    total_fruits += 1
    previous_fruit = fruit
    
# Utilisation de l'état final
print(f"{total_fruits=}")
print(f"{max_cumulated_fruits=}")

Terminologie

Voici quelques termes couramment utilisés pour décrire ce concept :

  • Boucle avec état : Ce terme met l’accent sur le fait que la boucle maintient un état ou un contexte qui évolue au fil des itérations
  • Boucle à mémoire: Cette expression évoque l’idée que la boucle “se souvient” des itérations précédentes via le contexte qu’elle maintient.
  • Machine à état fini : ce terme est trop général car il existe énormément de moyen de l’implémenter. Cependant, il est possible de dire que ce pattern est une machine à état très simple.

Caractéristiques clés

  1. Persistance du contexte: Un état ou un contexte est maintenu et mis à jour à chaque itération de la boucle.
  2. Accumulation d’informations: Les données ou les résultats sont accumulés au fil des itérations, enrichissant progressivement le contexte.
  3. Influence sur les itérations futures: Le contexte accumulé peut influencer le comportement des itérations suivantes de la boucle.
  4. Flexibilité: Ce pattern peut être implémenté avec différents types de boucles (while, for) et peut utiliser diverses structures de données pour stocker le contexte (dictionnaires, listes, objets personnalisés, etc.)

Dans cet exemple, l’etat est maintenu et mis à jour à chaque itération, influençant le comportement de la boucle.

Applications

Les boucles avec état sont particulièrement utiles dans des scénarios tels que :

  • L’analyse de données séquentielles
  • Le traitement de flux d’informations
  • L’implémentation d’algorithmes itératifs complexes
  • La simulation de systèmes dynamiques
  • La tokenisation de texte et la fabrication de parsers