2016-12-08 38 views
0

我正在嘗試編寫一個程序,允許用戶將字符串值輸入到包含arrayLists的多個方法中。我有2個問題:面向對象與線性編程

  1. 我的代碼似乎是線性的(我想確保我正在使用面向對象的編程原則)。
  2. 我很難編寫while循環來將用戶輸入的值添加到arrayList中。由於我不知道將會輸入多少個值,我認爲這將是一個合適的方法。

這是我到目前爲止,您的意見受到重視和讚賞:

import java.util.ArrayList; 
import java.util.Scanner; 

public class Animals { 

public static void main(String[] args) { 
    Scanner user = new Scanner(System.in); 
    System.out.println(" Here are some animal types! "); 

    ArrayList<String> animalTypes = new ArrayList<String>(); 
    animalTypes.add("Vertebrae"); 
    animalTypes.add("Reptile"); 
    animalTypes.add("Insect"); 
    animalTypes.add("Amphibian"); 
    System.out.println(" Enter new animal type"); 
    System.out.println(" Here is your animal types list! "); 

    // This for loop is inadequate, I need a while loop as I don't know the exact number of entries from the user// 
    for (int index = 0; index < animalTypes.size(); index++) { 
     System.out.println(animalTypes.get(index)); 
    } 
+2

某些邏輯像'while while true,type quit to end'用戶輸入可以通過Scanner.nextLine獲得 –

+1

使代碼容易閱讀時,使用過程代碼沒有任何問題。面向對象的解決方案只適用於面向對象的問題。 – 4castle

+0

除非你想有重複的動物類型,那麼我可能會建議你使用Set而不是ArrayList –

回答

0

要做到面向對象編程,你需要的對象。如果你不需要對象,那麼對於普通/傳統的結構化編碼你就沒問題。我不確定最初的問題需要OOP,而不是沒有關於需要添加什麼的附加信息。

(並不是每一個問題本身借給OOP,當你終於可以使用OOP的點,而繼承有趣的是,喜歡用超過繼承接口。)

0

我的代碼似乎線性(我想確保我正在使用面向對象編程原則)。

使您的代碼「面向多個對象」很可能是更多的努力比它的價值對於這樣的小程序。當它已經足夠可讀時,它可能會膨脹你的程序。

但是,如果你想模擬不同類型的動物,你可以使用inheritance

你可以做:

  • Animal類。
  • 一束從Animal(例如ReptileAmphibian)繼承「動物類型」

這裏是一些簡化代碼以證明。

public class Animal {} 
public class Vertebrate extends Animal {} 
public class Reptile extends Animal {} 
public class Insect extends Animal {} 
public class Amphibian extends Animal {} 

因爲這些「動物類型」從Animal類繼承,Java的類型系統是知道,這些其實都是動物,而不是像字符串您目前擁有。

這將使你寫的東西是這樣的...

ArrayList<Animal> animals = new ArrayList<>(); 
animals.add(new Reptile()); 
animals.add(new Insect()); 

即使被警告,有真的沒有一點這樣的做法因爲每個類都是空的。但它面向對象,就像你告訴我們你想實現的那樣。

程序代碼和麪向對象代碼都有合適的時間和地點。這可能是程序代碼的正確位置。

+0

這個答案對於構建一個良好解耦的面向對象程序來說是非常棒的,儘管我認爲它會直截了當。 ---我認爲你應該發佈它,因爲它對構造OO代碼有很好的建議。 – byxor

+0

在您的提示中,我添加了我的評論作爲回答 –

+0

謝謝布蘭登!這是一個很棒的建議! – Victor

0

1)有了這麼短的程序,很難充分利用自定義的OOP,因爲你沒有任何特殊的對象,接口等。你也沒有真正違反OOP。當你有更長的代碼來利用類似對象的東西時,OOP真正發揮作用,它們在那裏是有用和高效的,但在這種情況下,它們不是必需的。從技術上講,您仍在使用OOP,因爲您正在使用像ArrayList,Scanner和System之類的東西。

2)當從控制檯接收未知量的輸入時,while循環是正確的方法。要檢測用戶何時完成,我建議使用定點值。這是一個短語,當檢測到時,會導致你的循環通過休息或返回來停止。這些例子將是「退出」或「停止」。你會在他們輸入它檢查輸入,如果它的這個標記值,你就退出循環:

while (true) { 
    String text = Scanner.nextLine(); 
    if (text.equalsIgnoreCase("exit")) 
     break; 
} 
1

除了布蘭登的偉大答案,樂於進行動物類型,OOP可以用於抽象的類AnimalTypeInputter然後可以被擴展爲其他TypeInputtersaddNewTypelistAllTypesfindType等。除了提示,這些方法可能會從基底GenericTypeInputter

0

這裏被繼承是一個建議。

import java.util.ArrayList; 

import java.util.Scanner; 

public class Animals { 

public static void main(String[] args) { 
    Scanner user = new Scanner(System.in); 
    System.out.println("Here are some animal types! "); 

    String animals = ""; 

    boolean loopOne = true; 
    char response; 

    ArrayList<String> animalTypes = new ArrayList<String>(); 
    animalTypes.add("Vertebrae"); 
    animalTypes.add("Reptile"); 
    animalTypes.add("Insect"); 
    animalTypes.add("Amphibian"); 


    while(loopOne) { 
     System.out.println("Do you wish to enter a new animal type ?"); 
     response = user.nextLine().charAt(0); 

     if (response == 'n') { 
      System.out.println("End of the program"); 
      loopOne = false; 

     } 

     else if (response == 'y') { 
      System.out.println("Please enter your animal types"); 
      animals = user.nextLine(); 
      animalTypes.add(animals);    

     } 
     else { 
      System.out.println("Error ! Please choose y (for yes) or n (for no)"); 
     } 


    } 

    System.out.println("\nHere's the list of the element in the ArrayList"); 
    for(int i = 0; i < animalTypes.size(); i++) { 
     System.out.println(animalTypes.get(i)); 
    } 

} 
+0

應該使用Set而不是ArrayList。應該將'y'或'n'作爲不區分大小寫 –

+0

非常感謝你們,你們給了我一些很棒的點子!我非常感謝。 – Victor

0

對於所有這些,說問題太小:Horsepoop!如果你不能將面向對象,原則或模式應用於一個小問題,你將無法將它們應用於一個大問題。這個例子其實是近乎完美的!

對於那些說你不需要的對象:Bullpoop!

現在有很多的,我們必須考慮的原則,例如:

  • 如果我們有一個控制檯客戶端和GUI客戶端是什麼,如何讓我們的業務邏輯可重用(即使它只是添加東西到一個列表!)
  • 我們如何測試它!因爲好的代碼和測試代碼一樣好,測試代碼和生產代碼一樣有價值!
  • 如何我們實現失去耦合高內聚,或我們如何運用單一用途模式

現在我們分析一下,這是什麼代碼實際上呢,我們將其分成了目的

  1. 它告訴用戶,他有動物的列表中選擇,簡單的消息
  2. 它讀取用戶
  3. 輸入它添加了用戶輸入的動物名單
  4. (我猜),它顯示了所有的動物用戶輸入

我「會」做這樣的事情後。 ..好了,其實不是,但得到的想法,我會做這樣的:

  1. MessageShower接口,具有方法showMessage(String message),如果我們考慮不同的客戶:控制檯客戶它SYSOUT的,用於例如一個搖擺鬼,它顯示消息對話thingie。
  2. 接口UserInputReaderString readInput()
  3. 接口AnimalStorageList<Animal> getAnimalList()addAnimal(Animal newAnimal)
  4. 接口AnimalDisplayer與`showAnimals(名單animalsToShow)

所以我們從主程序分離目的並儘量減少/隱藏實現失去耦合。我們隔離他們,實現高內聚,這樣你就可以測試不僅他們更好,而且你的主程序,因爲你可以模擬的依賴性遠,而不必含蓄測試的依賴。由於他們是孤立的,他們更容易理解 - 他們的目的更清晰 - 因此,主程序的目的也將更容易理解!