feature: add checked ownership exception
This commit is contained in:
parent
460a535ba0
commit
d8ff6d9f5b
150
README.md
150
README.md
@ -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
|
||||
```
|
||||
@ -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;
|
||||
|
||||
@ -5,7 +5,7 @@ public enum Feels {
|
||||
SCARY("дрогнул губой"),
|
||||
SAD("надулся"),
|
||||
RAGE("взревела от бешенства"),
|
||||
NORMAL("Нормально");
|
||||
NORMAL("нормально");
|
||||
|
||||
private final String feel;
|
||||
|
||||
|
||||
@ -3,5 +3,5 @@ package Characters;
|
||||
import Items.Item;
|
||||
|
||||
interface ICanTake {
|
||||
void grab(Item obj);
|
||||
void grab(Item obj) throws OwnershipException;
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
7
src/Characters/OwnershipException.java
Normal file
7
src/Characters/OwnershipException.java
Normal file
@ -0,0 +1,7 @@
|
||||
package Characters;
|
||||
|
||||
public class OwnershipException extends Exception {
|
||||
public OwnershipException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user