종종 코드 중복을 줄이려면 인터페이스가 발생합니다. 이 시간 (OP의 의견에 따라) 당신이 당신을 수준에 따라 보드에 다른 개체를 추가해야 할 것입니다 :
import java.util.List;
public interface LevelSettings {
List<GameObject> startingObjects();
}
이제 BoardState
그 (더 이상 setupX()
방법)과 같은
import java.util.List;
public class BoardState {
private final List<GameObject> gameObjects;
public BoardState(LevelSettings settings) {
this.gameObjects = settings.startingObjects();
}
}
당신은 ...
당신이 하나 열거의 인터페이스를 구현하여 두 세계 (인터페이스 및 ENUM)의 장점을 결합 할 수 있습니다 동적 GUI에 버튼을 생성하기 위해
enum
을하는 것이 좋은 지정된 이후
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY {
@Override
public List<GameObject> startingObjects() {
return Collections.emptyList();
}
},
INTEGRATIONTEST {
@Override
public List<GameObject> startingObjects() {
GameObject g1 = new GameObject("dummy 1");
GameObject g2 = new GameObject("dummy 2");
return Arrays.asList(g1, g2);
}
},
LEVEL_1 {
@Override
public List<GameObject> startingObjects() {
//read a config file to get the starting objects informations
//or also hardcoded (not preferred)
}
},
LEVEL_2 {
@Override
public List<GameObject> startingObjects() {
//read a config file to get the starting objects
//or also hardcoded (not preferred)
}
};
}
그리고 기본적으로입니다. LEVEL_3
을 추가해야 할 경우 InitialState
에 입력하면됩니다.당신이 확신하지 않는 경우
당신이 요청 된 것을 넘어 여기에서
더 한 단계를 가고,이 부분을 무시 주시기 바랍니다. 유연성에 더욱 코드 중복과 이득을 줄이기 위해 나는 단지 설정 파일에이 구성을 저장하는 것이 좋은 방법으로
:
그래서
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY {
@Override
public List<GameObject> startingObjects() {
return readFromFile("empty.level");
}
},
INTEGRATIONTEST {
@Override
public List<GameObject> startingObjects() {
return readFromFile("integration_test.level");
}
},
LEVEL_1 {
@Override
public List<GameObject> startingObjects() {
return readFromFile("1.level");
}
},
LEVEL_2 {
@Override
public List<GameObject> startingObjects() {
return readFromFile("2.level");
}
};
private static List<GameObject> readFromFile(String filename) {
//Open file
//Serialize its content in GameObjects
//return them as a list
}
}
당신은 당신이 실제로 만하면 새로운 수준을 추가하기로 결정하는 경우 레벨 구성이 저장되어있는 파일 이름을 알고 있어야합니다.
또 다른 단계를가는
당신이 정말 까다 롭습니다 내가 너희를 생산 코드에서 사용하기 위해 조언을하지 않습니다 (하지만이 코드 중복 감소) 볼 것이다 무엇!
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY, INTEGRATIONTEST, LEVEL_1, LEVEL_2;
@Override
public List<GameObject> startingObjects() {
return readFromFile(this.name() + ".level");
}
private static List<GameObject> readFromFile(String filename) {
//Open file
//Serialize its content in GameObjects
//return them as a list
}
}
여기서 우리는 해당 올바른 파일을 찾기 위해 열거 형 이름 자체에 의존합니다. 이 코드는 규약에 기반하여 파일 이름이 ".level"확장명을 가진 열거 형 이름에 따라 지정 되었기 때문에 작동합니다. 새로운 레벨을 추가해야 할 때 열거 형에 추가하면됩니다. ...
이것은 실제로 매우 광범위한 질문입니다. 거기에는 특별한 대답이 없습니다. 레벨 설정의 공통점에 따라 다릅니다. 우리는 게임의 본질을 모릅니다. 레벨 수가 유한 한 수준으로 설계 되었다면 이것이 가장 좋은 방법입니다. 그러면 그 레벨들 사이에 공통점이 무엇인지보고 그것을위한 방법을 만들고 초기화시 호출해야합니다. 무한한 레벨을 위해 디자인 되었다면, 전체 코드는 레크리에이션이 필요합니다. – Everyone
'setupX()'메소드가 얼마나 비슷합니까? 코드를 게시 할 수 있습니까? – Spotted
@ Spotted 매우 비슷합니다 - 링크 된 목록에 개체를 추가하기 만하면됩니다. 생성 된 객체의 수와 위치는 레벨에 따라 다릅니다. – nhouser9