В качестве примера того, как можно решить сложную проблему.Это не значит быть готовой к использованию программой для запуска из коробки.
Ее задача - ответить на вопрос, как упростить вещи, когда «возникают большие проблемы, заставляя их взаимодействовать, и контролировать всезаявления if / else. "Стратегия для таких случаев, если хотите.
Также я немного переусердствовал для демонстрации.На практике вы делаете то, что кажется удобным.Кроме того: я сделал все статичным для простоты - во взрослом приложении вы наверняка вместо этого будете использовать экземпляры.
Шаг 1: Вы начинаете с очень простого фрейма класса.Простота является ключевым.Не вкладывайте в это много.Просто набросайте то, что, как вы знаете, вы хотите, чтобы он делал:
public class TwentyQuestions{
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
Конечно, эта вещь не скомпилируется, поскольку детали до сих пор не реализованы (некоторые методы отсутствуют) - Но обратите внимание, как проблема имеетупростили много (без вложенных если), и, скорее всего, вы можете сразу увидеть, что он должен делать.Проще говоря, это ключ к успеху.
Шаг 2: Теперь вы можете легко создавать методы, которые вы набросали до сих пор.Давайте сделаем это:
public class TwentyQuestions{
static void handleWrongInput(){
System.err.println("I am no longer playing with you as you don't answer my question properly");
System.exit(1);
}
static void askLivingAnimalQuestions(){
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch(user){
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions(){
System.out.println("is it a tree?");
String user = get.nextLine();
if("yes".equals(user)){
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions(){
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch(user){
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
Теперь я решил проблему еще больше.Но он все равно / снова не скомпилируется, потому что отсутствуют методы для животных с мехом и животных с перьями.
Шаг 3: Реализуйте их также:
public class TwentyQuestions{
static void handleWrongInput(){
System.err.println("I am no longer playing with you if you don't answer my question properly");
System.exit(1);
}
static void askLivinAnimalWithFeathersQuestions(){
System.out.println("is it bigger than a soccer ball?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivinAnimalWithFurQuestions(){
System.out.println("is it domesticated?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivingAnimalQuestions(){
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch(user){
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions(){
System.out.println("is it a tree?");
String user = get.nextLine();
if("yes".equals(user)){
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions(){
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch(user){
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
Обратите внимание, как исчезли все ваши вложенные if / else, которые вызвали у вас проблемы.
финиш: Теперь, если вы дополнительно реализуете пропущенный опрос и добавляете сканер "get", который инициализируется в главном (аргументы String []), вы должны быть там.Это должно быть легко сейчас.
Хорошо .. Это, вероятно, дает вам много методов для 20 вложенных вопросов: это связано с количеством возможных вариантов.Вы должны разобраться со многими случаями вопросов и ответов.Нельзя обойти это.Лучше иметь их чисто в своем собственном, выделенном месте, чем разбрасываться где-нибудь (вы убираете и расставляете все по местам - количество дел / вопросов, которые вам приходится решать, остается неизменным).
Однако у взрослыхПриложение вы можете поместить все ваши вопросы и ответы в структуру данных, как дерево.При этом вы можете избежать огромного количества методов и использовать вместо этого некоторые обобщенные методы, которые просто обходят дерево ....
[Также вы можете просто создавать временные методы, которые ничего не делают ("заглушки")для вещей, которые вам нужны, но еще не реализованы, чтобы компилировать их во время разработки.]
Ниже приведен пример полного класса, который компилирует и выполняет опрос до тех пор, пока он реализован:
import java.util.Scanner;
/**
*
* @author Kai
*/
public class TwentyQuestions {
static Scanner get = new Scanner(System.in);
static void handleWrongInput() {
System.err.println("I am no longer playing with you if you don't answer my question properly");
System.exit(1);
}
static void askLivinAnimalWithFeathersQuestions() {
System.out.println("is it bigger than a soccer ball?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivinAnimalWithFurQuestions() {
System.out.println("is it domesticated?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivingAnimalQuestions() {
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch (user) {
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions() {
System.out.println("is it a tree?");
String user = get.nextLine();
if ("yes".equals(user)) {
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions() {
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch (user) {
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning() {
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch (user) {
case "living animal":
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
mainQuestioning();
}
}
пример выполнения:
Is it a living animal, living plant, or non-living thing?
living animal
Does it have feathers, fur, or neither?
fur
is it domesticated?
yes
BUILD SUCCESSFUL (total time: 30 seconds)