Skip to content

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

Image

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] اعتبارسنجی شده است.

Image

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] همان متدی است که در بخش مرتبط توصیف شده است؛

نتایج آزمون به شرح زیر است:

Image

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] همان‌هایی هستند که در بخش «لینک» توضیح داده شده‌اند؛

نتایج آزمون به شرح زیر است:

Image