📘

Initialisation des couches

Voir le cours 07 Développement en couches avec Java.

D’un point de vue dĂ©veloppement en couches, il nous faut :

On crĂ©e un package ui.activity, dans lequel on met l’activitĂ©.

â„č
Pour l’instant, on a pas grand chose mais on pourra ajouter une liste d’articles, des liens vers d’autres pages pour la modification, la crĂ©ation, le dĂ©tail


On crée un package bo et la classe Produit avec ses attributs.

BP : on met un maximum d’attributs en val afin de limiter le nombre de getter/setter.
package com.lsarribouette.mumblinginkotlin.bo

data class Produit(
    val id:Int,
    var libelle:String,
    var price:Float,
    var photo:String? = null,
    var estAchete:Boolean = false
)

On crĂ©e un package dao et l’interface IProduitDao avec la signature des mĂ©thodes voulues (souvent celles du CRUD).

BP : on nomme une interface avec un I au début pour augmenter la lisibilité.
package com.lsarribouette.mumblinginkotlin.dao

import com.lsarribouette.mumblinginkotlin.bo.Produit

interface IProduitDAO {
    fun selectById(id: Int) : Produit?
    fun getAll() : List<Produit>
    fun deleteById(id:Int)
    fun deleteAll()
    fun insert(produit: Produit) : Produit
}

Dans dao, on crĂ©e l’énumĂ©ration DaoType qui liste les diffĂ©rentes options pour rĂ©cupĂ©rer les donnĂ©es des produits.

â„č
Pour l’instant, on ne va utiliser que des donnĂ©es stockĂ©es en mĂ©moire mais on pourrait en rĂ©cupĂ©rer d’une base de donnĂ©es ou d’internet par exemple.
package com.lsarribouette.mumblinginkotlin.dao

enum class DaoType {
    MEMOIRE, //BDD, INTERNET
}

Dans dao, on crĂ©e l’objet DaoFactory (usine) qui a pour seul but de construire une instance unique de DAO en fonction du type lorsque j’appelle la mĂ©thode getDao(type: DaoType).

package com.lsarribouette.mumblinginkotlin.dao

import com.lsarribouette.mumblinginkotlin.dao.memoire.ProduitDaoMemoireImpl

object DaoFactory {
    fun getDao(type: DaoType) =
        when(type){
            DaoType.MEMOIRE -> ProduitDaoMemoireImpl()
            //DaoType.BDD -> ProduitDaoBddImpl()
            //DaoType.INTERNET -> ProduitDaoInternetImpl()
        }
}

On crée un package memoire dans dao et la classe ProduitDaoMemoireImpl, afin de mettre en place une DAO qui récupÚre les données stockées en mémoire.

Elle contient une liste de produits et implĂ©mente l’interface IProduitDao donc les cinq mĂ©thodes du contrat.

package com.lsarribouette.mumblinginkotlin.dao.memoire

import com.lsarribouette.mumblinginkotlin.bo.Produit
import com.lsarribouette.mumblinginkotlin.dao.IProduitDao

class ProduitDaoMemoireImpl : IProduitDao {
    val produitsEnMemoire: MutableList<Produit> = mutableListOf<Produit>(
        Produit(1,"Un premier produit", 42.0f),
        Produit(2, "Un second produit", 12.5f),
        Produit(3, "Un troisiĂšme produit", 78.6f)
    )

    override fun selectById(id: Int): Produit? =
        produitsEnMemoire.filter { it.id == id }.firstOrNull()

    override fun getAll(): List<Produit> = produitsEnMemoire

    override fun deleteById(id: Int) {
        produitsEnMemoire.remove(selectById(id))
    }

    override fun deleteAll() {
        produitsEnMemoire.clear()
    }

    override fun insert(produit: Produit): Produit {
        produitsEnMemoire.add(produit)
        return produit
    }

}
â„č
On aurait pu utiliser la map au lieu d’une liste : elle associe une clĂ©/valeur et on serait sĂ»r qu’il n’y a pas plusieurs articles.

On crĂ©e le package repository et l’objet ProduitRepository, avec en attributs privĂ©s les diffĂ©rentes options de rĂ©cupĂ©ration de donnĂ©es et autant de mĂ©thodes que nĂ©cessaires.

⚠
Dans le repository, on peut mixer les options de récupération des données.
package com.lsarribouette.mumblinginkotlin.repository

import com.lsarribouette.mumblinginkotlin.dao.DaoFactory
import com.lsarribouette.mumblinginkotlin.dao.DaoType

object ProduitRepository {
    private var daoMemoire = DaoFactory.getDao(DaoType.MEMOIRE)
    //private var daoInternet = DaoFactory.getDao(DaoType.INTERNET)
    //private var daoBdd = DaoFactory.getDao(DaoType.BDD)

    fun getProduit(id:Int)= daoMemoire.selectById(id)

// Exemple avec plusieurs options de recuperation de donnees
//    fun getAllProduit(): List<Produit> {
//        var listeProduits : List<Produit> = daoBdd.getAllProduit()
//        if(listeProduits.isEmpty()){
//            listeProduits = daoInternet.getAllProduit()
//        }
//        return listeProduits
//    }
}
â„č
On aurait pu utiliser la map au lieu d’une liste : elle associe une clĂ©/valeur et on serait sĂ»r qu’il n’y a pas plusieurs articles.

Afficher un produit :

Dans MainActivity.kt, on ajoute un Toast qui affiche un produit dans un message en bas qui s’efface ensuite.

package com.lsarribouette.mumblinginkotlin.ui.activity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.lsarribouette.mumblinginkotlin.R
import com.lsarribouette.mumblinginkotlin.repository.ProduitRepository

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Toast.makeText(
            this,
            ProduitRepository.getProduit(1).toString(),
            Toast.LENGTH_LONG).show()
    }
}
â„č
Oui, le Toast c’est illĂ©gal maintenant : on utilise les Snackbar.