автор АбдельКадер Буаджаджа [email protected]
Этот API позволяет вам сортировать неупорядоченные посадочные талоны.
Создайте образ докера и запустите его, чтобы сделать его контейнером:
docker build -t medinae/journey .
docker run medinae/journey
1 . Загрузите объекты посадочных талонов из ваших действительных входных данных:
$ loader = new JsonBoardingCardLoader ();
$ boardingCards = $ loader -> loadCards ( $ jsonCards );
2 . Передайте свои BoardingCards новому объекту Trip. Вы также можете внедрить свой конкретный сортировщик, реализующий BoardingCardLoaderInterface. По умолчанию будет использоваться существующий сортировщик.
$ trip = new Trip ( $ boardingCards );
// OR
$ trip = new Trip ( $ boardingCards , new MyAmazingSorter ());
3 . Получите заказанные посадочные талоны (ПРИМЕЧАНИЕ: метод toString также реализован, если вы хотите отобразить информацию о поездке в удобочитаемой форме):
$ trip -> getOrderedBoardingCards ();
4 . Наслаждаться !
Вы можете создать несколько новых объектов посадочных талонов, реализовав BoardingCardInterface. Будьте осторожны: если вы хотите, чтобы объект вашего посадочного талона можно было сортировать с помощью сортировщика API, не забудьте реализовать ComparableBoardingCardInterface. Также добавьте его в фабрику загрузчиков.
Пример :
class FerryBoardingCard implements BoardingCardInterface
{
use BoardingCardTrait;
private $ isGoldClass ;
public function __toString ()
{
return sprintf (
' Take ferry from %s to %s. Seat : %s. Gold class : %s ' ,
$ this -> departurePlace ,
$ this -> arrivalPlace ,
$ this -> seat ,
( $ this -> isGoldClass ) ? ' YES ' : ' NO '
);
}
}
Затем необходимо изменить загрузчик, чтобы создавать с его помощью посадочные талоны на паром:
class JsonBoardingCardLoader implements BoardingCardLoaderInterface
{
public function loadCards ( $ json )
{
// ...
}
protected function createCard ( array $ cardData )
{
// ...
case ' ferry ' :
// data validation
return new FerryBoardingCard (
new Place ( $ cardData [ ' from ' ]),
new Place ( $ cardData [ ' to ' ]),
$ cardData [ ' seat ' ],
$ cardData [ ' isGoldClass ' ]
);
default:
throw new UnknownBoardingCardTypeException ( ' JSON Loading : Unknown board card type ' . $ type );
}
}
}
Что касается загрузчика, я реализовал JsonBoardingCardLoader, который создает объекты посадочных талонов карты из допустимого ввода JSON. Кроме того, данные посадочных талонов могут поступать из нескольких форматов (например, XML), поэтому я создал BoardingCardLoaderInterface с методом loadCards().
Тогда возможным улучшением API может быть XMLBoardingCardLoader, например:
class XMLBoardingCardLoader implements BoardingCardLoaderInterface
{
public function loadCards ( string $ xml ): array
{
// Logic to create boarding cards objects cards from XML
}
}
Наконец, также возможно расширить код, создав новые сортировщики, реализовав CardSorterInterface, например:
class AwesomeSorter implements CardSorterInterface
{
public function sort ( array $ boardingCards ): array
{
// Your awesome algorithm
}
}