15. تمرین عملی – نسخه ۷

15.1. Implémentation
در اینجا، نسخهٔ ۶ را با انتقال ثابتهای مورد استفاده در اسکریپتهای اصلی به یک فایل پیکربندی بازنگری خواهیم کرد. نام فایل پیکربندی jSON خواهد بود و محتویات آن به شرح زیر است:
{
"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"]
}
در این پیکربندی:
- خط ۲: پوشهای که تمام مسیرها در این فایل پیکربندی از آن اندازهگیری میشوند؛
- خطوط ۳–۷: مسیرهای فایلهای jSON تمام برنامهها؛
- خطوط ۸–۲۲: مسیرهای تمام فایلهای برنامه، در قالب [clé=>chemin]؛
- خطوط ۲۳–۳۴: وابستگیها برای محاسبه مالیات به صورت فهرستی از کلیدها از فرهنگ لغت [dependencies] (خطوط ۸–۲۲);
- خطوط ۳۵–۴۴: وابستگیها برای انتقال فایلهای jSON و [taxadmindata.json] به پایگاه داده، به شکل یک لیست از کلیدها از فرهنگ لغت [dependencies] (خطوط ۸–۲۲);
اسکریپت انتقال دادهها از پایگاه داده سازمان مالیاتی، [MainTransferAdminDataFromFile2PostgresSQLDatabase.php]، به شرح زیر است:
<?php
// رعایت دقیق انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// مدیریت خطا توسط PHP
// ini_set("display_errors", "0");
//
// مسیر فایل پیکربندی
define("CONFIG_FILENAME", "../Data/config.json");
//بازیابی پیکربندی
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// وارد کردن وابستگیهای مورد نیاز اسکریپت
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// تعریف ثابتها
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");
//
try {
//ایجاد لایه [dao]
$dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
//انتقال دادهها به پایگاه داده
$dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
// نمایش خطا
print $ex->getMessage() . "\n";
}
// پایان
print "Terminé\n";
exit;
نظرات
کد همانند پاراگراف مرتبط باقی میماند. تنها تفاوت، استفاده از فایل [config.json] به جای ثابتها در خطوط ۱۸–۲۶ است؛
- خط ۱۶: تابع [file_get_contents] فایل [config.json] را به یک رشتهٔ کاراکتری تبدیل میکند. سپس تابع [json_decode] از این رشته برای ساخت فرهنگ لغت [$config] استفاده میکند. پارامتر دوم، [true]، در تابع [json_decode] نشان میدهد که باید یک فرهنگ لغت ایجاد شود؛
- خطوط ۱۹–۲۲: وابستگیهای مورد نیاز برای اسکریپت انتقال دادهها از فایل [taxadmindata.json] به پایگاه داده گنجانده شدهاند؛
- [$config["dependencies4transfer"]] آرایه وابستگیهای مورد نیاز اسکریپت انتقال است. این فهرستی از کلیدها است. مسیرهای فایلهایی که باید در پروژه گنجانده شوند در فرهنگ لغت [$config["dependencies"]] یافت میشوند؛
- $config["rootDirectory"] مسیری را نشان میدهد که باید پیشوند فایلهای مورد نظر برای درج باشد؛
به همین ترتیب، اسکریپت محاسبه مالیات به صورت زیر در میآید: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:
<?php
// پابندی سختگیرانه به انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// مدیریت خطا توسط PHP
// ini_set("display_errors", "0");
//
// مسیر فایل پیکربندی
define("CONFIG_FILENAME", "../Data/config.json");
//بازیابی پیکربندی
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// وارد کردن وابستگیهای مورد نیاز اسکریپت
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// تعریف ثابتها
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 {
// ایجاد لایه [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// ایجاد لایه [métier]
$métier = new Metier($dao);
//محاسبه مالیات در حالت دستهای
$métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
// خطای نمایش داده شده
print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// پایان
print "Terminé\n";
exit;
15.2. آزمایشها [Codeception]
این نسخه، مانند نسخههای قبلی، توسط تستهای [Codeception] اعتبارسنجی شده است.

15.2.1. آزمون لایه [dao]
آزمون [DaoTest.php] به شرح زیر است:
<?php
// پابندی سخت به انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// تعریف ثابتها
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// مسیر فایل پیکربندی
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// بازیابی پیکربندی
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// شامل وابستگیهای مورد نیاز اسکریپت
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// سایر ثابتها
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// test -----------------------------------------------------
class DaoTest extends \Codeception\Test\Unit {
//TaxAdminData
private $taxAdminData;
public function __construct() {
parent::__construct();
// ایجاد لایه [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
$this->taxAdminData = $dao->getTaxAdminData();
}
// آزمایشها
public function testTaxAdminData() {
…
}
}
توضیحات
- خطوط ۹–۲۱: تعریف محیط آزمایش. ما از همان محیط، بدون لایه [métier]، استفاده میکنیم که در اسکریپت اصلی [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] توصیف شده در بخش مرتبط به کار رفته است؛
- خطوط ۲۹–۳۴: ساخت لایه [dao]؛
- خط ۳۳: ویژگی [$this→taxAdminData] حاوی دادههای مورد آزمایش است؛
- خطوط ۳۷–۳۹: متد [testTaxAdminData] همان متدی است که در بخش مرتبط توصیف شده است؛
نتایج آزمون به شرح زیر است:

15.2.2. آزمایش لایه [métier]
آزمون [MetierTest.php] به شرح زیر است:
<?php
// پابندی سخت به انواع اعلامشدهٔ پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// تعریف ثابتها
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// مسیر فایل پیکربندی
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// بازیابی پیکربندی
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// شامل وابستگیهای مورد نیاز اسکریپت
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// سایر ثابتها
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// کلاس تست
class MetierTest extends \Codeception\Test\Unit {
//لایه کسبوکار
private $métier;
public function __construct() {
parent::__construct();
//ایجاد لایه [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// ایجاد لایه [métier]
$this->métier = new Metier($dao);
}
// آزمایشها
public function test1() {
…
}
-----------------------------------
public function test11() {
…
}
}
توضیحات
- خطوط ۹–۲۱: تعریف محیط آزمایش. ما از همان محیطی استفاده میکنیم که در اسکریپت اصلی [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] که در بخش مرتبط توضیح داده شده است، به کار رفته است؛
- خطوط ۲۸–۳۴: ساخت لایه [dao]؛
- خط ۳۳: ویژگی [$this→métier] مرجعی به لایه [métier] برای آزمایش است؛
- خطوط ۳۷–۴۵: متدهای [test1, test2…, test11] همانهایی هستند که در بخش «لینک» توضیح داده شدهاند؛
نتایج آزمون به شرح زیر است:
