王豐緒 銘傳大學資訊工程學系 問題:判斷是否為長方形
問題基本資訊 標題 問題描述 目的 版本:2011/07/27 提示 檢查是否為長方形 給平面上四個點A、B 、C 、D的座標,請問這四個點所形成的四邊形ABCD是否是一個長方形? 目的 讓同學練習物件導向式的思考:如何掌握領域知識(平面向量知識),並轉換成物件模型與JAVA Code 版本:2011/07/27 提示 請以UML圖型繪製本問題的物件模型 以JAVA實作程式
問題分析:掌握領域知識 給平面上四個點A、B 、C 、D的座標,請問這四個點所形成的四邊形是否是一個長方形? 學習單1:請同學整理相關領域知識 A B C D A B C ? A B C D 向量? 內積?
物件模型 學習單2:請同學根據問題描述,尋找適當的物件模型 給平面上四個點A、B 、C 、D的座標,請問這四個點所形成的四邊形是否是一個長方形? 名詞 點:Vertex 座標:新類別或者是Vertex的成員 四邊形:四個點所形成 長方形:一種特殊的四邊形 邊:兩點決定一個邊 向量:用來計算角度
使用 繼承 使用 使用 使用 具有 具有 繼承
Vector類別 資料成員 功能成員 X 座標 Y座標 isZero():檢查是否為零向量 crossProduct(Vector v2):與另一向量v2的內積 建構元:Vector(x, y)
Vertex類別 資料成員 功能成員 繼承向量類別(因為點也可視為一個向量) setPosition(xx, yy):更改點的座標為(xx, yy) 建構元:Vertex(x, y)
Side類別 資料成員 功能成員 Vertex v1 : 邊的第 1 點 Vertex v2 : 邊的第 2 點 mutual_Perpendicular(Side s2):判斷與另一邊s2是否是直角 cvt2Vector():將邊轉成向量 建構元:Side(vtx1, vtx2)
Quadrangle類別 資料成員 功能成員 Vertex v1 : 四邊形的第 1 點 Vertex v2 : 四邊形的第 2 點 isRectangle():判斷是否是長方形 建構元:Quadrangle(vtx1 , vtx2 , vtx3, vtx4)
學習單3: JAVA Code
學習任務 請利用BlueJ撰寫本問題的JAVA Code,並且進行測試
Vector類別 public class Vector { protected float x; //x 向量 protected float y; //y 向量 private float epth = 0.00000000001f; public Vector() x = 0; y = 0; } public Vector(float xx, float yy) x = xx; y = yy; public boolean isZero() return ((Math.abs(x) < epth) && (Math.abs(y) < epth) ) ; public float crossProduct(Vector v2) return x*v2.x + y*v2.y ;
Vertex類別 public class Vertex extends Vector { public Vertex(float xx, float yy) // initialise instance variables x = xx; y = yy; } public void setPosition(float xx, float yy) // put your code here
Side類別 public class Side { private Vertex v1; private Vertex v2; private float epth=0.00000001f; public Side(Vertex vv1, Vertex vv2) v1 = vv1; v2 = vv2; } public boolean mutual_Perpendicular(Side s2) Vector vec1 = this.cvt2Vector(); Vector vec2 = s2.cvt2Vector(); return !vec1.isZero() && !vec2.isZero() && Math.abs(vec1.crossProduct(vec2)) < epth; public Vector cvt2Vector() Vector vec = new Vector(v2.x - v1.x, v2.y - v1.y); return vec;
Quadrangle類別 public class Quadrangle { private Vertex v1; private Vertex v2; private Vertex v3; private Vertex v4; public Quadrangle() v1 = new Vertex(0,0); v2 = new Vertex(0,0); v3 = new Vertex(0,0); v4 = new Vertex(0,0);; } public Quadrangle(Vertex vv1,Vertex vv2,Vertex vv3,Vertex vv4) v1 = vv1; v2 = vv2; v3 = vv3; v4 = vv4; public boolean isRectangle() Side s1 = new Side(v1,v2); Side s2 = new Side(v2,v3); Side s3 = new Side(v3,v4); Side s4 = new Side(v4,v1); return s1.mutual_Perpendicular(s2) && s2.mutual_Perpendicular(s3) && s3.mutual_Perpendicular(s4) && s4.mutual_Perpendicular(s1) ;
反思(1/3) 學習單4:請同學進行學習反思,你從此問題學到什麼? 本次練習,你覺得物件之間具有哪些關係? 繼承 使用 具有 本次練習,你覺得物件模型的建立有哪些策略? 從名詞找類別 根據領域知識定義類別與資料成員 根據領域知識定義類別之間的關係
反思(2/3) 請同學進行學習反思,你從此問題學到什麼? 本次練習,你覺得JAVA有哪些特性可以支援物件導向程式設計? 繼承可以實作繼承的物件關係 資料成員的”保護”存取性(protected)允許資料成員在繼承物件中的使用 物件式成員,可以實現”具有”的物件關係 建構元用以產生物件 以物件作為參數,可以實現”使用”的物件關係
反思(3/3) 請同學進行學習反思,你從此問題學到什麼? 本次練習,你覺得物件導向程式有哪些不錯的測試策略與技巧? 善用BlueJ的圖型化測試介面 本次練習,你覺得物件導向設計具有哪些優點?(以本問題為例,舉例具體說明) 更清晰的問題模式與自然的計算邏輯 重複使用度高,降低程式複雜度 容易測試與維護
延伸學習 請同學列舉其它與本問題相關的學習 請同學就本次學習的結果,設計測驗題目 座標應該作為一個獨立的類別,還是類別的屬性? JAVA指令 this 在本問題的應用? JAVA 預設建構元的特性為何? 請同學就本次學習的結果,設計測驗題目
座標應該作為一個獨立的類別,還是類別的屬性? 以本問題的需求而言,設計成類別屬性即可 但是,若要考慮問題的通則化,例如,在3D的情況下,去考慮類似的問題,則最好作為獨立的類別
JAVA指令 this 在本問題的應用? public class Vector { protected float x; //x 向量 protected float y; //y 向量 public Vector(float xx, float yy) x = xx; y = yy; } public Vector(float x, float y) { this.x = x; this.y = y; }
JAVA 預設建構元的特性為何? 預設性建構元(無參數者)的系統行為 當類別沒有定義建構元時,系統的預設行為會被啟動 使用不作任何事的預設建構元 當類別有定義建構元時,系統的預設行為會被取消 此時,若沒有定義預設建構元,類別就沒有預設建構元 若繼承類別中,有定義建構元,則被繼承類別一定要能找到預設建構元(不論是自訂或者預設) 因為預設建構元的第一行會呼叫super(),也就是執行父類別的預設建構元