Opération mal construite

BadProportionalityMode :
Exception levée lors du développement d'une spécification de ressource propre d'opération, lorsque le mode de proportionalité est incompatible avec la fonction de sélection.
Les incompatibilités sont :
- PROPORTIONAL avec la fonction de sélection MAX
- PROPORTIONAL avec la fonction de sélection ALL

+ I operationResourceSpecification pOtRscSpec
    entitySpecReferenceClassId = MY_TOOL;
    proportionalityMode = PROPORTIONAL;
    selectorFctId = ALL;
;
+ I myUnitOperation pOT
    requiredResources << pOTRscSpec;  // future BadProportionalityMode
    //...
;

BadEntityResourceClass
Exception levée lors de l'initialisation du processus d'exécution d'une QuantityGranulatedOperation ou d'une TimeGranulatedOperation, lorsqu'une des entités-ressource trouvées dans la spécification d'objet opéré de l'instruction n'est pas instance (directe ou indirecte) de la classe-entité de l'opération.

+ I operatedObjectSpecification pOtRscSpec
entitySpecReferenceClassId = MY_ENTITY; // future BadEntityResourceClass
    selectorFctId = ANYONE;
    selectorFctArg = 1;
;
+ I myUnitOperation pOT
    operatedEntityId = OTHER_ENTITY;   // non sous-classe de MY_ENTITY
    //...
;

NoStateTransitionProcedure :
Exception levée lorsqu'on n'a pas spécifié de procédure de transition d'état.

Que le code soit ou non géréré par Solfege, il doit faire appel à la méthode AssignBody, argumenté (i) par le symbole de classe de la méthode prédéfinie StateTransitionProcedure et (ii) par un pointeur sur une fonction de signature appropriée :

bool myUnitOperation_stateTransitionProcedure_Body(EntityMethod* pM) {
  Operation* pOt = (Operation*)(pM->DescribedEntity());
  Entity* pOtherEntity = pM->GetEntityArgValue(OPERATION_TARGET);
  bool result = TRUE;
  // ... le code du changement d'état
  return result;
}

MyUnitOperation::MyUnitOperation() {
  SetMetaClass(MY_UNIT_OPERATION);
  //SetParentClassId(UNIT_GRANULATED_OPERATION); // pour memoire
  AddInstanceToClass();
  SetIntConstValue(OPERATED_ENTITY_ID, OTHER_ENTITY);
  AssignBody(STATE_TRANSITION_PROCEDURE, 
             myUnitOperation_stateTransitionProcedure_Body)
  // ...
  ;
};

NoInformationForOperationQuantityDescId :
Exception levée lorsqu'on recherche sans succès le symbole de la classe du descripteur sur lequel est basée la vitesse d'une opération de type QUANTITY_GRANULATED.

MyIntQuantityOperation::MyOperation() {
  SetMetaClass(MY_INT_QUANTITY_OPERATION);
  //SetParentClassId(INT_QUANTITY_GRANULATED_OPERATION); // pour memoire
  // ...
  //SetIntConstValue(QUANTITY_DESCRIPTOR_ID, // future ...
  //                 UN_NOMBRE);             // NoInformationForOperationQuantityDescId
  SetIntConstValue(INT_QUANTITY_SPEED, 4);
  // ...
  ;
};

BadActivityClosingThreshold :
Exception levée lorsqu'on tente d'affecter un seuil de fermeture inférieur à 1 pour une opération de type QUANTITY_GRANULATED ou TIME_GRANULATED.

Le seuil de fermeture est le degré de progression de l'effet de l'opération (descripteur AchievementDegree) en dessous duquel le passage de l'activité à l'état CLOSED est interdit.

Or, pour les [Int Float]QuantityGranulatedOperation et les TimeGranulatedOperation, si le degré de progression augmente de manière monotone, le complet changement d'état est réalisé dès le premier pas de progression. Par exemple,
- si l'effet sur l'entité de classe A est de changer la valeur de son descripteur UnEtat de 0 à 1,
- et si la vitesse de l'opération est basée sur un autre descripteur Surface, de valeur 10
- et si la vitesse est 2
alors,
- UnEtat passe de 0 à 1, et le degré de progression passe à 0.2, au premier pas
- puis le degré de progression passe à 0.4, 0.6, ... 1.0 lors des 4 pas suivants.

Il en résulte qu'arrêter une telle opération avant qu'elle ne soit terminée génèrerait une incohérence : un effet complet (UnEtat = 1) mais une progression incomplète (AchievementDegree < 1).

Avec une UnitGranulatedOperation, le degré de progression avance à chaque 'pas' d'un ratio 'nombre d'unités N'/'nombre total d'unités', et l'état ne change à chaque 'pas' que sur N unités identifiables. C'est pourquoi arrêter l'opération avant qu'elle ne soit terminée ne génère pas l'incohérence.

PermanentOperationWithMoreThanOneOperatedObject :
Avertissement lancé quand une opération de type QUANTITY_GRANULATED ou TIME_GRANULATED, souhaitée permanente, a été spécifiée comme portant sur plus d'un seul objet opéré. Le mécanisme de progression de l'opération est tel que les objets après le premier déclaré ne seront pas opérés.

En effet, l'effet (StateTransitionProcedure) de l'opération permanente est alors répété tant que l'activité n'est pas passée à l'état CLOSED, par ses propres spécifications. Et il est toujours répété sur le premier objet opéré puisque, par convention, le degré de progression de l'opération reste à 0 et qu'il n'ya donc pas lieu de passer à l'objet opéré suivant.


This page was generated with the help of DOC++.