Enhance doc

pull/30/head
Corentin LEMAIRE 2 years ago
parent 90987188e8
commit d9196eefc8

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 24 KiB

@ -1,5 +1,35 @@
# Linaris_MAUI_SAE_201
#### Description de l'architecture
![DA](Images/Diagramme_architecture.png)
Notre programme se compose de deux parties distinctes : les **vues** et le **modèle**.
Pour les **vues**, cela correspond aux visuels de l'application. Pour le modèle, cela correspond à la logique de l'application, son fonctionnement.
Ces deux parties sont liées par le **DataBinding** liant les données et le modèle avec les vues.
<br/>
Pour permettre cela, nous avons mis en oeuvre le patron de conception de **"façade"** grâce à la classe *Manager*. En effet, cette classe est un *point d'entrée* vers le modèle, où le fonctionnement est caché par des méthodes et propriétés comme c'est le cas pour les listes d'objets. Les vues ne savent pas comment ces listes sont créées, elles ne font que l'utiliser. Cette classe **gère le modèle** mais est aussi l'interlocuteur des vues. C'est un **lien** entre ces deux parties. Cela nous permettait de bien **séparer les vues et le modèle**, mais aussi de **réduire** et **clarifier** le code présent dans le code-behind des vues.
<br/>
De plus, nous avons intégré le patron de conception de **"stratégie"** grâce à l'interface *IDataManager* et l'*injection de dépendance par le contructeur* du Manager. En effet, cela nous permet de *changer de méthode* de sérialisation très facilement. Nous pouvons donc utiliser les stubs pour tester le programme et repasser sur la sérialisation XML pour utiliser l'application en un simple changement. Cela permet une **adaptabilité** de code non négligeable. Il suffit de changer le paramètre donné au constructeur du Manager.
En outre, pour que cela fonctionne, l'interface *IDataManager* est indispensable, afin de s'assurer que toutes les méthodes de sérialisation aient bien **toutes les méthodes** nécessaires au bon fonctionnement de l'application. Grâce à cela, nous n'avons pas à nous demander quelle est la méthode de sérialisation pusique l'appel de la méthode de l'interface appellera la méthode de la technique de sérialisation demandée. Nous obtenons un résultat différent selon la méthode **sans changer le code**. Par exemple, dans la classe *App*, nous pouvons simplement appeler la méthode de sérialisation du manager, nous n'avons pas à changer ce code à chaque changement de méthode de sérialisation. Cela nous fait **gagner en temps** et en **adaptabilité de code**.
Grâce à ces patrons de conception, nous pouvons passer des stubs à la sérialisation XML bien plus facilement et **sans changer le code** des vues.
<br/>
Afin de lier nos différents projets, nous avons ajouté des **dépendances**. En effet, pour que l'*application console*, les *vues* et les *tests unitaires* fonctionnent, nous avons ajouté la dépendance vers le *modèle*.
Par ailleurs, nous avons aussi ajouté la dépendance vers **XUnit** pour le projet des *tests unitaires* et la dépendance vers **ToolKit** pour les vues afin de pouvoir utiliser *MediaElement* pour la lecture de médias.
---
## Diagramme de classe
```plantuml
@ -174,19 +204,19 @@ Title .. Manager
CustomTitle --|> Title
InfoTitle --|> Title
InfoTitle o-- "+ Genre" Genre
InfoTitle o-- "+ Artist" Artist
InfoTitle o-- "+ Feat*" Artist
Manager o-- "+ Albums*" Album
Manager o-- "+ Artists*" Artist
Manager o-- "+ InfoTitles*" InfoTitle
Manager o-- "+ Playlists*" Playlist
Manager o-- "+ CustomTitles*" CustomTitle
Manager o-- "+ CurrentAlbum" Album
Manager o-- "+ CurrentPlaylist" Playlist
Manager o-- "+ CurrentInfoTitle" InfoTitle
Manager o-- "+ CurrentPlaying" CustomTitle
InfoTitle o--> "+ Genre" Genre
InfoTitle o--> "+ Artist" Artist
InfoTitle o--> "+ Feat*" Artist
Manager o--> "+ Albums*" Album
Manager o--> "+ Artists*" Artist
Manager o--> "+ InfoTitles*" InfoTitle
Manager o--> "+ Playlists*" Playlist
Manager o--> "+ CustomTitles*" CustomTitle
Manager o--> "+ CurrentAlbum" Album
Manager o--> "+ CurrentPlaylist" Playlist
Manager o--> "+ CurrentInfoTitle" InfoTitle
Manager o--> "+ CurrentPlaying" CustomTitle
@enduml
```
@ -491,14 +521,14 @@ class StubPlaylist {
LinqXmlSerialization --|> IDataManager
StubManager --|> IDataManager
StubManager *-- "+ StubArtist" StubArtist
StubManager *-- "+ StubPlaylist" StubPlaylist
StubManager *-- "+ StubAlbum" StubAlbum
StubManager *-- "+ StubInfoTitle" StubInfoTitle
StubManager *-- "+ StubCustomTitle" StubCustomTitle
StubInfoTitle *-- "+ StubArtist" StubArtist
StubAlbum *-- "+ StubArtist" StubArtist
LinqXmlSerialization o-- "+ StubInfoTitle" StubInfoTitle
StubManager *--> "+ StubArtist" StubArtist
StubManager *--> "+ StubPlaylist" StubPlaylist
StubManager *--> "+ StubAlbum" StubAlbum
StubManager *--> "+ StubInfoTitle" StubInfoTitle
StubManager *--> "+ StubCustomTitle" StubCustomTitle
StubInfoTitle *--> "+ StubArtist" StubArtist
StubAlbum *--> "+ StubArtist" StubArtist
LinqXmlSerialization o--> "+ StubInfoTitle" StubInfoTitle
@enduml
```
@ -556,35 +586,38 @@ class StubInfoTitle {}
class StubPlaylist {}
class IDataManager {}
class LinqXmlSerialization {}
class StubManager {}
class StubManager
{
+ Manager(IDataManager dataManager)
}
class Manager {}
StubAlbum o-- "+ Albums*" Album
StubArtist *-- "+ Artists*" Artist
StubCustomTitle *-- "+ CustomTitles*" CustomTitle
StubInfoTitle *-- "+ InfoTitles*" InfoTitle
StubPlaylist *-- "+ Playlists*" Playlist
IDataManager .. Album
IDataManager .. Artist
IDataManager .. InfoTitle
IDataManager .. CustomTitle
IDataManager .. Playlist
IDataManager .. Genre
LinqXmlSerialization o-- "+ Artists*" Artist
LinqXmlSerialization o-- "+ Albums*" Album
LinqXmlSerialization o-- "+ Playlists*" Playlist
LinqXmlSerialization o-- "+ Infotitles*" InfoTitle
LinqXmlSerialization o-- "+ Customtitles*" CustomTitle
StubManager .. InfoTitle
StubManager .. Artist
StubManager .. Album
StubManager .. CustomTitle
StubManager .. Playlist
Manager *-- "+ DataManager" IDataManager
StubAlbum o--> "+ Albums*" Album
StubArtist *--> "+ Artists*" Artist
StubCustomTitle *--> "+ CustomTitles*" CustomTitle
StubInfoTitle *--> "+ InfoTitles*" InfoTitle
StubPlaylist *--> "+ Playlists*" Playlist
IDataManager ..> Album
IDataManager ..> Artist
IDataManager ..> InfoTitle
IDataManager ..> CustomTitle
IDataManager ..> Playlist
IDataManager ..> Genre
LinqXmlSerialization o--> "+ Artists*" Artist
LinqXmlSerialization o--> "+ Albums*" Album
LinqXmlSerialization o--> "+ Playlists*" Playlist
LinqXmlSerialization o--> "+ Infotitles*" InfoTitle
LinqXmlSerialization o--> "+ Customtitles*" CustomTitle
StubManager ..> InfoTitle
StubManager ..> Artist
StubManager ..> Album
StubManager ..> CustomTitle
StubManager ..> Playlist
Manager *--> "+ DataManager" IDataManager
@enduml
```
@ -603,6 +636,7 @@ Ce diagramme représente les **liens** entre les deux diagrammes ci-dessus.
Notre projet est un projet MAUI se nommant **Linaris**. Une erreur a été effectuée lors de la conception, ce qui fait que nos vues
portent le même nom. Pour les différencier, le paquet *Linaris* qui concerne les vues sera écrit en italique.
Tous ces projets sont en .NET 7.0.
#### Model
@ -618,14 +652,15 @@ Nos vues (*Linaris*) ont besoin de Model afin d'effectuer le data-binding pour q
#### Console
Ce paquet contient une application console C#.
Pour effectuer différents test fonctionnels sur nos différentes classes du modèle, l'application console (**Console**) a besoin de celui-ci.
Ce paquet contient une application console C#. Elle contient donc nos tests fonctionnels de notre application.
Pour effectuer différents tests fonctionnels sur nos différentes classes du modèle, l'application console (**Console**) a besoin de celui-ci.
#### TestUnitaires
Ce paquet contient les tests unitaires de nos différentes classes. Il utilise *xUnit* pour les réaliser.
Pour effectuer ceux-ci, le paquet correspondant (**TestUnitaires**) dépend du modèle.
---
## Diagramme de séquence
@ -658,32 +693,3 @@ end
Notre sérialisation permet de sauvegarder nos données dans des fichiers *XML* ainsi que de charger dans des collections les données contenues dans ceux-ci.
Cette méthode est appelée lorsque l'utilisateur démarre l'application *Linaris* (MAUI). Celle-ci appelle ensuite les différentes fonctions de chargement codées en *C#* présentes dans la classe *LinqXmlSerialization*. Grâce à la bibliothèque **LINQ_XML**, la sérialisation peut récupérer les données présentes dans les différents fichiers pour les classes **Artist**, **CustomTitle** et **Playlist** et les mettre dans les différentes *ObservableCollection*. Pour les classes **InfoTitle** et **Album**, les données sont récupérées dans les collections des stubs correspondant et les mettre dans les différentes *ObservableCollection*. Les données sont ensuite utilisables par les vues via le **manager**.
---
#### Description de l'architecture
Notre programme se compose de deux parties distinctes : les **vues** et le **modèle**.
Pour les **vues**, cela correspond aux visuels de l'application. Pour le modèle, cela correspond à la logique de l'application, son fonctionnement.
Ces deux parties sont liées par le **DataBinding** liant les données et le modèle avec les vues.
<br/>
Pour permettre cela, nous avons mis en oeuvre le patron de conception de **"façade"** grâce à la classe *Manager*. En effet, cette classe est un *point d'entrée* vers le modèle, où le fonctionnement est caché par des méthodes et propriétés comme c'est le cas pour les listes d'objets. Les vues ne savent pas comment ces listes sont créées, elles ne font que l'utiliser. Cette classe **gère le modèle** mais est aussi l'interlocuteur des vues. C'est un **lien** entre ces deux parties. Cela nous permettait de bien **séparer les vues et le modèle**, mais aussi de **réduire** et **clarifier** le code présent dans le code-behind des vues.
<br/>
De plus, nous avons intégré le patron de conception de **"stratégie"** grâce à l'interface *IDataManager* et l'*injection de dépendance par le contructeur* du Manager. En effet, cela nous permet de *changer de méthode* de sérialisation très facilement. Nous pouvons donc utiliser les stubs pour tester le programme et repasser sur la sérialisation XML pour utiliser l'application en un simple changement. Cela permet une **adaptabilité** de code non négligeable. Il suffit de changer le paramètre donné au constructeur du Manager.
En outre, pour que cela fonctionne, l'interface *IDataManager* est indispensable, afin de s'assurer que toutes les méthodes de sérialisation aient bien **toutes les méthodes** nécessaires au bon fonctionnement de l'application. Grâce à cela, nous n'avons pas à nous demander quelle est la méthode de sérialisation pusique l'appel de la méthode de l'interface appellera la méthode de la technique de sérialisation demandée. Nous obtenons un résultat différent selon la méthode **sans changer le code**. Par exemple, dans la classe *App*, nous pouvons simplement appeler la méthode de sérialisation du manager, nous n'avons pas à changer ce code à chaque changement de méthode de sérialisation. Cela nous fait **gagner en temps** et en **adaptabilité de code**.
Grâce à ces patrons de conception, nous pouvons passer des stubs à la sérialisation XML bien plus facilement et **sans changer le code** des vues.
<br/>
Afin de lier nos différents projets, nous avons ajouté des **dépendances**. En effet, pour que l'*application console*, les *vues* et les *tests unitaires* fonctionnent, nous avons ajouté la dépendance vers le *modèle*.
Par ailleurs, nous avons aussi ajouté la dépendance vers **XUnit** pour le projet des *tests unitaires* et la dépendance vers **ToolKit** pour les vues afin de pouvoir utiliser *MediaElement* pour la lecture de médias.
Loading…
Cancel
Save