2015-09-15 21 views
4

我有一個名爲'學生'的課程,它創建了一個基本的學生對象,並完成了啓動GPA所需的一切。我已經添加了兩種分別處理成績和字母等級的方法,然後計算GPA。我的問題是,如果輸入不可接受的字母等級(即G或X),最好的方法和位置是添加錯誤處理。我會在方法本身中做到這一點,還是在程序中調用它更合適?爲對象添加錯誤處理的最佳位置?

class Student: 
    def __init__(self, name, hours, qpoints): 
     self.name = name 
     self.hours = float(hours) 
     self.qpoints = float(qpoints) 

    def get_name(self): 
     return self.name 

    def get_hours(self): 
     return self.hours 

    def get_qpoints(self): 
     return self.qpoints 

    def gpa(self): 
     return self.qpoints/self.hours 

    def add_grade(self, grade_point, credit_hours): 
     self.qpoints += grade_point * credit_hours 
     self.hours += credit_hours 

    def add_letter_grade(self, grade_letter, credit_hours): 
     letter_grades = { 
      'A': 4.0, 
      'B': 3.0, 
      'C': 2.0, 
      'D': 1.0, 
      'F': 0.0 
     } 

     grade_point = letter_grades.get(grade_letter) 
     self.qpoints += grade_point * credit_hours 
     self.hours += credit_hours 

def main(): 
    new_student = Student('Mike Smith', 0, 0) 

while True: 
    usr_input = input('Please enter the student course information' 
         ' (grade and credit hours) separated' 
         ' by a comma <q to quit>: ') 
    if usr_input == 'q': 
     break 
    else: 
     grade, hours = usr_input.split(',') 
     if grade.isalpha(): 
      new_student.add_letter_grade(grade, float(hours)) 
     else: 
      new_student.add_grade(float(grade), float(hours)) 

print('{0}\'s final GPA was {1:.2f}'.format(new_student.get_name(), new_student.gpa())) 


if __name__ == '__main__': 
    main() 
+0

我投票結束這個問題作爲題外話,因爲「我的代碼有效,我怎麼能改進它」更適合CodeReview.stackexchange.com – TessellatingHeckler

+4

@TessellatingHeckler更適合另一個網站不適合這是一個有效的密切原因,因爲遷移首先要求這個問題成爲題外話題。標準「太寬泛」或「基於意見」的理由是*更適合近距離投票;-) –

回答

3
grade_point = letter_grades.get(grade_letter) 

這是您應該觸發錯誤的位置。

我會將letter_grades.get(grade_letter)更改爲letter_grades[grade_letter]。讓它引發一個KeyError,並滲透到調用者。

漁獲主循環異常,

try: 
    new_student.add_letter_grade(grade, float(hours)) 
except KeyError: 
    print("That looks like a letter grade, but we don't know what it means. Ignoring it.") 

```

1

這完全取決於您的使用模式。誰寫的調用程序?這個界面有什麼假設?

我的默認做法是讓方法從驗證輸入參數開始。這使得該方法可以共享到各種其他應用程序。

但是,重要的是要確保檢查發生在一端或另一端。兩者都不優於兩者。

這有幫助嗎?

+0

是的,謝謝! – flybonzai

2

類應該是容易擴展。你的班級應該處理錯誤,但也要拋出一個錯誤,以便將來誰利用這個班級的人知道他們輸入失敗的原因。

在Python中,這被稱爲raise的一個例外。如果在內部引發異常,則類方法應該「優雅地」失敗,並且作爲其自身的異常而返回raise。誰利用這個類負責管理該類拋出的異常。

Here是另一篇關於同一主題的文章。

+0

非常感謝先生! – flybonzai