-
Notifications
You must be signed in to change notification settings - Fork 0
/
test3.php
160 lines (141 loc) · 5.38 KB
/
test3.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
/**
* @charset UTF-8
*
* Задание 3
* В данный момент компания X работает с двумя перевозчиками
* 1. Почта России
* 2. DHL
* У каждого перевозчика своя формула расчета стоимости доставки посылки
* Почта России до 10 кг берет 100 руб, все что cвыше 10 кг берет 1000 руб
* DHL за каждый 1 кг берет 100 руб
* Задача:
* Необходимо описать архитектуру на php из методов или классов для работы с
* перевозчиками на предмет получения стоимости доставки по каждому из указанных
* перевозчиков, согласно данным формулам.
* При разработке нужно учесть, что количество перевозчиков со временем может
* возрасти. И делать расчет для новых перевозчиков будут уже другие программисты.
* Поэтому необходимо построить архитектуру так, чтобы максимально минимизировать
* ошибки программиста, который будет в дальнейшем делать расчет для нового
* перевозчика, а также того, кто будет пользоваться данным архитектурным решением.
*
*/
# Использовать данные:
# любые
/**
* Абстрактный класс компании
*/
abstract class Company {
abstract public function __construct();
abstract public function set_title(string $title) : void;
abstract public function get_title() : string;
abstract public function get_cost(int $weight) : int;
}
/**
* Класс компании "Почта России"
*
* @property string $title Заголовок компании
*
* @method void __construct() Конструктор класса
* @method string get_title() Получение заголовка компании
* @method void set_title(string $title) Задать заголовок компании
* @method int get_cost(int $weight) Получить стоимость за вес
*/
class CompanyMailRussia extends Company {
private string $title;
public function __construct() {
// ...
}
/**
* Получение заголовка компании
*
* @return string Заголовок компании
*/
public function get_title() : string {
return $this->title;
}
/**
* Задать заголовок компании
*/
public function set_title(string $title) : void {
$this->title = $title;
}
/**
* Получить стоимость за вес
*
* @param int $weight Вес груза
*
* @return int Стоимость перевозки
*/
public function get_cost(int $weight) : int {
return ($weight < 10) ? 100 : 1000;
}
}
/**
* Класс компании "DHL"
*
* @property string $title Заголовок компании
*
* @method void __construct() Конструктор класса
* @method string get_title() Получение заголовка компании
* @method void set_title(string $title) Задать заголовок компании
* @method int get_cost(int $weight) Получить стоимость за вес
*/
class CompanyDHL extends Company {
private string $title;
public function __construct() {
// ...
}
/**
* Получение заголовка компании
*
* @return string Заголовок компании
*/
public function get_title() : string {
return $this->title;
}
/**
* Задать заголовок компании
*/
public function set_title(string $title) : void {
$this->title = $title;
}
/**
* Получить стоимость за вес
*
* @param int $weight Вес груза
*
* @return int Стоимость перевозки
*/
public function get_cost(int $weight) : int {
return $weight * 100;
}
}
// Тестирование
/**
* @var CompanyMailRussia $company_mail_russia Экземпляр класса CompanyMailRussia
*/
$company_mail_russia = new CompanyMailRussia();
// Задаем заголовок компании
$company_mail_russia->set_title('Почта России');
/**
* @var array $company_mail_russia_test Массив с данными о весе грузов
*/
$company_mail_russia_test = [2, 6, 10, 24];
foreach ($company_mail_russia_test as $weight) {
echo sprintf('%s: %d рублей за %dкг', $company_mail_russia->get_title(), $company_mail_russia->get_cost($weight), $weight) . PHP_EOL;
}
/**
* @var CompanyDHL $company_dhl Экземпляр класса CompanyDHL
*/
$company_dhl = new CompanyDHL();
// Задаем заголовок компании
$company_dhl->set_title('DHL');
/**
* @var array $company_dhl_test Массив с данными о весе грузов
*/
$company_dhl_test = [2, 6, 10, 24];
foreach ($company_dhl_test as $weight) {
echo sprintf('%s: %d рублей за %dкг', $company_dhl->get_title(), $company_dhl->get_cost($weight), $weight) . PHP_EOL;
}
?>