Skip to content

15. تمرين تطبيقي – الإصدار 7

Image

15.1. التنفيذ

سنستند هنا إلى الإصدار 6 مع نقل الثوابت المستخدمة في البرامج النصية الرئيسية إلى ملف تكوين خارجي. سيكون ملف التكوين هو 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"]
}

في هذا التكوين:

  • السطر 2: المجلد الذي تُحسب منه جميع المسارات في ملف التكوين هذا؛
  • الأسطر 3-7: مسارات جميع ملفات jSON الخاصة بالتطبيق؛
  • الأسطر 8-22: مسارات جميع ملفات التطبيق، بالصيغة [clé=>chemin]؛
  • الأسطر 23-34: التبعيات اللازمة لحساب الضريبة في شكل قائمة بمفاتيح قاموس [dependencies] (الأسطر 8-22)؛
  • الأسطر 35-44: التبعيات لنقل ملف jSON [taxadmindata.json] إلى قاعدة البيانات في شكل قائمة بمفاتيح قاموس [dependencies] (الأسطر 8-22)؛

يصبح البرنامج النصي لنقل البيانات إلى قاعدة بيانات إدارة الضرائب [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] بدلاً من الثوابت في الأسطر 18-26؛

  • السطر 16: تقوم الدالة [file_get_contents] بتحويل الملف [config.json] إلى سلسلة أحرف. ثم تستخدم الدالة [json_decode] هذه السلسلة لإنشاء القاموس [$config]. يشير المعامل الثاني [true] للدالة [json_decode] إلى الرغبة في إنشاء قاموس؛
  • الأسطر 19-22: يتم تضمين التبعيات اللازمة لبرنامج النقل لنقل البيانات من الملف [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"]}");

// اختبار -----------------------------------------------------

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() {

  }

}

تعليقات

  • الأسطر 9-21: تعريف بيئة الاختبار. نستخدم نفس البيئة، باستثناء الطبقة [métier]، التي يستخدمها البرنامج النصي الرئيسي [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] الموصوف في الفقرة المرتبطة؛
  • الأسطر 29-34: إنشاء الطبقة [dao]؛
  • السطر 33: يحتوي السمة [$this→taxAdminData] على البيانات المراد اختبارها؛
  • الأسطر 37-39: الطريقة [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() {

  }

}

تعليقات

  • الأسطر 9-21: تعريف بيئة الاختبار. نستخدم نفس البيئة المستخدمة في البرنامج النصي الرئيسي [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] الموصوف في الفقرة المرتبطة؛
  • الأسطر 28-34: إنشاء الطبقة [dao]؛
  • السطر 33: السمة [$this→métier] هي مرجع إلى الطبقة [métier] المراد اختبارها؛
  • الأسطر 37-45: الطرق [test1, test2…, test11] هي تلك الموضحة في الفقرة المرتبطة؛

نتائج الاختبار هي كما يلي:

Image