feature: add checked ownership exception

This commit is contained in:
Ivan Zinchenko 2023-12-28 13:45:03 +03:00
parent 460a535ba0
commit d8ff6d9f5b
Signed by: zinch
GPG Key ID: 6D45AA2C8FD6A37E
7 changed files with 30 additions and 154 deletions

150
README.md
View File

@ -3,154 +3,18 @@
**ИСУ:** 408657
**Вариант:** 528475
**Вариант:** 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
class Entity {
# String name
+ getName() String
}
class Character {
# Item itemInHand
# Feels feel
- String currentState
- Gender gender
- Entity position
+ setFeel(Feels)* void
+ moveTo(Entity)* void
+ grab(Item)* void
+ getItemInHand() Item
+ getPosition() Entity
+ getGender() String
+ getState() String
# setState(String) void
# setPosition(Entity) void
}
class FrenBok {
- IGrabbable characterInHand
+ grabCharacter(IGrabbable) void
+ setFeel(Feels) void
+ moveTo(Entity) void
+ grab(Item) void
+ pushCharacterBehindItem(Item) void
}
class Karlson {
+ grab(Item) void
+ setFeel(Feels) void
+ moveTo(Entity) void
+ grabFrom(Container) void
+ getGrabbablePart() String
}
class Item {
- Character owner
+ getOwner() Character
+ setOwner(Character) void
}
class Container {
- Item innerItem
+ getInnerItem() Item
}
class Feels {
<<enumeration>>
+ SAD
+ ANGRY
+ SCARY
+ RAGE
+ NORMAL
- String feel
+ values() Feels[]
+ toString() String
+ valueOf(String) Feels
}
class Gender {
<<enumeration>>
- String gender
+ MAN
+ WOMAN
+ valueOf(String) Gender
+ toString() String
+ values() Gender[]
}
class StoryTeller {
- Item door
- Item meatball
- Container fryingPan
- FrenBok frenBok
- Karlson karlson
- Item kitchenHob
+ play() void
}
class ICanTake {
<<interface>>
+ grab(Item) void
}
class IMovable {
<<interface>>
+ moveTo(Entity) void
}
class IFeelable {
<<interface>>
+ setFeel(Feels) void
}
class IGrabbable {
<<interface>>
+ getGrabbablePart() String
}
IGrabbable --|> IMovable
Character --|> Entity
Container --|> Item
FrenBok --|> Character
Item --|> Entity
Karlson --|> Character
Character ..|> IFeelable
Character ..|> IMovable
Character ..|> ICanTake
Karlson ..|> IGrabbable
Character --> Feels
Character --> Gender
```

View File

@ -30,7 +30,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
public abstract void moveTo(Entity obj);
public abstract void grab(Item obj);
public abstract void grab(Item obj) throws OwnershipException;
public Item getItemInHand() {
return this.itemInHand;

View File

@ -5,7 +5,7 @@ public enum Feels {
SCARY("дрогнул губой"),
SAD("надулся"),
RAGE("взревела от бешенства"),
NORMAL("Нормально");
NORMAL("нормально");
private final String feel;

View File

@ -3,5 +3,5 @@ package Characters;
import Items.Item;
interface ICanTake {
void grab(Item obj);
void grab(Item obj) throws OwnershipException;
}

View File

@ -27,12 +27,15 @@ public class Karlson extends Character implements IGrabbable {
}
@Override
public void grab(Item obj) {
public void grab(Item obj) throws OwnershipException {
this.itemInHand = obj;
this.setState(String.format("%s взял %s", this.getGender(), obj));
if (obj.getOwner() != this && obj.getOwner() != null) {
throw new OwnershipException(String.format("Предмет %s принадлежит %s, а не %s", obj.getName(), obj.getOwner().getName(), this.getName()));
}
}
public void grabFrom(Container container) {
public void grabFrom(Container container) throws OwnershipException {
this.grab(container.getInnerItem());
this.setState(String.format("%s взял одну %s из %s", this.getName(), container.getInnerItem(), container));
}

View File

@ -0,0 +1,7 @@
package Characters;
public class OwnershipException extends Exception {
public OwnershipException(String message) {
super(message);
}
}

View File

@ -3,6 +3,7 @@ package StoryTeller;
import Characters.Feels;
import Characters.FrenBok;
import Characters.Karlson;
import Characters.OwnershipException;
import Items.Container;
import Items.Item;
@ -24,9 +25,13 @@ public class StoryTeller {
System.out.println(karlson.getState());
karlson.moveTo(kitchenHob);
System.out.println(karlson.getState());
karlson.grabFrom(fryingPan);
System.out.println(karlson.getState());
if (fryingPan.getOwner() == frenBok) {
try {
karlson.grabFrom(fryingPan);
System.out.println(karlson.getState());
frenBok.setFeel(Feels.NORMAL);
System.out.println(frenBok.getState());
} catch (OwnershipException e) {
System.out.println(e.getMessage());
System.out.println("Вот этого ему не следовало делать");
frenBok.setFeel(Feels.RAGE);
System.out.println(frenBok.getState());
@ -36,9 +41,6 @@ public class StoryTeller {
System.out.println(frenBok.getState());
frenBok.pushCharacterBehindItem(door);
System.out.println(frenBok.getState());
} else {
frenBok.setFeel(Feels.NORMAL);
System.out.println(frenBok);
}
}
}