Skip to content

Repository files navigation

Programmation orienté objet : Projet école

Introduction

Ce projet vise à créer une application de gestion d'école, elle permet de créer des étudiants, des professeurs, des cours et les évaluations associées ainsi qu'une fonctionnalité supplémentaire qui permet de mettre un commentaire du professeur pour chaque note de l'étudiant

Présentation de l'application

Je vais reprendre les différents menus de l'application afin de mieux comprendre son fonctionnement

Création d'un étudiant

Pour créer un étudiant il suffit de remplir les différents informations demandées et il s'affiche dans la liste juste en dessous

image

Si vous cliquez sur le nom d'un étudiant vous pourrez voir un menu apparaitre afin d'update ses données, le supprimer ou voir ses détails plus avancés mais nous y reviendrons plus tard

image

Création d'un professeur

La méthode est la même que pour la création d'étudiants avec les mêmes options update, delete et details si on clique sur un nom

image

Ici on voit l'affichage quand on appuie sur "details"

image

Création d'un cours

Pour créer un cours la méthode va encore être la même avec la petite différence que nous devons ajouter le nom d'un professeur auquel rattacher le cours. Si on ne met pas un nom de professeur préexistant le cours ne sera pas rajouter à la liste. Le même menu avec details, update et delete apparait si on clique sur un élément.

image

Ici la vue des détails du cours.

image

Ajout d'une note

Pour pouvoir ajouter une note à un élève il faut aller dans les détails d'un élève donc nous retournons dans la liste des étudiants et cliquons sur "details" pour avoir ce menu dans lequel nous retrouvons ses informations personnelles ainsi que sa moyenne générale calculée sur toutes les notes de la liste (ici il n'a pas encore de note donc la moyenne est bien de 0)

image

En appuyant sur le bouton "Add Entry" nous pouvons faire apparaitre le menu suivant, qui nous permet au choix de lui mettre une cote de 0 à 20 ainsi qu'un commentaire facultatif sur sa note. Ou en remplissant une appréciation basé sur un système de lettres qui sont associées à des notes de faire la même chose que précédemment, à noter que si les lettres utilisées ne sont pas des appréciations reconnues l'élève recevra un 0/20. Les notes devant être associées à un cours, si le cours renseigné ne fait pas partie de la liste des cours existants alors aucune note ne sera ajoutée à l'étudiant

image

Et donc ici nous pouvons voir à quoi peut ressembler le bulletin d'un étudiant avec plusieurs note, avec la possibilité comme toutes les autres listes de cliquer sur les notes pour les modifier au besoin

image

Diagrammes

Diagramme de classes

Ce diagramme représente toutes les classes utilisées dans la création de ce programme

image

Diagramme de séquence

Ce diagramme représente le déroulement de la crétion d'un professeur dans le programme

image

Principe SOLID

Pour la réalisation de ce projet, il était demandé de respecter au moins 2 principes SOLID qui vont être décrits ci-dessous

Open/closed Principle

Le premier principe mis en place est de faire en sorte que le code soit facile à adapter à de nouvelles demandes. Donc dans cette optique j'ai mis en place une interface reprenant les fonctions permettant aux classes de discuter avec la database. Cette interface est utilisée pour les classes et sous-classes de "Person" car les autres classes avaient des besoins plus spécifiques, mais cette interface est parfaitement réutilisable si on veut rajouter des functions pour une nouvelle classe "Proviseur" pour laquelle il suffirait de créer la classe "ProviseurFunctions".

namespace Projet2023;

public interface DataFunctions<T>  //Interface de base pour la création de nouveaux types de personnes dans la database
{
     Task<List<T>> GetAllAsync();
    Task<T> GetByIdAsync(int id);
    Task CreateAsync(T entity);
    Task UpdateAsync(T entity);
    Task DeleteAsync(T entity);
    Task<int> GetIdByNameAsync(string name);
}

Single Responsability Principle

En séparant le constructeur de mes différentes classes avec leurs attributs "Student", "Teacher", "Activity", etc,.. et les méthodes pour modifier la database cela me permet d'avoir un meilleur controle sur ce que fait chaque classe

using Projet2023.Models;
using SQLite;

namespace Projet2023;

public class ActivityFunctions 
{
    private readonly SQLiteAsyncConnection _connection;

    public ActivityFunctions(SQLiteAsyncConnection connection)
    {
        _connection = connection;
    }

    public async Task<List<Activity>> GetAllAsync()
    {
        return await _connection.Table<Activity>().ToListAsync().ConfigureAwait(false);
    }

    public async Task<Activity> GetByIdAsync(int id)
    {
        return await _connection.Table<Activity>().Where(x => x.Id == id).FirstOrDefaultAsync().ConfigureAwait(false);
    }

    public async Task CreateAsync(Activity activity, string lastName)
    {
         Teacher teacher = await _connection.Table<Teacher>()
                                       .Where(t => t.LastName == lastName)
                                       .FirstOrDefaultAsync()
                                       .ConfigureAwait(false);
         if (teacher == null)
    {
       return;   // permet de ne pas créer de teacher inexistant dans la database (point d'amélioration)
    }     
        int teacherId = teacher.Id;
        activity.Teacher_Id = teacherId;            
        await _connection.InsertAsync(activity);
    
    }

    public async Task UpdateAsync(Activity activity, string lastName)
    {
       Teacher teacher = await _connection.Table<Teacher>()
                                       .Where(t => t.LastName == lastName)
                                       .FirstOrDefaultAsync()
                                       .ConfigureAwait(false);     
     if (teacher == null) // permet de ne pas créer de teacher inexistant dans la database (point d'amélioration)
    {
       return;
    }     
        int teacherId = teacher.Id;
        activity.Teacher_Id = teacherId;
        await _connection.UpdateAsync(activity);
    }

    public async Task DeleteAsync(Activity activity)
    {
        await _connection.DeleteAsync(activity).ConfigureAwait(false);
    }
}
using SQLite;
namespace Projet2023.Models;

public class Activity
{
    [PrimaryKey]
    [AutoIncrement]
    [Column("id")]
    public int Id {get; set;}
    [Column("activityname")]
    public string ActivityName {get; set;}
    [Column("ECTS")]
    public string ECTS {get; set;}
    [Column("code")]
    public string Code{get; set;}
    [Column("teacher")]
    public string TeacherName{get; set;}

     [Column("teacher_id")]
    public int Teacher_Id { get; set; }

    [Ignore]
    public Teacher Teacher { get; set; }
    
}

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages