14. تمرین عملی – نسخه ۶

ما بهتازگی ساختار لایهای زیر را پیادهسازی کردهایم:

SGBD مورد استفاده در مثالها، MySQL بود. در بخش «link»، متوجه شدیم که هیچچیز در کلاسی که لایه [dao] را پیادهسازی میکند، نشان نمیداد که از یک SGBD خاص استفاده شده است. اکنون این را با استفاده از دو SGBD دیگر، یعنی SGBD و PostgreSQL، بررسی خواهیم کرد. معماری لایهای به شکل زیر درمیآید:

14.1. نصب SGBD و PostgreSQL
نسخههای SGBD و PostgreSQL از نسخههای URL و [https://www.postgresql.org/download/] (مه ۲۰۱۹) در دسترس هستند. ما نصب نسخه ۶۴ بیتی ویندوز را نشان میدهیم:


- از [1-4]، فایل نصبی را برای SGBD دانلود کنید؛
نصبکننده دانلود شده را اجرا کنید:

- در [6]، یک پوشه نصب مشخص کنید؛

- در [8]، گزینه [Stack Builder] برای کاری که ما اینجا انجام میدهیم لازم نیست؛
- برای [10]، مقدار را همانطور که هست باقی بگذارید؛

- برای [12-13]، ما رمز عبور [root] را اینجا وارد کردهایم. این رمز عبور مدیر برای SGBD خواهد بود که [postgres] نامیده میشود. PostgreSQL همچنین آن را ابرکاربر مینامد؛
- برای [15]، مقدار پیشفرض را حفظ کنید: این پورت گوشدادن برای SGBD است؛

- در [17]، مقدار پیشفرض را حفظ کنید؛
- در [19]، خلاصه پیکربندی نصب؛


در ویندوز، SGBD و PostgreSQL بهعنوان سرویسهای ویندوز نصب شدهاند که بهطور خودکار راهاندازی میشوند. در بیشتر موارد، این امر مطلوب نیست. ما قصد داریم این تنظیم را تغییر دهیم. عبارت [services] را در نوار جستجو ویندوز تایپ کنید: [24-26]:

- تا [29]. میبینیم که سرویسهای SGBD و PostgreSQL روی «خودکار» تنظیم شدهاند. میتوانیم این را با دسترسی به ویژگیهای سرویس [30] تغییر دهیم:

- برای [31-32]، نوع راهاندازی را روی دستی تنظیم کنید؛
- برای [33]، سرویس را متوقف کنید؛
هنگامی که میخواهید SGBD را به صورت دستی راهاندازی کنید، به برنامه [services] بازگردید، روی سرویس [postgresql] (34) کلیک راست کرده و آن را راهاندازی کنید (35).
14.2. فعالسازی افزونه PDO برای SGBD و PostgreSQL
ما قصد داریم فایل [php.ini] را ویرایش کنیم که PHP را پیکربندی میکند (به بخش «لینک» مراجعه کنید):

- به [2]. بررسی کنید که افزونه PDO مربوط به PostgreSQL فعال باشد. پس از انجام این کار، تغییرات را ذخیره کرده و سپس Laragon را مجدداً راهاندازی کنید تا مطمئن شوید که تغییر اعمال شده است. سپس، پیکربندی PHP را مستقیماً از Laragon [3-5] بررسی کنید.
14.3. ابزار [pgAdmin] را برای مدیریت PostgreSQL استفاده کنید.
سرویس ویندوزی SGBD PostgreSQL را راهاندازی کنید (به بخش «لینک» مراجعه کنید). سپس، به همان روشی که ابزار [services] را راهاندازی کردید، ابزار [pgadmin] را که برای مدیریت سرویسهای SGBD، PostgreSQL و [1-3] استفاده میشود، اجرا کنید:

ممکن است در مقطعی از شما رمز عبور کاربر ابر (superuser) خواسته شود. این [postgres] است. شما این رمز عبور را هنگام نصب SGBD تعیین میکنید. در این سند، ما رمز عبور [root] را در حین نصب به ابرکاربر اختصاص دادهایم.
- در [4]، [pgAdmin] یک برنامه وب است؛
- در [5]، فهرست سرورهای PostgreSQL که توسط [pgAdmin] شناسایی شدهاند، در این مورد ۱؛
- در [6]، سرور PostgreSQL که ما راهاندازی کردهایم؛
- در [7]، پایگاههای داده SGBD، در این مورد ۱؛
- در [8]، پایگاه داده [postgresql] توسط ابرکاربر [postgres] مدیریت میشود؛
ابتدا، بیایید کاربری [admimpots] را با رمز عبور [mdpimpots] ایجاد کنیم:


- برای [17]، رمز عبور [mdpimpots] را وارد کردیم؛

- در [21]، کد SQL که ابزار [pgAdmin] به SGBD و PostgreSQL خروجی خواهد داد. این روشی برای یادگیری زبان اختصاصی SQL متعلق به PostgreSQL است؛
- در [22]، پس از اعتبارسنجی جادوگر [Save]، کاربر [admimpots] ایجاد شد؛
اکنون پایگاه داده [dbimpots-2019] را ایجاد خواهیم کرد:

روی [23] کلیک راست کرده، سپس روی [24-25] کلیک کنید تا یک پایگاه داده جدید ایجاد شود. در زبانه [26]، نام پایگاه داده را [27] و مالک آن را [admimpots] [28] تعریف کنید.

- در [30]، کد ایجاد پایگاه داده SQL;
- به [31]؛ پس از اعتبارسنجی توسط جادوگر [Save]، پایگاه داده [dbimpots-2019] ایجاد میشود؛
اکنون، قصد داریم جدول [tbtranches] را با ستونهای [id, limites, coeffr, coeffn] ایجاد کنیم. ویژگی متمایز PostgreSQL این است که نام ستونها نسبت به حروف بزرگ/کوچک حساس هستند، که معمولاً در سایر جداول SGBD اینگونه نیست. بنابراین، با MySQL، دستور [select limites, coeffR, coeffN from tbtranches] کار خواهد کرد، حتی اگر ستونهای واقعی در جدول [tbtranches]، [LIMITES, COEFFR, COEFFN] باشند. با PostgreSQL، دستور SQL کار نخواهد کرد. سپس میتوانید [select LIMITES, COEFFR, COEFFN from tbtranches] را بنویسید، اما این هنوز کار نخواهد کرد، زیرا PostgreSQL دستور [select limites, coeffr, coeffn from tbtranches] را اجرا میکند: به طور پیشفرض، آن نام ستونها را به حروف کوچک تبدیل میکند. برای جلوگیری از این مشکل، باید بنویسید: [select "LIMITES", "COEFFR", "COEFFN" from tbtranches]؛ به عبارت دیگر، باید نام ستونها را در گیومه قرار دهید. به همین دلایل، ما نام ستونها را با حروف کوچک مینویسیم. نام اشیاء پایگاه داده میتواند منشأ ناسازگاری بین SGBD باشد، زیرا برخی نامها در برخی SGBD کلمات کلیدی هستند اما در برخی دیگر نیستند.
ما جدول [tbtranches] را ایجاد میکنیم:

- برای ایجاد ستونها از دکمه [40] استفاده کنید؛


- پس از تکمیل جادوگر ایجاد از طریق [Save]، جدول [tbtranches] ایجاد [52-53] میشود؛
ما باید به SGBD دستور دهیم تا هنگام درج یک ردیف در جدول، کلید اصلی [id] را خود تولید کند:

- در [56]، به ویژگیهای کلید اصلی [id] دسترسی پیدا میکنیم؛
- برای [59]، شما مشخص میکنید که ستون از نوع [Identity] است. این امر باعث میشود که SGBD مقادیر کلید اصلی را تولید کند؛

- در [62]، کدی که برای این عملیات تولید شده SQL است؛
جدول [tbtranches] اکنون آماده است.
ما همان مراحل را برای ایجاد جدول [tbconstantes] تکرار میکنیم. نتیجهٔ مورد نظر را مشخص میکنیم:



پایگاه داده [dbimpots-2019] اکنون آماده است. آن را با دادهها پر خواهیم کرد.
همانطور که با MySQL انجام دادیم، میتوان پایگاه داده [dbimpots-2019] را به فایلی به نام SQL صادر کرد. سپس میتوانیم این فایل، SQL، را وارد کنیم تا پایگاه داده را در صورت از دست رفتن یا خراب شدن، بازسازی کنیم. در اینجا، تنها ساختار پایگاه داده را صادر میکنیم و نه دادههای آن:


فایل تولیدشده به شرح زیر است:
--
-- PostgreSQL خروجی پایگاه داده
--
-- خروجیگیری شده از پایگاه داده نسخه 11.2
-- خروجیگیری شده توسط pg_dump نسخه 11.2
-- شروع در ۴ ژوئیهٔ ۲۰۱۹ در ساعت ۰۸:۲۰:۳۱
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- TOC ورودی 198 (کلاس 1259 OID 16408)
-- نام: tbconstantes; نوع: TABLE; طرحواره: public; مالک: postgres
--
CREATE TABLE public.tbconstantes (
plafond_qf_demi_part double precision NOT NULL,
id integer NOT NULL,
plafond_revenus_celibataire_pour_reduction double precision NOT NULL,
plafond_revenus_couple_pour_reduction double precision NOT NULL,
valeur_reduc_demi_part double precision NOT NULL,
plafond_decote_celibataire double precision NOT NULL,
plafond_decote_couple double precision NOT NULL,
plafond_impot_celibataire_pour_decote double precision NOT NULL,
plafond_impot_couple_pour_decote double precision NOT NULL,
abattement_dix_pourcent_max double precision NOT NULL,
abattement_dix_pourcent_min double precision NOT NULL
);
ALTER TABLE public.tbconstantes OWNER TO postgres;
--
-- TOC entry 199 (class 1259 OID 16411)
-- نام: tbconstantes_id_seq; نوع: SEQUENCE; طرحواره: public; مالک: postgres
--
ALTER TABLE public.tbconstantes ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
SEQUENCE NAME public.tbconstantes_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1
);
--
-- TOC entry 196 (class 1259 OID 16399)
-- نام: tbtranches; نوع: TABLE; اسکیما: public; مالک: admimpots
--
CREATE TABLE public.tbtranches (
limites double precision NOT NULL,
id integer NOT NULL,
coeffr double precision NOT NULL,
coeffn double precision NOT NULL
);
ALTER TABLE public.tbtranches OWNER TO admimpots;
--
-- TOC entry 197 (class 1259 OID 16404)
-- نام: tbimpots_id_seq; نوع: SEQUENCE; طرح: عمومی; مالک: admimpots
--
ALTER TABLE public.tbtranches ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
SEQUENCE NAME public.tbimpots_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1
);
--
-- TOC entry 2694 (class 2606 OID 16429)
-- نام: tbconstantes tbconstantes_pkey; نوع: CONSTRAINT; اسکیما: public; مالک: postgres
--
ALTER TABLE ONLY public.tbconstantes
ADD CONSTRAINT tbconstantes_pkey PRIMARY KEY (id);
--
-- TOC entry 2692 (class 2606 OID 16403)
-- نام: tbtranches tbimpots_pkey; نوع: CONSTRAINT; اسکیما: public; مالک: admimpots
--
ALTER TABLE ONLY public.tbtranches
ADD CONSTRAINT tbimpots_pkey PRIMARY KEY (id);
--
-- TOC entry 2821 (class 0 OID 0)
-- وابستگیها: 198
-- نام: TABLE tbconstantes; نوع: ACL; طرح: public; مالک: postgres
--
GRANT ALL ON TABLE public.tbconstantes TO admimpots;
-- تکمیلشده در ۴ ژوئیهٔ ۲۰۱۹ در ساعت ۰۸:۲۰:۳۲
--
-- PostgreSQL پشتیبانگیری پایگاه داده کامل شد
--
14.4. پر کردن جدول [tbtranches]
ما قبلاً این کار را با فایلهای SGBD و MySQL در بخش «link» انجام دادهایم. ما فقط باید فایل [database.json] را که پایگاه داده را توصیف میکند، اصلاح کنیم:

فایل [database.json] به شرح زیر تغییر میکند:
{
"dsn": "pgsql:host=localhost;dbname=dbimpots-2019",
"id": "admimpots",
"pwd": "mdpimpots",
"tableTranches": "public.tbtranches",
"colLimites": "limites",
"colCoeffR": "coeffr",
"colCoeffN": "coeffn",
"tableConstantes": "public.tbconstantes",
"colPlafondQfDemiPart": "plafond_qf_demi_part",
"colPlafondRevenusCelibatairePourReduction": "plafond_revenus_celibataire_pour_reduction",
"colPlafondRevenusCouplePourReduction": "plafond_revenus_couple_pour_reduction",
"colValeurReducDemiPart": "valeur_reduc_demi_part",
"colPlafondDecoteCelibataire": "plafond_decote_celibataire",
"colPlafondDecoteCouple": "plafond_decote_couple",
"colPlafondImpotCelibatairePourDecote": "plafond_impot_celibataire_pour_decote",
"colPlafondImpotCouplePourDecote": "plafond_impot_couple_pour_decote",
"colAbattementDixPourcentMax": "abattement_dix_pourcent_max",
"colAbattementDixPourcentMin": "abattement_dix_pourcent_min"
}
- خط ۲: فایل DSN تغییر کرده است؛ [pgsql] نشان میدهد که ما با Postgres SGBD سر و کار داریم؛
- خطوط ۵ و ۹: نام جداول با نام اسکیمای مربوطه، [public]، پیشوند شدهاند. این کار کاملاً ضروری نبود، زیرا [public] اسکیمای پیشفرض است وقتی که در نام جدول هیچ اسکیمایی مشخص نشده باشد؛
- خطوط ۶–۸، ۱۰–۱۹: نام ستونها تغییر کرده است؛
اسکریپت [MainTransferAdminDataFromJsonFile2PostgresDatabase.php] برای پر کردن پایگاه داده [dbimpots-2019] به شرح زیر است:
<?php
// پابندی سختگیرانه به انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// مدیریت خطا توسط PHP
//ini_set("display_errors", "0");
// شامل کردن رابطها و کلاسها
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao4TransferAdminData2Database.php";
require_once __DIR__ . "/../../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php";
//
//تعریف ثابتها
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";
//
try {
//ایجاد لایه [dao]
$dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
//انتقال دادهها به پایگاه داده
$dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
//نمایش خطا
print "L'erreur suivante s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// پایان
print "Terminé\n";
exit;
توضیحات
فقط خطوط ۱۲ تا ۲۱ که فایلهای لازم برای اجرای برنامه را بارگذاری میکنند، تغییر میکنند. این خطوط به دلیل تغییر مقدار [__DIR__] تغییر میکنند: اکنون به پوشه [version-07/Main] اشاره دارد.
وقتی این اسکریپت اجرا میشود، نتیجه زیر در جدول [tbtranches] به دست میآید:

- روی [1] کلیک راست کنید، سپس روی [2-3] کلیک کنید؛
- در [4]، دادههای طبقه مالیاتی واقعاً موجود است؛
همان روند را برای جدول ثابتها [tbconstantes] تکرار کنید:



توجه داشته باشید که برای اجرای اسکریپت، نیازی به اجرای برنامه Laragon نیست: نه سرور آپاچی و نه سرویسهای SGBD یا MySQL مورد نیاز هستند. تنها چیزی که لازم است سرویس SGBD PostgreSQL است که سرویس ویندوز آن راهاندازی شده است.
14.5. محاسبه مالیات

لایههای [dao] (۳) و [métier] (۲) قبلاً نوشته شدهاند. ما قبلاً اسکریپت اصلی برای SGBD و MySQL را در بخش «link» نوشتهایم. ما فقط باید اسکریپت [MainCalculateImpotsWithTaxAdminDataInMySQLDatabase.php] را برداریم و آن را برای SGBD و PostgreSQL تطبیق دهیم. اکنون این اسکریپت [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php] نامیده میشود:

اسکریپت [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php] به شرح زیر است:
<?php
// رعایت دقیق انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// مدیریت خطا توسط PHP
//ini_set("display_errors", "0");
// شامل کردن رابطها و کلاسها
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once __DIR__ . "/../../version-05/Métier/InterfaceMetier.php";
require_once __DIR__ . "/../../version-05/Métier/Metier.php";
//
// تعریف ثابتها
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";
const RESULTS_FILENAME = "../Data/resultats.json";
const ERRORS_FILENAME = "../Data/errors.json";
const TAXPAYERSDATA_FILENAME = "../Data/taxpayersdata.json";
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;
توضیحات
فقط خطوط ۱۲ تا ۲۲ که فایلهای لازم برای اجرای برنامه را بارگذاری میکنند، تغییر میکنند. این خطوط به دلیل تغییر مقدار [__DIR__] تغییر میکنند: اکنون به پوشه [version-07/Main] اشاره میکند.
نتایج اجرا
همانند آنچه در نسخههای قبلی به دست آمده است.
14.6. آزمایشهای [Codeception]
مانند نسخههای قبلی، این نسخه را با استفاده از تستهای [Codeception] اعتبارسنجی میکنیم:

14.6.1. آزمایش لایه [dao]
آزمون [DaoTest.php] به شرح زیر است:
<?php
// رعایت دقیق انواع اعلامشده پارامترهای تابع
declare (strict_types=1);
// فضای نام
namespace Application;
// زیرپوشههای ریشه
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");
// شامل کردن رابطها و کلاسها
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
// کتابخانههای شخص ثالث
require_once VENDOR . "/autoload.php";
// تعریف ثابتها
const DATABASE_CONFIG_FILENAME = ROOT ."../Data/database.json";
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] همان متدی است که در بخش مرتبط توصیف شده است؛
نتایج آزمون به شرح زیر است:

14.6.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-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");
// شامل کردن رابطها و کلاسها
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once ROOT . "/../version-05/Métier/InterfaceMetier.php";
require_once ROOT . "/../version-05/Métier/Metier.php";
// کتابخانههای شخص ثالث
require_once VENDOR . "/autoload.php";
// تعریف ثابتها
const DATABASE_CONFIG_FILENAME = ROOT . "../Data/database.json";
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] و [métier];
- خط ۳۹: ویژگی [$this→métier] به لایه [métier] ارجاع میدهد
- خطوط ۴۳–۴۹: متدهای [test1, test2…, test11] همانهایی هستند که در بخش «لینک» توصیف شدهاند؛
نتایج آزمون به شرح زیر است:
