2017年7月17日星期一

解構世界——功課篇

接上回【以 Object Oriented 哲學看世界 —— Reusable 與 Maintainability概念

Once upon a time,有一間【Low Tech 撈野 High Tech 揩野 IT 已死紀念中學】,全校只有五人,【腦細】校長、【機智】老師、【玩野】同學、【揩野】同學及【撈野】同學。

註︰詳情請 Google【 Object-Oriented Analysis And Design】

定義問題、使用者及目標 ( Target and User Requirements )


老師一方面要防止學生抄功課,另一方面,學生在不被發現之下,用最省時省力的方法【做功課】……

a.老師的目標︰如何高效及智慧地出功課

b.學生的目標︰如何高效及智慧地抄功課

c.你的目標︰把科技融入系統

這是一場漫長的戰爭……

Source Code︰
https://github.com/IntegrityKnight/HomeWork


老師出了第一份電子功課︰

=========================
功課標題︰第一次功課大戰

學生姓名︰
學生學號︰

Q1. 請計算 IT 行業的人均收入( HKD 月薪 ),數據如下︰
support 18000
programmer 22000
system analysis 36000
project manager 45000
chief technical officer 150000

Q2. 跟據上題答案,請發表對 IT 行業的看法︰

Q3. IT is ______
=========================

定義問題、使用者及目標,大約就是這樣,之後就是畫 Use Case Diagram。
在變成程式之前,像畫畫一樣,畫一下草圖及輔助線,制定一個框架,免得中途走樣。

定義Object及關係 ( UseCaseDiagram )


a. 定義各種 Object,主要是抽取名詞 ( noun )︰



定義老師為Object
Teacher
定義學生為Object
Student
人︰學生、老師
Object︰Student, Teacher

定義功課為Object
Homework


物︰功課
Object︰Homework

b. 設定細節︰


定義Object的細節
定義 Object 細節

人︰老師,有老師姓名及職員編號。
人︰學生,有學生姓名及學生學號。
物︰功課,有標題,有題目,需填學生姓名、學生學號及答案。

"Student" has "student_name" and "student_number".
"Teacher" has "staff_name" and "staff_number".
Homework has "title", "questions", "student_name", "student_number"and "answer".

c. 套上關係︰


各Object的關係
定義各 Object 之間的關係

HomeworkSystem_Use_Case_relationship

老師必需設定功課標題及題目
學生必需做功課

teacher must set homework title and questions.
student must do homework.

實作程式碼


草圖完成,現在要思考如何用程式碼實作 (implement),這時候要考慮技術層面上的問題。構思及方法沒有所謂的正確,只有分這樣做比較好、那樣不太好之類,沒有標準。

HomeworkSystem Class Diagram
HomeworkSystem Class Diagram

正規來說,先畫好 Class Diagram 才開始寫程式的,不過由於範例簡易,即使跳步也不會失敗,用逆向工程  ( java reverse engineering ),把寫好的 code 轉成 Class Diagram 就好,不用怕畫漏什麼,反過來說,generate 的 Class Diagram 是最真實反映程式碼,對日後維護好處更大。

Homework class
HomeWork.java

先寫 Homework 程式碼,基本上是個 POJO ( Plain Old Java Object )。用 Setter and Getter Methods 去存取 Object 裡的 private 屬性,關於 Object Oriented 的 encapsulation 概念,這裡就不詳述,有興趣請自行 Google,或許日後可能會補上關於 encapsulation 概念教學。

這樣還不夠,要考慮如何在電腦螢幕顯示出來,所以要加一個叫 displayHomeWork() 的method。要顯示什麼?用什麼技術顯示?這層面要考慮在 displayHomeWork() 內的實作。

假設題目數量不限,可以一條,也可以一百條,所以把 Homework 這個 Class 的 question 及answer 改成 array ( 尾加上中括號,成了 question[] 及 answer[] )。預定要在 console 中顯示,因此使用 StringBuilder 這個技術 ( java內建API ),以 while loop 把顯示寫入 StringBuilder ( 如果你懂 for loop 也可以轉用 for loop 做 ),然後輸出 ( 我是 return StringBuilder 的,轉換成 string再 return 也可以 )。

Student class
Student.java

還是 POJO,只加了一個 dohomework 的 method,以 pass by reference 方式,傳入 Homework Object,及答案寫功課。

【pass by reference】及【pass-by-value】這個概念太重要,不明白是什麼,快 Google 進修一下。

Teacher class
Teacher.java

沒什麼特別解說,都是相同的技術,之前都解說過。

也是那一句——【沒有標準】。
用你懂得的技術,解決技術層面問題,選擇合適方法,是寫程式的樂趣 ( 痛苦?)。

組合起來


組件都準備好了,是時候組起來,寫個內含 main() 的 HomeWorkSystem ( main class )。

HomeWorkSystem.java

  1. 把要用到的 Object 先 instance。
  2. 假設一堆測試用資料
  3. 老師設定功課
  4. 學生做玏課
  5. 顯示結果
homework[0].setTitle(work);
homework[0].setQuestion(Q3);
homework[0].setAnswer(A1);

圖中看到的備註也可以用來設定 homework,雖然技術是做到,但不合符先前定下的框架,最好別這樣寫,免混亂。

=================================

跟據例子的資料再試一下︰

例子中的真實資料

結果如下︰


大約就這樣。

沒有留言:

發佈留言

設有留言驗證及審查,檢閱後,才會顯示留言。
本人惰性很高,留言或許會石沉大海。