Bonjour,

Je viens demander un conseil pour savoir quel est selon vous le meilleur moyen d'implémenter mon projet qui permet de gérer plusieurs types de cartes bancaires.

J'ai 2 types de lecteurs de cartes bancaires:
- Wynid
- Banksys-Xenteo

J'ai donc une classe mère CCardReader qui sert d'interface, et 2 classes filles qui implémentent cette dernière, CWynidCardReader et CBanksysXenteoCardReader.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
class CCardReader  
{
public:
	CCardReader();
	virtual ~CCardReader();
 
	// Opérations
	virtual int Connect() const = 0;
	virtual int Initialize() const = 0;
	virtual int OpenSession() const = 0;
	virtual int ProcessTransaction() const = 0;
	virtual int CloseSession() const = 0;
	virtual int Disconnect() const = 0;
 
	virtual TCHAR* GetName() const = 0;
};
 
class CWynidCardReader : public CCardReader { /* Lecteur de carte Wynid */ };
 
class CBanksysXenteoCardReader: public CCardReader { /* Lecteur de carte Banksys-Xenteo */ };
Dans mon application MFC, j'ai un menu déroule me demandant de choisir l'un de ces lecteurs. Je dois donc créer une instance de lecteur de cartes bancaires de manière dynamique via l'opérateur new() vu que le programme ne connait le type de lecteur qu'une fois le programme exécuté.

Ce qui donne:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class CTestCardReaderDlg : public CDialog
{
// ...
 
private:
	CCardReader* m_lpCardReader;
};
Pour rendre l'application plus résistante, j'utile l'idiome RAII sur la classe CCardReader.

Ce qui donne:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class CCardReaderRAII  
{
public:
	CCardReaderRAII(CCardReader* lpCardReader = NULL);
	~CCardReaderRAII();
 
	// Attache/Détache un CCardReader
	void Attach(CCardReader* lpCardReader);
	// Pas nécessaire car fait par le destructeur
	void Detach();
 
	// Opérations
	int Connect() const;
	int Initialize() const;
	int OpenSession() const;
	int ProcessTransaction() const;
	int CloseSession() const;
	int Disconnect() const;
 
	TCHAR* GetName() const;
 
private:
	CCardReader* m_lpCardReader;
};
 
 
class CTestCardReaderDlg : public CDialog
{
// ...
 
private:
	CCardReaderRAII m_cardReaderRAII;
};
 
// Détermine le type de lecteur de carte
switch (nIndex)
{
	case WYNID:
		m_cardReaderRAII.Attach(new CWynidCardReader);
		return TRUE;
 
	case BANKSYS_XENTEO:
		m_cardReaderRAII.Attach(new CBanksysXenteoCardReader);
		return TRUE;
 
	default: /* CB_ERR */
		return FALSE;
}
J'aimerais également appliquer le RAII pour les fonctions de connexion (déconnexion automatique), d'ouverture de session (fermeture de session automatique) afin de prévenir une éventuelle erreur.

Quel serait le meilleur moyen? Refaire une classe RAII pour ces fonctions afin de gérer ça dans le constructeur et destructeur? Comment procéder?
Y aurait-il une autre approche qui serait meilleure?

Merci d'avance