CommencerCommencer gratuitement

Contrôler la puissance

Les liaisons actives peuvent aussi servir à modifier des champs privés. Dans ce cas, la fonction de liaison doit accepter un seul argument, nommé « value ».

Le modèle pour créer une liaison active en lecture/écriture est le suivant.

thing_factory <- R6Class(
  "Thing",
  private = list(
    ..a_field = "a value"
  ),
  active = list(
    a_field = function(value) {
      if(missing(value)) {
        private$..a_field
      } else {
        assert_is_a_string(value) # ou une autre assertion
        private$..a_field <- value
      }
    }
  )
)

Les valeurs sont affectées comme s’il s’agissait d’une variable de données, et non d’une fonction.

a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # et non a_thing$a_field("a new value")

Cet exercice fait partie du cours

Programmation orientée objet avec S3 et R6 en R

Afficher le cours

Instructions

Une classe de four à micro-ondes a été partiellement définie pour vous.

  • Étendez la définition de la classe pour inclure un élément active.
  • Ajoutez une liaison active à l’élément active pour contrôler le niveau de puissance.
    • La fonction doit s’appeler power_level_watts.
    • Elle doit accepter un seul argument nommé value.
    • La variable privée à lire/écrire s’appelle ..power_level_watts.
    • Utilisez assert_is_a_number() (docs) pour vérifier que value est un nombre unique.
    • Utilisez assert_all_are_in_closed_range() (docs) pour vérifier que value est compris entre 0 et ..power_rating_watts.
  • Créez un objet four à micro-ondes et affectez-le à a_microwave_oven.
  • Récupérez le niveau de puissance.
  • Essayez de définir le niveau de puissance à la valeur "400", en tant que chaîne de caractères.
  • Essayez de définir le niveau de puissance à 1600.
  • Définissez le niveau de puissance à 400.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

# Add a binding for power rating
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    ..power_rating_watts = 800,
    ..power_level_watts = 800
  ),
  # Add active list containing an active binding
  ___ = ___(
    ___ = ___(___) {
      if(missing(___)) {
        # Return the private value
        ___
      } else {
        # Assert that value is a number
        ___
        # Assert that value is in a closed range from 0 to power rating
        ___
        # Set the private power level to value
        ___ <- ___
      }
    }
  )
)

# Make a microwave 
a_microwave_oven <- ___

# Get the power level
___

# Try to set the power level to "400"
___ <- ___

# Try to set the power level to 1600 watts
___ <- ___

# Set the power level to 400 watts
___ <- ___
Modifier et exécuter le code