나는 디자인과 객체 구조 관련 질문을 가지고있다. 다음은 문제 설명입니다.디자인과 객체 책임에 대한 질문
- 나는 자체적으로 땅을 가로 지르는 로봇 개체를 가지고 있습니다. 그것은 이동 명령을 제공하고 그에 따라 해석해야합니다. 예를 들어 샘플 입력은 다음과 같습니다. a. RotateRight | Move | RotateLeft | Move | Move | Move
여기서 move는 그리드의 단위 이동입니다.
나는 자바로 아주 기본적인 디자인을했다.
package com.roverboy.entity;
import com.roverboy.states.RotateLeftState;
import com.roverboy.states.RotateRightState;
import com.roverboy.states.State;
public class Rover {
private Coordinate roverCoordinate;
private State roverState;
private State rotateRight;
private State rotateLeft;
private State move;
public Rover() {
this(0, 0, Compass.NORTH);
}
public Rover(int xCoordinate, int yCoordinate, String direction) {
roverCoordinate = new Coordinate(xCoordinate, yCoordinate, direction);
rotateRight = new RotateRightState(this);
rotateLeft = new RotateLeftState(this);
move = new MoveState(this);
}
public State getRoverState() {
return roverState;
}
public void setRoverState(State roverState) {
this.roverState = roverState;
}
public Coordinate currentCoordinates() {
return roverCoordinate;
}
public void rotateRight() {
roverState = rotateRight;
roverState.action();
}
public void rotateLeft() {
roverState = rotateLeft;
roverState.action();
}
public void move() {
roverState = move;
roverState.action();
}
}
package com.roverboy.states;
public interface State {
public void action();
}
package com.roverboy.entity;
import com.roverboy.states.State;
public class MoveState implements State {
private Rover rover;
public MoveState(Rover rover) {
this.rover = rover;
}
public void action() {
rover.currentCoordinates().setXCoordinate(
(Compass.EAST).equalsIgnoreCase(rover.currentCoordinates()
.getFacingDirection()) ? rover.currentCoordinates()
.getXCoordinate() + 1 : rover.currentCoordinates()
.getXCoordinate());
rover.currentCoordinates().setXCoordinate(
(Compass.WEST).equalsIgnoreCase(rover.currentCoordinates()
.getFacingDirection()) ? rover.currentCoordinates()
.getXCoordinate() - 1 : rover.currentCoordinates()
.getXCoordinate());
rover.currentCoordinates().setYCoordinate(
(Compass.NORTH).equalsIgnoreCase(rover.currentCoordinates()
.getFacingDirection()) ? rover.currentCoordinates()
.getYCoordinate() + 1 : rover.currentCoordinates()
.getYCoordinate());
rover.currentCoordinates().setYCoordinate(
(Compass.SOUTH).equalsIgnoreCase(rover.currentCoordinates()
.getFacingDirection()) ? rover.currentCoordinates()
.getYCoordinate() - 1 : rover.currentCoordinates()
.getYCoordinate());
}
}
package com.roverboy.states;
import com.roverboy.entity.Rover;
public class RotateRightState implements State {
private Rover rover;
public RotateRightState(Rover rover) {
this.rover = rover;
}
public void action() {
rover.currentCoordinates().directionOnRight();
}
}
package com.roverboy.states;
import com.roverboy.entity.Rover;
public class RotateLeftState implements State {
private Rover rover;
public RotateLeftState(Rover rover)
{
this.rover = rover;
}
public void action() {
rover.currentCoordinates().directionOnLeft();
}
}
package com.roverboy.entity;
public class Coordinate {
private int xCoordinate;
private int yCoordinate;
private Direction direction;
{
Direction north = new Direction(Compass.NORTH);
Direction south = new Direction(Compass.SOUTH);
Direction east = new Direction(Compass.EAST);
Direction west = new Direction(Compass.WEST);
north.directionOnRight = east;
north.directionOnLeft = west;
east.directionOnRight = north;
east.directionOnLeft = south;
south.directionOnRight = west;
south.directionOnLeft = east;
west.directionOnRight = south;
west.directionOnLeft = north;
direction = north;
}
public Coordinate(int xCoordinate, int yCoordinate, String direction) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
this.direction.face(direction);
}
public int getXCoordinate() {
return xCoordinate;
}
public void setXCoordinate(int coordinate) {
xCoordinate = coordinate;
}
public int getYCoordinate() {
return yCoordinate;
}
public void setYCoordinate(int coordinate) {
yCoordinate = coordinate;
}
public void directionOnRight()
{
direction.directionOnRight();
}
public void directionOnLeft()
{
direction.directionOnLeft();
}
public String getFacingDirection()
{
return direction.directionValue;
}
}
class Direction
{
String directionValue;
Direction directionOnRight;
Direction directionOnLeft;
Direction(String directionValue)
{
this.directionValue = directionValue;
}
void face(String directionValue)
{
for(int i=0;i<4;i++)
{
if(this.directionValue.equalsIgnoreCase(directionValue))
break;
else
directionOnRight();
}
}
void directionOnRight()
{
directionValue = directionOnRight.directionValue;
directionOnRight = directionOnRight.directionOnRight;
directionOnLeft = directionOnRight.directionOnLeft;
}
void directionOnLeft()
{
directionValue = directionOnLeft.directionValue;
directionOnRight = directionOnLeft.directionOnRight;
directionOnLeft = directionOnLeft.directionOnLeft;
}
}
지금 내 의심이 마지막 수업 "방향"함께 (전체 코드는 아래 붙여)와 "좌표". 좌표는 방향을 유지하는 데 도움이되는 로버의 좌표 객체를 나타냅니다. 현재 방향을 추적하기 위해 방향 객체의 이중 연결 목록을 사용하고 있습니다. 방향 객체는 거의 나침반처럼 작동합니다. 왼쪽이나 오른쪽으로 회전하십시오.
여기에 내가 갖고있는 질문이 있습니다. 1. 방향 추적을 위해 상태 패턴과 디자인을 사용했습니다. 이것을 단순화하는 더 좋은 방법이 있습니까? 렘. 좌표를 올바르게 유지해야합니다. 당신이 + y 축 방향으로 움직이면, 나의 좌표는 + 그 외의 마이너스가되어야합니다. X 축과 동일합니다.
현재 로버의 얼굴을 변경하는 책임은 좌표와 방향 클래스에 간접적으로 위임됩니다. 이게 맞습니까? 로버가 방향을 유지해야합니까? 그 책임을 좌표와 방향 수업에 위임하는 것이 내 설계에 정말 맞습니까? 그곳에서 조작하기가 더 쉽기 때문에?
간단한 디자인 개선 및 코드 제안 사항을 환영합니다. 자유롭게 비판 해보십시오.
양해 해 주셔서 감사합니다. 미리.
http://smlnj.org/icfp08-contest/task.html – finnw
편집기가이 질문을 정리할 수 있습니까? 제목이 너무 넓어서 OP가 알고리즘 문제를 다루는 것처럼 보일 때 디자인 도움말을 요청하고 있습니다. –