Compare commits
No commits in common. "master" and "lab4" have entirely different histories.
128
README.md
128
README.md
@ -49,134 +49,6 @@ graph TD;
|
|||||||
|
|
||||||
За историю отвечает класс *StoryTeller*. Он меняет состояние персонажей и отображает их состояние.
|
За историю отвечает класс *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 лабы
|
## Особенности 4 лабы
|
||||||
Есть два исключения: `OwnershipException` и `ExitFuelException`. `OwnershipException` - исключение при взятии чужой вещи.
|
Есть два исключения: `OwnershipException` и `ExitFuelException`. `OwnershipException` - исключение при взятии чужой вещи.
|
||||||
`ExitFuelException` возникает, когда у Карлсона кончается топливо.
|
`ExitFuelException` возникает, когда у Карлсона кончается топливо.
|
||||||
|
|||||||
11
src/Annotations/ValidLength.java
Normal file
11
src/Annotations/ValidLength.java
Normal 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 {
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
package Characters;
|
package Characters;
|
||||||
|
|
||||||
|
import Annotations.ValidLength;
|
||||||
import Entity.Entity;
|
import Entity.Entity;
|
||||||
import Items.Item;
|
import Items.Item;
|
||||||
|
|
||||||
@ -25,6 +26,8 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
|
|||||||
|
|
||||||
private final Gender gender;
|
private final Gender gender;
|
||||||
private Entity position;
|
private Entity position;
|
||||||
|
|
||||||
|
@ValidLength
|
||||||
private String currentState = "";
|
private String currentState = "";
|
||||||
protected Feels feel;
|
protected Feels feel;
|
||||||
protected Item itemInHand;
|
protected Item itemInHand;
|
||||||
@ -62,6 +65,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
|
|||||||
|
|
||||||
protected final void setPosition(Entity obj) {
|
protected final void setPosition(Entity obj) {
|
||||||
this.position = obj;
|
this.position = obj;
|
||||||
|
this.validateFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getState() {
|
public final String getState() {
|
||||||
@ -70,6 +74,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
|
|||||||
|
|
||||||
protected final void setState(String state) {
|
protected final void setState(String state) {
|
||||||
this.currentState = state;
|
this.currentState = state;
|
||||||
|
this.validateFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -89,4 +94,34 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(this.name, this.gender);
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user