parent
204d26a7e7
commit
564ac6759b
@ -0,0 +1,130 @@
|
||||
# Ebullition
|
||||
|
||||
Une application Java et JavaFX pour gérer des capteurs de température.
|
||||
|
||||
## Conception
|
||||
|
||||
### Interfaces partagées
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Tickable {
|
||||
+tick()*
|
||||
}
|
||||
<<interface>> Tickable
|
||||
class Nameable {
|
||||
+getName()* String
|
||||
+getDisplayName() String
|
||||
}
|
||||
<<interface>> Nameable
|
||||
class Identifiable {
|
||||
+getId()* int
|
||||
+setName(name : String)*
|
||||
}
|
||||
<<interface>> Identifiable
|
||||
class ObservableIdentifiable {
|
||||
+idProperty()* ReadOnlyIntProperty
|
||||
+getId() int
|
||||
+nameProperty()* StringProperty
|
||||
+getName() String
|
||||
+setName(name : String)
|
||||
+displayNameExpression() StringExpression
|
||||
+getDisplayName() String
|
||||
}
|
||||
<<interface>> ObservableIdentifiable
|
||||
class SensorFactory {
|
||||
+create(registry : SensorRegistry, name : String)* Sensor
|
||||
}
|
||||
<<interface>> SensorFactory
|
||||
class AutoUpdateStrategyFactory {
|
||||
+create()* AutoUpdateStrategy
|
||||
}
|
||||
<<interface>> AutoUpdateStrategyFactory
|
||||
Nameable <|-- Identifiable
|
||||
Identifiable <|-- ObservableIdentifiable
|
||||
Nameable <|-- SensorFactory
|
||||
Nameable <|-- AutoUpdateStrategyFactory
|
||||
```
|
||||
|
||||
L'interface `Tickable` définit une méthode `tick` qui est appelée périodiquement par un thread.
|
||||
|
||||
Tous les objets héritent en Java de `java.lang.Object` et ont donc une méthode `toString` utilisée principalement pour déboguer.
|
||||
Lorsqu'un objet est fait pour être affiché à l'utilisateur, ce n'est pas du débogage.
|
||||
L'interface `Nameable` définit les méthodes `getName` et `getDisplayName` qui retourne les noms à afficher pour ces objets.
|
||||
|
||||
Un objet peut être identifié par un identifiant unique, un `UUID` ou un `int`.
|
||||
L'interface `Identifiable` définit la méthode `getId` qui permet de récupérer cet identifiant sous forme d'entier.
|
||||
Elle définit aussi une méthode `setName` pour changer le nom de l'objet.
|
||||
|
||||
Des objets qui implémentent `Nameable` ou `Identifiable` ne sont pas nécessairement observables.
|
||||
C'est pourquoi l'interface `ObservableIdentifiable` hérite de ces deux interfaces et expose les propriétés observables pour l'identifiant et le nom.
|
||||
Il s'agit du même nom que les méthodes `getId` et `getName` mais en exposant une propriété observable.
|
||||
|
||||
D'autres éléments de l'application sont nommables, comme certaines fabriques d'objets : `SensorFactory` crée des capteurs et `AutoUpdateStrategyFactory` crée des stratégies d'actualisation automatique.
|
||||
Ces deux interfaces héritent de `Nameable` pour proposer un affichage de ces fabriques dans l'application.
|
||||
|
||||
### Capteurs
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ObservableIdentifiable {
|
||||
...
|
||||
}
|
||||
<<interface>> ObservableIdentifiable
|
||||
class Tickable {
|
||||
+tick()*
|
||||
}
|
||||
<<interface>> Tickable
|
||||
class Sensor {
|
||||
-id : IntegerProperty
|
||||
-name : StringProperty
|
||||
-displayName : StringExpression
|
||||
-temperature : DoubleProperty
|
||||
+Sensor(id : int, name : String)
|
||||
+idProperty() int
|
||||
+nameProperty() StringProperty
|
||||
+displayNameExpression() StringExpression
|
||||
+temperatureProperty() ReadOnlyDoubleProperty
|
||||
+getTemperature() double
|
||||
}
|
||||
class ManualSensor {
|
||||
+temperatureProperty() DoubleProperty
|
||||
}
|
||||
class AutoSensor {
|
||||
-updateStrategy : ObjectProperty~AutoUpdateStrategy~
|
||||
+tick()
|
||||
+getUpdateStrategy() AutoUpdateStrategy
|
||||
+setUpdateStrategy(s : AutoUpdateStrategy)
|
||||
+updateStrategyProperty() ReadOnlyObjectProperty~AutoUpdateStrategy~
|
||||
}
|
||||
class VirtualSensor {
|
||||
-sources : ObservableList~DataSource~
|
||||
-sourcesProperty : ListProperty~DataSource~
|
||||
+addSource(s : Sensor, weight : double)
|
||||
+removeSource(s : Sensor) bool
|
||||
+sourcesProperty() ReadOnlyListProperty~DataSource~
|
||||
#compute()
|
||||
}
|
||||
class DataSource {
|
||||
-sensor : Sensor
|
||||
-weight : DoubleProperty
|
||||
+sensor() Sensor
|
||||
+weight() double
|
||||
}
|
||||
Sensor <|-- ManualSensor
|
||||
Sensor <|-- AutoSensor
|
||||
Sensor <|-- VirtualSensor
|
||||
ObservableIdentifiable <|.. Sensor
|
||||
Tickable <|.. AutoSensor
|
||||
DataSource "*" <-- VirtualSensor
|
||||
Sensor "1" <-- DataSource
|
||||
```
|
||||
|
||||
Un capteur est un objet observable et identifiable.
|
||||
|
||||
S'il peut être mis à jour périodiquement comme c'est le cas pour les capteurs automatiques `AutoSensor`, il implémente l'interface `Tickable`.
|
||||
|
||||
Un capteur manuel ne fait qu'autoriser publiquement la modification de la température par rapport à la classe abstraite `Sensor`.
|
||||
|
||||
Un capteur virtuel est composé de plusieurs sources de température.
|
||||
C'est une variante du patron de conception composite : chaque capteur virtuel contient une liste de capteurs et de poids associés avec des objets `DataSource`.
|
@ -1,9 +1,9 @@
|
||||
package fr.uca.iut.clfreville2.model.sensor.auto.provider;
|
||||
package fr.uca.iut.clfreville2.model.sensor.auto.factory;
|
||||
|
||||
import fr.uca.iut.clfreville2.model.sensor.auto.AutoUpdateStrategy;
|
||||
import fr.uca.iut.clfreville2.model.shared.Nameable;
|
||||
|
||||
public interface AutoUpdateStrategyProvider extends Nameable {
|
||||
public interface AutoUpdateStrategyFactory extends Nameable {
|
||||
|
||||
AutoUpdateStrategy create();
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package fr.uca.iut.clfreville2.model.sensor.provider;
|
||||
package fr.uca.iut.clfreville2.model.sensor.factory;
|
||||
|
||||
import fr.uca.iut.clfreville2.model.SensorRegistry;
|
||||
import fr.uca.iut.clfreville2.model.sensor.Sensor;
|
||||
import fr.uca.iut.clfreville2.model.sensor.auto.RandomVariationStrategy;
|
||||
|
||||
public class AutoSensorProvider implements SensorProvider {
|
||||
public class AutoSensorFactory implements SensorFactory {
|
||||
|
||||
@Override
|
||||
public Sensor create(SensorRegistry registry, String name) {
|
@ -1,9 +1,9 @@
|
||||
package fr.uca.iut.clfreville2.model.sensor.provider;
|
||||
package fr.uca.iut.clfreville2.model.sensor.factory;
|
||||
|
||||
import fr.uca.iut.clfreville2.model.SensorRegistry;
|
||||
import fr.uca.iut.clfreville2.model.sensor.Sensor;
|
||||
|
||||
public class ManualSensorProvider implements SensorProvider {
|
||||
public class ManualSensorFactory implements SensorFactory {
|
||||
|
||||
@Override
|
||||
public Sensor create(SensorRegistry registry, String name) {
|
@ -1,10 +1,10 @@
|
||||
package fr.uca.iut.clfreville2.model.sensor.provider;
|
||||
package fr.uca.iut.clfreville2.model.sensor.factory;
|
||||
|
||||
import fr.uca.iut.clfreville2.model.SensorRegistry;
|
||||
import fr.uca.iut.clfreville2.model.sensor.Sensor;
|
||||
import fr.uca.iut.clfreville2.model.shared.Nameable;
|
||||
|
||||
public interface SensorProvider extends Nameable {
|
||||
public interface SensorFactory extends Nameable {
|
||||
|
||||
Sensor create(SensorRegistry registry, String name);
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package fr.uca.iut.clfreville2.model.sensor.provider;
|
||||
package fr.uca.iut.clfreville2.model.sensor.factory;
|
||||
|
||||
import fr.uca.iut.clfreville2.model.SensorRegistry;
|
||||
import fr.uca.iut.clfreville2.model.sensor.Sensor;
|
||||
|
||||
public class VirtualSensorProvider implements SensorProvider {
|
||||
public class VirtualSensorFactory implements SensorFactory {
|
||||
|
||||
@Override
|
||||
public Sensor create(SensorRegistry registry, String name) {
|
Loading…
Reference in new issue