Допустим, у нас есть простой CreateOrder
команда, и она может иметь 3 разных «уровня» криптографии.
Прозрачный уровень:
class CreateOrder
{
public function __construct(
string $id,
string $paymentMethod,
float $paymentAmount,
string $customerFirstName,
string $customerLastName,
string $billingAddressFirstName,
string $billingAddressLastName,
string $billingAddressStreet,
string $billingAddressCity
array $items // that's the only ninja
) {
// setters
}
}
Этот уровень должен выставлять все возможные поля заранее (которые могут достигать 30-50 или даже больше). Единственным неизвестным является список предметов, но на языках без Структуры вы просто не можете избежать этого (если мы не согласны с тем, что команды могут принимать объекты-значения).
Сгруппированный уровень:
class CreateOrder
{
public function __construct(
string $id,
array $payment,
array $customer,
array $billingAddress,
array $shippingAddress,
array $items // that's the only ninja
) {
// setters
}
}
Этот уровень просто принимает массивы как они будут Структуры. Это более загадочно, но позволяет легче модифицировать в случае, если мы хотим добавить еще одно поле в одну из групп. С другой стороны, мы должны проверить, были ли использованы правильные ключи, и, конечно, написать некоторую документацию, чтобы описать, какие поля являются приемлемыми.
Последний уровень — ниндзя:
class CreateOrder
{
public function __construct(array $data) {
// setters
}
}
Хорошо, если мы решили Сгруппированный уровень мы уже можем принять ниндзя один, потому что это та же проблема. Мы должны проверить все ключи и записать некоторую документацию, описывающую содержание полезных данных.
PS.
Пожалуйста, не указывайте мне, что предметы в Прозрачный уровень можно добавить в заказ с помощью отдельной команды, например Добавьте предмет. Давайте просто предположим, что я должен создать заказ, используя одну транзакцию и одну команду.
Мои вопросы тогда:
Задача ещё не решена.
Других решений пока нет …