Compare commits

..

No commits in common. "master" and "lab4" have entirely different histories.
master ... lab4

3 changed files with 46 additions and 128 deletions

128
README.md
View File

@ -49,134 +49,6 @@ graph TD;
За историю отвечает класс *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` возникает, когда у Карлсона кончается топливо.

View File

@ -0,0 +1,11 @@
package Annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidLength {
}

View File

@ -1,5 +1,6 @@
package Characters;
import Annotations.ValidLength;
import Entity.Entity;
import Items.Item;
@ -25,6 +26,8 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
private final Gender gender;
private Entity position;
@ValidLength
private String currentState = "";
protected Feels feel;
protected Item itemInHand;
@ -62,6 +65,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
protected final void setPosition(Entity obj) {
this.position = obj;
this.validateFields();
}
public final String getState() {
@ -70,6 +74,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
protected final void setState(String state) {
this.currentState = state;
this.validateFields();
}
@Override
@ -89,4 +94,34 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
public int hashCode() {
return Objects.hash(this.name, this.gender);
}
private void validateFields() {
for (java.lang.reflect.Field field : Character.class.getDeclaredFields()) {
if (field.isAnnotationPresent(ValidLength.class)) {
String value = getValueForField(this, field);
if (value.length() < 3 || value.length() > 20) {
setValueForField(this, field, "unknown");
}
}
}
}
private static String getValueForField(Object obj, java.lang.reflect.Field field) {
try {
field.setAccessible(true);
return (String) field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
private static void setValueForField(Object obj, java.lang.reflect.Field field, String value) {
try {
field.setAccessible(true);
field.set(obj, value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}