PROG_LAB4/README.md
2023-12-30 17:44:16 +05:00

186 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Выполнял
**ФИ:** Зинченко Иван
**ИСУ:** 408657
**Вариант:** ~528475.3
_Так как на se.ifmo сбросились варианты я взял текст напрямую из сказки._
## Задание
> У Карлсона дрогнули губы, и он надулся. Он сделал шаг к плите и взял со сковородки одну тефтельку.
> Вот этого ему не следовало делать. Фрекен Бок взревела от бешенства и кинулась на Карлсона, схватила его за шиворот
> и вытолкнула за дверь. Малыш был просто в отчаянии. Больше он ничего не успел сказать, потому что дверь кухни
> распахнулась и ворвался Карлсон, тоже злой как чёрт. Он подлетел к Фрекен Бок и топнул ногой об пол.
## Вывод программы
```
Кралсон дрогнул губой
Кралсон надулся
Он сделал шаг к плита
Предмет тефтелька принадлежит Фрекен Бок, а не Кралсон
Вот этого ему не следовало делать
Фрекен Бок взревела от бешенства
Она кинулась к Кралсон
Она схватила Кралсон за шиворот
Она вытолкнула Кралсон за Дверь
Малыш был просто в отчаянии
Он ничего не сказал
Дверь распахнулась
Он сделал шаг к Дверь
Кралсон злой как чёрт
Он подлетел к Фрекен Бок
Кралсон топнул ногой
```
## Структура проекта
```mermaid
graph TD;
Entity-->Character;
Character-->FenBok;
Character-->Karlson;
Entity-->Item;
Item-->Container;
```
Главный абстрактный класс - Entity, который имеет только имя. От него наследуются предметы и персонажи.
Персонажи могут чувствовать *(IFeelabe)*, двигаться *(IMovable)* и брать вещи *(ITakeable)*.
Также персонажи имеют гендер *(enum Feels)*.
За историю отвечает класс *StoryTeller*. Он меняет состояние персонажей и отображает их состояние.
## UML диаграмма
```mermaid
classDiagram
direction BT
class Character {
# Feels feel
# Item itemInHand
- Gender gender
- Entity position
- String currentState
+ setFeel(Feels) void
+ getGender() String
+ moveTo(Entity) void
+ getState() String
+ getPosition() Entity
+ getItemInHand() Item
+ grab(Item) void
# setState(String) void
# setPosition(Entity) void
- validateFields() void
- getValueForField(Object, Field) String?
- setValueForField(Object, Field, String) void
}
class Container {
- Item innerItem
+ getInnerItem() Item
}
class Door {
- boolean isOpen
+ closeDoor() void
+ openDoor() void
}
class Entity {
# String name
+ getName() String
}
class ExitFuelException
class Feels {
<<enumeration>>
+ SAD
+ SCARY
+ RAGE
+ DEAD_INSIDE
+ ANGRY
+ NORMAL
- String feel
+ valueOf(String) Feels
+ toString() String
+ values() Feels[]
}
class FrenBok {
- IGrabbable characterInHand
+ pushCharacterBehindItem(Item) void
+ moveTo(Entity) void
+ grab(Item) void
+ grabCharacter(IGrabbable) void
}
class ICanTake {
<<Interface>>
+ grab(Item) void
}
class IFeelable {
<<Interface>>
+ setFeel(Feels) void
}
class IFlyable {
<<Interface>>
+ flyTo(Entity) void
}
class IGrabbable {
<<Interface>>
+ getGrabbablePart() String
}
class IMovable {
<<Interface>>
+ moveTo(Entity) void
}
class Item {
- Character owner
+ setOwner(Character) void
+ equals(Object) boolean
+ getOwner() Character
}
class Karlson {
- Engine engine
+ grab(Item) void
+ flyTo(Entity) void
+ moveTo(Entity) void
+ grabFrom(Container) void
+ stomp() void
+ getGrabbablePart() String
}
class Main {
+ main(String[]) void
}
class Malysh {
- Mouth mouth
+ moveTo(Entity) void
+ speak(String) void
+ grab(Item) void
}
class OwnershipException
class StoryTeller {
- FrenBok frenBok
- Door door
- Karlson karlson
- Item meatball
- Container fryingPan
- Item kitchenHob
- Malysh malysh
+ play() void
}
Character --> Entity
Character ..> ICanTake
Character ..> IFeelable
Character ..> IMovable
Container --> Item
Door --> Item
FrenBok --> Character
IGrabbable --> IMovable
Item --> Entity
Karlson --> Character
Karlson ..> IFlyable
Karlson ..> IGrabbable
Malysh --> Character
```
## Особенности 4 лабы
Есть два исключения: `OwnershipException` и `ExitFuelException`. `OwnershipException` - исключение при взятии чужой вещи.
`ExitFuelException` возникает, когда у Карлсона кончается топливо.
Есть вложенный статический класс `Engin` у Карлсона, отвечающий за его движок. В нём есть локальный класс `Path`, хранящий
в себе дистанцию полёта и формулу расчёта расхода. Для формулы используются анонимные классы интерфейса `IntFormula`.
Есть вложенный не статический класс `Mouth` у Малыша, который отвечает за его речь.