15. Esercizio pratico – versione 7

15.1. Implémentation
In questa sede riprenderemo la versione 6 esternalizzando in un file di configurazione le costanti utilizzate negli script principali. Il file di configurazione sarà un file jSON il cui contenuto sarà il seguente:
{
"rootDirectory": "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07",
"databaseFilename": "Data/database.json",
"taxAdminDataFileName": "Data/taxadmindata.json",
"taxPayersDataFileName": "Data/taxpayersdata.json",
"resultsFileName": "Data/results.json",
"errorsFileName": "Data/errors.json",
"dependencies": {
"BaseEntity": "/../version-05/Entities/BaseEntity.php",
"TaxAdminData": "/../version-05/Entities/TaxAdminData.php",
"TaxPayerData": "/../version-05/Entities/TaxPayerData.php",
"Database": "/../version-05/Entities/Database.php",
"ExceptionImpots": "/../version-05/Entities/ExceptionImpots.php",
"Utilitaires": "/../version-05/Utilities/Utilitaires.php",
"InterfaceDao": "/../version-05/Dao/InterfaceDao.php",
"TraitDao": "/../version-05/Dao/TraitDao.php",
"InterfaceDao4TransferAdminData2Database": "/../version-05/Dao/InterfaceDao4TransferAdminData2Database.php",
"DaoTransferAdminDataFromJsonFile2Database": "/../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php",
"DaoImpotsWithTaxAdminDataInDatabase": "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php",
"InterfaceMetier": "/../version-05/Métier/InterfaceMetier.php",
"Metier": "/../version-05/Métier/Metier.php"
},
"dependencies4calculate": [
"BaseEntity",
"TaxAdminData",
"TaxPayerData",
"Database",
"ExceptionImpots",
"Utilitaires",
"InterfaceDao",
"TraitDao",
"DaoImpotsWithTaxAdminDataInDatabase",
"InterfaceMetier",
"Metier"],
"dependencies4transfer": [
"BaseEntity",
"TaxAdminData",
"Database",
"ExceptionImpots",
"Utilitaires",
"InterfaceDao",
"TraitDao",
"InterfaceDao4TransferAdminData2Database",
"DaoTransferAdminDataFromJsonFile2Database"]
}
In questa configurazione:
- riga 2: la cartella da cui vengono calcolati tutti i percorsi di questo file di configurazione;
- righe 3-7: i percorsi di tutti i file jSON dell’applicazione;
- righe 8-22: i percorsi di tutti i file dell’applicazione, nel formato [clé=>chemin];
- righe 23-34: le dipendenze per il calcolo dell’imposta sotto forma di un elenco di chiavi del dizionario [dependencies] (righe 8-22);
- righe 35-44: le dipendenze per il trasferimento nel database dei file jSON e [taxadmindata.json] sotto forma di un elenco di chiavi del dizionario [dependencies] (righe 8-22);
Lo script per il trasferimento nel database dell’amministrazione fiscale [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] diventa il seguente:
<?php
// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);
// spazio dei nomi
namespace Application;
// gestione degli errori tramite PHP
// ini_set("display_errors", "0");
//
// percorso del file di configurazione
define("CONFIG_FILENAME", "../Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// definizione delle costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");
//
try {
// creazione del livello [dao]
$dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
// trasferimento dei dati nel database
$dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
// viene visualizzato l'errore
print $ex->getMessage() . "\n";
}
// fine
print "Terminé\n";
exit;
Commenti
Il codice rimane quello indicato nel paragrafo «link». L’unica differenza consiste nell’utilizzo del file [config.json] al posto delle costanti alle righe 18-26;
- riga 16: la funzione [file_get_contents] converte il file [config.json] in una stringa di caratteri. La funzione [json_decode] utilizza poi questa stringa per costruire il dizionario [$config]. Il secondo parametro [true] della funzione [json_decode] indica che si desidera creare un dizionario;
- righe 19-22: si includono le dipendenze necessarie allo script di trasferimento dei dati dal file [taxadmindata.json] al database;
- [$config["dependencies4transfer"]] è la tabella delle dipendenze necessarie allo script di trasferimento. Si tratta di un elenco di chiavi. I percorsi dei file da includere nel progetto si trovano nel dizionario [$config["dependencies"]];
- $config["rootDirectory"] rappresenta il percorso con cui devono essere prefissati i file da includere;
Allo stesso modo, lo script per il calcolo dell’imposta diventa il seguente: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:
<?php
// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);
// spazio dei nomi
namespace Application;
// gestione degli errori tramite PHP
// ini_set("display_errors", "0");
//
// percorso del file di configurazione
define("CONFIG_FILENAME", "../Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// definizione delle costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXPAYERSDATA_FILENAME", "$rootDirectory/{$config["taxPayersDataFileName"]}");
define("RESULTS_FILENAME", "$rootDirectory/{$config["resultsFileName"]}");
define("ERRORS_FILENAME", "$rootDirectory/{$config["errorsFileName"]}");
//
try {
// creazione del livello [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// creazione del livello [métier]
$métier = new Metier($dao);
// calcolo delle imposte in modalità batch
$métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
// viene visualizzato l'errore
print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// fine
print "Terminé\n";
exit;
15.2. Test [Codeception]
Questa versione, come le precedenti, è stata convalidata dai test [Codeception].

15.2.1. Test del livello [dao]
Il test [DaoTest.php] è il seguente:
<?php
// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);
// spazio dei nomi
namespace Application;
// definizione delle costanti
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// percorso del file di configurazione
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// altre costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// test -----------------------------------------------------
class DaoTest extends \Codeception\Test\Unit {
// TaxAdminData
private $taxAdminData;
public function __construct() {
parent::__construct();
// creazione del livello [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
$this->taxAdminData = $dao->getTaxAdminData();
}
// test
public function testTaxAdminData() {
…
}
}
Commenti
- righe 9-21: definizione dell’ambiente di test. Utilizziamo lo stesso ambiente, senza il livello [métier], di quello utilizzato dallo script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nel paragrafo link;
- righe 29-34: creazione del livello [dao];
- riga 33: l’attributo [$this→taxAdminData] contiene i dati da testare;
- righe 37-39: il metodo [testTaxAdminData] è quello descritto nel paragrafo link;
I risultati del test sono i seguenti:

15.2.2. Test del livello [métier]
Il test [MetierTest.php] è il seguente:
<?php
// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);
// spazio dei nomi
namespace Application;
// definizione delle costanti
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// percorso del file di configurazione
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// altre costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// classe di test
class MetierTest extends \Codeception\Test\Unit {
// livello business
private $métier;
public function __construct() {
parent::__construct();
// creazione del livello [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// creazione del livello [métier]
$this->métier = new Metier($dao);
}
// test
public function test1() {
…
}
-----------------------------------
public function test11() {
…
}
}
Commenti
- righe 9-21: definizione dell'ambiente di test. Utilizziamo lo stesso ambiente utilizzato dallo script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nel paragrafo "link";
- righe 28-34: costruzione del livello [dao];
- riga 33: l’attributo [$this→métier] è un riferimento al livello [métier] da testare;
- righe 37-45: i metodi [test1, test2…, test11] sono quelli descritti nel paragrafo "link";
I risultati del test sono i seguenti:
