Skip to content

Commit

Permalink
Add details to Homework 01 assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
100yo committed Nov 16, 2024
1 parent 12d544a commit a848538
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 14 deletions.
60 changes: 46 additions & 14 deletions homeworks/01-glovo/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,22 @@

## Glovo 🚚

`Краен срок: [30.11.2024 23:59:59]`
`Краен срок: [30.11.2024 23:59]`

### Описание на задачата

Имаме привилегията да живеем в свят, в който храна и всякакви покупки от магазина долитат при вас с един клик. Сега си представете, че вие сте магьосниците зад тази магия! Ще разработите приложение за доставка, което не само следи къде е вашият бургер или пица в момента, но и гарантира, че те ще пристигнат топли, вкусни и навреме 🍕🥡, пренасяйки щастие директно до вратата на хората! 🚀🍟

#### Бърз поглед над задачите

1. Дадени са два интерфейса, както и няколко помощни класа. Имплементирайте интерфейсите. Не променяйте сигнатурите на дадените методи, както и всички конструктури, дадени в условието. Може да добавяте още класове, ако сметнете за необходимо.
2. Добавете **поне два** ***ваши***, т.е. не част от Java JDK, Runtime Exceptions, които да се хвърлят в някои от методите ви. Кое поведение се приема за бъг на програмата този път определяте вие.
3. Добавете необходимите валидации за валидни параметри, подадени на методите, дефинирани в интерфейса.
4. Вие избирате какви алгоритми да използвате. Ако използвате по-ефективен, бихте получили бонус точки, но с тривиален подход, стига да работи правилно, със сигурност няма да ви бъдат взети такива.

⚠️***ВАЖНО УТОЧНЕНИЕ:***

**Решения, използващи [Java Stream API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/stream/package-summary.html), [lambdas](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html), и всичко останало, което не е покрито до момента, няма да се приемат за това домашно.**

### GlovoApi
В пакета `bg.sofia.uni.fmi.mjt.glovo` създайте интерфейса `GlovoApi`. Както вече сте свикнали - какво се очаква да бъде поведението на неговите имплементатори, е описано в java docs над всеки метод:

В пакета `bg.sofia.uni.fmi.mjt.glovo` създайте интерфейса `GlovoApi`. Както вече сте свикнали - какво се очаква да бъде поведението на неговите имплементатори, е описано в javadocs над всеки метод:

```java
package bg.sofia.uni.fmi.mjt.glovo;
Expand Down Expand Up @@ -92,6 +90,7 @@ public interface GlovoApi {
```

### ControlCenterApi

В пакета `bg.sofia.uni.fmi.mjt.glovo.controlcenter` създайте интерфейса `ControlCenterApi`

```java
Expand Down Expand Up @@ -125,29 +124,34 @@ public interface ControlCenterApi {
* @return A MapEntity[][] containing the map
*/
MapEntity[][] getLayout();

}
```

### Имплементации на интерфейсите

Имплементацията на `GlovoApi` e `Glovo`. Имплементацията на `ControlCenterApi` е `ControlCenter`.
И двата имплементиращи класа имат конструктори, които приемат един и същи параметър mapLayout, който ще обясним по-надолу в тази секция:
И двата имплементиращи класа имат конструктори, които приемат един и същи параметър `mapLayout`, който ще обясним по-надолу в тази секция:

```java
public ControlCenter(char[][] mapLayout) {...}
public Glovo(char[][] mapLayout) {...}
```

`mapLayout` е двумерен масив от символи, представляващ картата, с която работим в този момент. На тази карта са координатите на всички ресторанти, на всички клиенти, както и на всички доставчици. Освен това, имаме и пътищата между тях.
Всяко едно поле на картата има специален символ. Значението на символите е както следва:

* '#' = Wall
* '.' = Road
* 'R' = Restaurant
* 'C' = Client
* 'A' = DeliveryGuy in a car
* 'B' = DeliveryGuy on a Bike

Посоките за движение по картата са 4 - нагоре, надолу, наляво и надясно. Доставчикът може да преминава през всичко, различно от стена (включително и други доставчици). Приемаме, че всички доставчкици са свободни в момента на поръчката, а след нея те не променят локацията си т.е остават в стартова позиция.
Посоките за движение по картата са 4 - нагоре, надолу, наляво и надясно. Доставчикът може да преминава през всичко, различно от стена (включително и други доставчици). Приемаме, че всички доставчици са свободни в момента на поръчката, а след нея те не променят локацията си т.е. остават в стартова позиция.

Например:

```java
char[][] layout = {
{'#', '#', '#', '.', '#'},
Expand All @@ -159,31 +163,38 @@ char[][] layout = {
```

### Помощни типове

Освен основните класове и интерфейси, в условието има нужда да дефинираме още няколко помощни класа/records. Имплементациите ви, естествено, не се изчерпват с този набор от типове и спокойно може да дефинирате нови. Единственото условие е да не променяте вече дадените по условие такива, техните конструктори и сигнатурите на методите им.

#### Location
Location е част от пакета `bg.sofia.uni.fmi.mjt.glovo.controlcenter.map`, репрезентира координатите на дадено entity на нашата карта и има конструктор:

`Location` е част от пакета `bg.sofia.uni.fmi.mjt.glovo.controlcenter.map`, репрезентира координатите на дадено entity на нашата карта и има следния конструктор:

```java
public Location(int x, int y) { ... }
```

#### Delivery

В пакета `bg.sofia.uni.fmi.mjt.glovo.delivery` създайте нов Java тип `Delivery`, който има следния конструктор:

```java
public Delivery(Location client, Location restaurant, Location deliveryGuy, String foodItem, double price, int estimatedTime) { ... }
```

#### DeliveryType
Видът на транспорта на доставките се моделира от enum `DeliveryType`, дефиниран в `bg.sofia.uni.fmi.mjt.glovo.delivery` и имащ две стойности, които се характеризират с цена на километър и време за изминаване на километър:

Видът на транспорта на доставките се моделира от enum-а `DeliveryType`, дефиниран в `bg.sofia.uni.fmi.mjt.glovo.delivery` и имащ две стойности, които се характеризират с цена на километър и време за изминаване на километър:

| `DeliveryType` | Price per kilometer | Time per kilometer |
|----------------|---------------------|--------------------|
| CAR | 5 | 3 |
| BIKE | 3 | 5 |

#### Shipping method

Методът на доставка се моделира от следния enum:

```java
package bg.sofia.uni.fmi.mjt.glovo.delivery;

Expand All @@ -194,7 +205,9 @@ public enum ShippingMethod {
```

#### DeliveryInfo
Последният помощен тип от пакета `bg.sofia.uni.fmi.mjt.glovo.delivery` е `DeliveryInfo` - той е релевантен за `ControlCenterAPI` интерфейса. Има следният конструктор:

Последният помощен тип от пакета `bg.sofia.uni.fmi.mjt.glovo.delivery` е `DeliveryInfo` - той е релевантен за `ControlCenterAPI` интерфейса и има следния конструктор:

```java
public DeliveryInfo(Location deliveryGuyLocation, double price, int estimatedTime, DeliveryType deliveryType)
```
Expand Down Expand Up @@ -233,8 +246,27 @@ src
### :warning: Забележки

- Не променяйте по никакъв начин интерфейсите, дадени в условието.
- :exclamation::exclamation: **Решения,
използващи [Java Stream API](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/stream/package-summary.html),
- :exclamation: **Решения,
използващи [Java Stream API](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/stream/package-summary.html),
[lambdas](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html), и всичко останало, което не е
покрито до момента, няма да се приемат за това домашно.**
учено до момента в курса, няма да се приемат за това домашно.**

### Предаване

За да предадете решението си, качете цялата `src` директория на проекта в съответния assignment в грейдъра
(или я архивирайте в **zip** файл и качете него).

### Оценяване

Решението може да ви донесе до 100 точки, като ще бъде оценявано за:

* функционална пълнота и коректност: чрез автоматични тестове (80% от оценката)
* добър обектно-ориентиран дизайн, спазване на правилата за чист код и подбиране на оптимални за задачата структури от
данни (20% от оценката)

Обърнете внимание, че при качване на решението ви, в грейдъра ще се изпълни само _smoke_ тест, чиято цел е да изчистите
евентуални проблеми с компилацията. Референтите тестове и Checkstyle статичният код анализ ще се изпълнят еднократно
след изтичане на крайния срок за предаване. За функционалната коректност и качеството на кода ще трябва да се погрижите
без тяхната помощ.

### Желаем ви успех! :four_leaf_clover:
5 changes: 5 additions & 0 deletions homeworks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Домашни

| # | Условие | Краен срок |
|:--|:-------------------------------------------------------------------------- |:---------------- |
| 1 | [Glovo](https://github.com/fmi/java-course/tree/master/homeworks/01-glovo) | 30.11.2024 23:59 |

0 comments on commit a848538

Please sign in to comment.