2015-07-01 2 views
1

Я довольно новичок в программировании на Java, и хотя я знаю основы, я чувствую, что мой код очень длинный и ненужный. Мне интересно, есть ли способ объединить мои методы elkStarter() и foxStarter() в один метод starter(), чтобы я мог уменьшить свой код.Как я могу объединить два метода, которые делают то же самое, но отличаются по типу?

//Opening question, askes user to pick either an elk or fox 
    public void systemStart(){ 
     for(int i =0;i<=100;i++){ 
      System.out.println("- - - - - - - - - - - - - - - - - -\n"); 
    } 
    System.out.println("***STARTING NEW MOVEMENT MODEL***\n"+"-----------------------------------\n"); 
    iteration = 0; 
    String animalType = JOptionPane.showInputDialog 
        ("Would you like an elk or a fox?"); 

    switch (animalType.toLowerCase()){ 
     case "elk": elkStarter("elk_1"); 
     break; 
     case "fox": Foxtarter("fox_1"); 
     break; 
     default: JOptionPane.showMessageDialog (null, "You didn't enter elk or fox..Please try again."); 
     runAnotherModel(); 
     break; 
    } 
} 

//systemStater goes to when "elk" is selected as the animal type. 
public void elkStarter(){ 
    Elk elk_1 = new Elk(); 
    elk_1.namer("elk_1"); 
    System.out.println("You have just created an Elk called " + elk_1.name + ".\n" + 
    "It has begun its life at (0,-0).");   
    elk_1.findPosition(); 

    JOptionPane.showMessageDialog (null, "Lets let our new elk roam a bit, shall we?"); 


    int loop = 0;     
    while(loop==0){ 
     String animalDirection = JOptionPane.showInputDialog 
        ("Which way should our elk move? (forward(f), backward(b), up(u), down(d)) or type stop(s) to quit."); 
     switch(animalDirection.toLowerCase()){ 
      case "forward": case "f": 
      elk_1.walkForward(); 
      elk_1.findPosition(); 
      break; 
      case "backward": case "b": 
      elk_1.walkBackward(); 
      elk_1.findPosition(); 
      break; 
      case "up": case "u": 
      elk_1.walkUp(); 
      elk_1.findPosition(); 
      break; 
      case "down": case "d": 
      elk_1.walkDown(); 
      elk_1.findPosition(); 
      break; 
      case "stop": case "s": 
      JOptionPane.showMessageDialog (null, "GoodBye! Thanks for trying my model!"); 
      loop=1; 
      break; 
      default: JOptionPane.showMessageDialog (null, "ummmm sorry that wasn't a direction...Please try again."); 
      break; 
     } 
    } 
} 

//systemStater goes to when "fox" is selected as the animal type. 
public void foxStarter(){ 
    Fox fox_1 = new Fox(); 
    fox_1.namer("fox_1"); 
    System.out.println("You have just created an Fox called " + fox_1.name + ".\n" + 
    "It has begun its life at (0,-0).");   
    fox_1.findPosition(); 

    JOptionPane.showMessageDialog (null, "Lets let our new fox roam a bit, shall we?"); 


    int loop = 0;     
    while(loop==0){ 
     String animalDirection = JOptionPane.showInputDialog 
        ("Which way should our fox move? (forward(f), backward(b), up(u), down(d)) or type stop(s) to quit."); 
     switch(animalDirection.toLowerCase()){ 
      case "forward": case "f": 
      fox_1.walkForward(); 
      fox_1.findPosition(); 
      break; 
      case "backward": case "b": 
      fox_1.walkBackward(); 
      fox_1.findPosition(); 
      break; 
      case "up": case "u": 
      fox_1.walkUp(); 
      fox_1.findPosition(); 
      break; 
      case "down": case "d": 
      fox_1.walkDown(); 
      fox_1.findPosition(); 
      break; 
      case "stop": case "s": 
      JOptionPane.showMessageDialog (null, "GoodBye! Thanks for trying my model!"); 
      loop=1; 
      break; 
      default: JOptionPane.showMessageDialog (null, "ummmm sorry that wasn't a direction...Please try again."); 
      break; 
     } 
    } 
} 

ответ

1

Если классы Elk и Fox имеют один и тот же родительский класс, пример - Animal, то я считаю, что есть несколько способов, чтобы сделать эти две функции стартер ни одного.

  1. Вы можете сделать вызывающую функцию запуска отправить в объекте работать, например, -

    public void commonStarter(Animal animal) { 
        ... // Do your logic on animal. 
    } 
    
  2. Или вы можете отправить в параметре для вашей starter функции, которая будет определять, следует ли создать Elk или Fox, а затем на его основе, создать правильный в своем классе -

    public void commonStarter(boolean isElk) { 
        Animal animal = None; 
        if(isElk) { 
         animal = new Elk(); 
        } else { 
         animal = new Fox(); 
        } 
        ... // Do your logic. 
    } 
    
+1

Второй вариант работал очень хорошо! За исключением того, что мне нужно было поставить «новый» перед Elk() и Fox(), когда они устанавливали животное, равное им. – MooseMan55

+0

Да, извините, забыл это :), исправил ответ, спасибо. –

+0

Я считаю, что основной вопрос вопроса остается нерешенным. – MaxZoom

0

Лучше всего создать родительский класс/интерфейс, а затем вызвать функцию, используя логическое значение, которое определяет, является ли объект Лев или Elk. Это называется иерархией классов.

Таким образом, вы заменили бы только одну часть кода.

Animal somename; 
if (isElk) 
    somename = new Elk(); 
else 
    somename = new Fox(); 

Где isElk будет логическое значение, которое будет истинным, если пользователь хочет создать новый объект Elk, или ложь, если пользователь хочет создать новый объект Fox.

0

Вы можете создать интерфейс и вызвать нужную реализацию на основе пользовательского ввода.

Что-то вроде:

public interface Starter { 
    void start(); 
} 

public class ElkStarter implements Starter { 

    private String name; 
    // + constructor, getters, setters 

    @Override 
    public void start() { 
     // ... 
    } 
} 

// ... 

public Starter getStarter(String animalType) { 
    switch (animalType.toLowerCase()) { 
     case "elk": return new ElkStart("elk_1"); 
     case "fox": return new FoxStart("fox_1"); 
     default: return null; 
    } 
} 

public void systemStart() { 
    // ... 
    Starter starter = getStarter(animalType); 
    // at this point, you do not know what Starter actually is 
    if(starter != null) { 
     starter.start(); 
    } else { 
     // ... 
    } 
} 
+0

Но как это поможет сократить мой код? Разве у меня еще не было бы двух разных методов для моего лось и лисы вместо одного? – MooseMan55

+0

Если у них есть некоторые общие части, вы также можете использовать * абстрактный класс *, который будет содержать общий код. –

Смежные вопросы