
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 :
- un package ui pour les interfaces graphiques ~ IHM
- un package bo pour les classes POJO ~ BO
- un package dao pour la gestion des données ~ DAL
- un package repository pour la gestion des rĂšgles mĂ©tier (dont les requĂȘtes CRUD) ~ BLL
On crĂ©e un package ui.activity, dans lequel on met lâactivitĂ©.
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.
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 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.
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
// }
}
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()
}
}