2010-06-13 4 views
2

Comment pouvez-vous modéliser un objet pouvant avoir plusieurs états simultanés? Par exemple, vous pouvez avoir une personne en attente d'un bus, par exemple. C'est un état. Mais ils pourraient aussi lire un journal en attendant le bus. En outre, ils pourraient penser à quelque chose en lisant le journal. Ils pourraient également renifler leur nez parce qu'ils ont un rhume. C'est un quatre états qui se déroulent tous en même temps. Lorsque les concepts sont orthogonaux (indépendants), ils peuvent être simplement modélisés en tant que valeurs indépendantes, par exemple,Modélisation de plusieurs états simultanés

Répondre

2

Les états ne sont souvent que des étapes d'un processus. Au lieu de les représenter comme des valeurs, représentez le processus lui-même en tant que classe et décidez ce qui doit être fait, et pas seulement dans quel état.

Dans votre cas, plusieurs processus simultanés sont en cours. , donc votre classe Person aurait une instance de DailyCommuteProcess, BodyClockProcess, et ainsi de suite chacun s'occupant des fonctions correspondantes.

Cette approche (encapsulation de l'état et la logique qui agit sur un état dans une catégorie distincte, plutôt que de faire le look de classe consommatrice aux propriétés publiques et agir), est connu sous le nom Tell, Don't Ask principle.

1

class Person 
{ 
    Location location; // bus stop, home etc... 
    Motion motion; // sitting, walking, running 
    Topic thinkingAbout; 
    boolean sniffing; 
    boolean blinking; 
    boolean breakingWind; 
} 

Il est raisonnable qu'une personne puisse faire tout cela en même temps, donc il n'y a pas de contraintes. Autrement dit, ils peuvent être assis/marcher/courir à un endroit donné (arrêt de bus, domicile, travail), ils peuvent en même temps penser à un sujet, et peuvent aussi être sniffer, cligner des yeux et faire d'autres choses en même temps temps. Chaque sous-état lui-même est exclusif - une personne ne peut être qu'à un endroit, avoir une sorte de mouvement, penser à une chose.

Lorsqu'il y a des contraintes, le même modèle peut être utilisé, mais en conjonction avec un cadre de validation pour s'assurer que l'état est valide. Par exemple, si nous avons ajouté 'boolean sneezing'. Quand éternuer est vrai, alors le clignotement devrait être vrai aussi, puisqu'il n'est pas possible de garder les yeux ouverts en éternuant. Le modèle de validation coderait cette contrainte.

En pensant en termes d'états, les valeurs indépendantes peuvent être modélisées collectivement comme un seul état en prenant le produit cartésien de chaque sous-état.

1

Utilisez un tableau pour stocker tous les états de l'objet est actuellement.

MrBean.states = { 
    "WaitingForBus", 
    "ReadingNewspaper", 
    "Sniffling", 
    "ThinkingAboutPaintings" 
}; 

Comment modéliser les états est entièrement jusqu'à vous. Ce qui précède est un exemple simple où les états sont modélisés par des chaînes, et portent zéro information supplémentaire.

Questions connexes