บทที่ 12 Object Oriented Design
เนื้อหาในบทนี้ไม่ใช่กระบวนการในการพัฒนาซอฟท์แวร์เท่าไรนัก เพียงแต่เป็นอีกแนวทางหนึ่งในการพัฒนาระบบ อาจารย์จึงขอพูดแบบเร็วๆ Object คือสิ่งใดๆก็ตามที่เราเปรียบเทียบกับความเป็นจริงในระบบ หรือสิ่งที่ปรากฏขึ้นมาในระบบ เป็นสิ่งที่มีตัวตนก็ได้หรือไม่มีตัวตนก็ได้ เป็นการกระทำหรือเป็นพฤติกรรมของระบบก็ได้ คืออะไรก็ตามที่มีสาระสำคัญกับระบบเรา ที่มีข้อมูลบางอย่างที่เป็นประโยชน์กับระบบเรา เราเรียกว่าเป็น Object ได้หมด
คุณสมบัติของ Object อย่างหนึ่งก็คือตัว Object มันจะเก็บข้อมูลไว้ในตัวของมันเองเรียกว่า Encapsulation หมายความว่าแต่ละ Object จะเก็บข้อมูลของตัวเองไว้และข้อมูลนั้นจะไม่ให้ใครมาเรียกดูหรือแก้ไขได้ นอกจาก Method ของตัว Object นั้นเองเป็นตัวแก้ไขข้อมูล ( Method ก็เปรียบเสมือนพฤติกรรมของ Object ว่า Object นั้นทำอะไรได้บ้างหรือถ้ามองเข้าไปในมุมมองของการพัฒนา Software มันก็คือฟังก์ชันต่างๆในระบบนั้นเอง )
เพราะฉะนั้นแนวคิดทางด้าน Object Oriented Concept ในการพัฒนา Software มักจะไม่รวมแนวคิดในเรื่องการ Share data เข้าไปด้วย เพราะ Object Oriented ได้กระจายไปอยู่ในทุกๆ Object เรียบร้อยแล้ว แต่ละ Object เก็บ data ของตัวเองเอาไว้ ดังนั้นจึงไม่ค่อยมีแนวคิดด้านการ Share data ใน Object Oriented เท่าไรนัก
จากรูป (slide4) คือการติดต่อกันระหว่าง Object โดยส่งข้อความเรียกว่าเป็นการส่ง Message ระหว่าง Object ตัวObject O1 ต้องการติดต่อ Object O3 ก็จะส่ง Message ไปยัง Object O3 โดยต้องการติดต่อเพื่อทำอะไรก็ต้องส่ง Message ไปยัง Method นั้นๆของ Object O3
message บาง message เรียกใช้เฉพาะชื่อ Method เฉยๆก็พอแล้ว Method บาง Method เวลาเรียกจาก Message ก็ต้องมีการส่งข้อมูลมาด้วยจึงจะทำงานได้ถูกต้อง บาง Method เรียกใช้แล้วก็ทำงานจบกันไปไม่มีการส่งผลลัพธ์กลับมา แต่บาง Method พอทำงานเสร็จจะมีการส่งข้อมูลกลับมาหาเรา มันก็ขึ้นอยู่กับว่า Method ถูกออกแบบขึ้นมาเพื่ออะไร เข่น Method ขอดูวันเดือนปีเกิดของนศ.เวลาเราเรียกใช้ก็ต้องส่งรหัสนศ.เข้าไป Method นั้นก็จะในการดึงวันเดือนปีเกิดของนศ.คนนั้นกลับมาให้เรา ขึ้นอยู่กับว่าการทำงานของ Method นั้นมีการรับส่งข้อมูลอะไรบ้าง
เมื่อ method ถูกเรียกให้มีการทำงานแล้ว คำถามคือมีการเปลี่ยนปลงข้อมูลของตัวเองหรือไม่ ถ้า Method ทำงานแล้วข้อมูลของตัวเองมีการเปลี่ยนแปลงเราถือว่า Object นั้นเปลี่ยนสถานะ ( State ) เพราะฉะนั้น Object จะมีถานะอยู่ตลอดเวลา เช่น Object หนึ่งเกิดขึ้นมามีการ initial ข้อมูลเป็นครั้งแรกถือว่าอยู่ในสถานะๆหนึ่ง หลังจาก Object นี้ดำเนินชีวิตมาเรื่อยๆถูกใครเรียก Method หนึ่งขึ้นมาและ Method นี่ไปเปลี่ยนแปลงข้อมูลบางอย่าง Object นี้สถานะก็จะเปลี่ยนไป
ข้อดีของ OO Concept
1. Maintain ง่ายเพราะว่าแต่ละ object แยกออกมาเด่นชัด
2. Reuseable เอาไปใช้ใหม่ได้ง่าย เนื่องจาก Object มีการกำหนดคุณสมบัติของตัวเองชัดเจน
, กำหนด data ชัดเจน เราสามารถออกแบบ Object ให้ไปใช้ได้ในหลายกรณี และก็เรียกใช้เฉพาะ
Object ได้ง่าย
3. สะท้อนความเป็นจริงไดดีกว่าการออกแบบในลักษณะทั่วๆไปที่เราออกแบบกัน
การพัฒนาโดยเอา OO Concept มาใช้ได้
3 ลักษณะ คือ
1. Object Oriented Analysis and design ( OOA )
2. Object Oriented DataBase ( OOD )
3. Object Oriented Programming (OOP )
โดยเริ่มแรก Object Oriented เอามาใช้กับการเขียนโปรแกรมคือ OOP พอใช้แล้วประสบความสำเร็จ เขียนโปรแกรมง่าย , Reuseได้ ก็เลยถูกนำมาใช้ในอีก 2 ส่วนคือ OOA กับ OOD ในการพัฒนาระบบขึ้นมา 1 ระบบเราสามารถวิเคราะห์และออกแบบในลักษณะ Object ก็ได้และเก็บข้อมูลโดย OOD หรือใช้ OO Concept ทั้งหมดเลยก็ได้แต่ก็ไม่จำเป็นต้องใช้ครบทั้ง 3 ส่วน ซึ่งขึ้นอยู่กับความเหมาะสมมากกว่า
การใช้ OOPขึ้นอยู่กับว่าเรามีศักยภาพสูงแค่ไหน OOP จะมีหลายระดับ ถ้าเป็น Software Application ประเภท แรบบิทDevelopment เช่น VB , Delphi จะเป็น OOP ที่ไม่เต็มรูปแบบ แต่ถ้าเป็น C++ , JAVA จะเป็น OOP แบบเต็มรูปแบบ แต่บางครั้งอาจทำให้การพัฒนาของเราช้าลงไปอีก เพราะฉะนั้นขึ้นอยู่กับวัตถุประสงค์และข้อจำกัดของเวลาว่าเราควรใช้ OOP มากแค่ไหน , แผนในการเอาไป Reuse มากน้อยแค่ไหน ถ้าเรารับจ้างเขียนโปรแกรมใช้ OOP ก็จะดี เพราะว่าโอกาสที่เราจะเอาฟังก์ชันกลับมาใช้ใหม่อีกสูง แต่ถ้าเราเขียนโปรแกรมให้กับองค์กรของเรา นานๆเขียนที OOP ก็อาจจะไม่จำเป็นเท่าไร
OOD ขึ้นอยู่กับลักษณะ Application เหมาะกับ Data ประเภท Multimedia หรือ Data ประเภทที่ข้อมูลชนิดเดียวกันแต่มีคุณสมบัติแตกต่างกันมากเหลือเกิน ตย.เช่น ไฟล์เพลง ในแต่ละไฟล์เพลงจะมี Format การจัดเก็บที่ไม่เหมือนกัน เช่น WAV , MP3 , MID ซึ่งหาจุดที่เหมือนกันร่วมกันได้ยาก Object ประเภทนี้จึงเหมาะกับ OOD
CLASS
ในระบบของเราถ้าเรามองทุกอย่างเป็น Object ไม่ว่าจะเป็นกระบวนการทำงาน หรือตัว
Data ในระบบ Object เหล่านั้นสามารถนำมาจัดเป็นกลุ่ม Class ได้ซึ่งทำได้ 2 ลักษณะคือ
Top-Down กับ Bottom-Up ถ้าเราสร้าง Class ในลักษณะ Top-Down หมายความ Class เกิดจากการวิเคราะห์หา
Object แล้วหาคุณสมบัติแตกต่างกันมาจัดเป็นหมวดหมู่แล้วก็แตกเป็นกลุ่มย่อยๆลงไป
แต่ถ้าเป็นในลักษณะของ Bottom-Up จะเป็นการหาว่าทั้งระบบมี Object อะไรบ้างทั้งหมดแล้วมองหาความเหมือนกันแล้วรวบรวมมันเป็น
Class สูงขึ้นไปเรื่อยๆ
เพราะฉะนั้น Class ก็คือกลุ่มของ Object ที่มีความเหมือนกัน นอกจากจะใช้ในการจัดกลุ่ม Object แล้ว ยังใช้ในการสร้าง Object ใหม่ด้วย ในเมื่อเราจัดกลุ่มคุณสมบัติของ Object ที่เหมือนกันเอาไว้ใน Classๆหนึ่ง เราก็กำหนด Class เอาไว้ได้ว่า Class นี้ต้องมีคุณสมบัติแบบนี้ ฉะนั้นถ้าเราสร้าง Object ใหม่แล้วกำหนดให้มันอยู่ใน Class ใด Class หนึ่งมันก็จะเกิดคุณสมบัติตามที่ได้กำหนดไว้ใน Class นั้นออกมา
UML ( มักจะใช้กับ OOA )
ในการวิเคราะห์และออกแบบระบบ ถ้าเราวิเคราะห์และออกแบบในเชิง
Object มันก็มีวิธีการที่จะเขียน Model เพื่ออธิบาย Object ต่างๆในระบบอยู่หลาย
Model โดยที่ UML เป็นการรวบรวม Model ต่างๆที่ใช้ในการอธิบาย Object ในระบบมาไว้ด้วยกัน
เพราะฉะนั้นการออกแบบโดยใช้ UML ก็จะมองทุกอย่างเป็น Object หมด
จากรูป
(slide 9) เป็นตย.ของลักษณะ Object ที่เป็นสี่เหลี่ยมข้างบนเป็นชื่อของ Object
ช่องกลางจะเป็น Property หรือคุณสมบัติของ Object ส่วนช่องล่างสุดจะเป็น Method
ต่างๆของ Object
จากที่เคยพูดไว้ว่า Object สื่อสารกันโดยส่ง message ถึงกัน ซึ่งเวลาเขียนโปรแกรมกันจริงๆการส่ง Message ที่ว่านี้ก็คือการ Call ฟังก์ชันนั่นเอง ตย.เช่นถ้าต้องการส่ง message หา Object ชื่อ Employee เพื่อเปลี่ยนแปลงข้อมูลยางอย่าง เราจะต้องส่ง message ไปยัง Method ที่ชื่อว่า changeDetails( ) ของ Object Employee
จากตย.ข้างล่าง (slide11) circular buffer เป็นชื่อของ Object ส่วน Get เป็นชื่อ Method ซึ่ง Method นี้มีการส่งผลลัพธ์บางอย่างออกมาจึงต้องมีการ Assign ผลลัพธ์ให้กับตัวแปรชื่อ V ส่วนอีกเป็นตย.การกำหนดค่าอุณหภูมิโดยเรียกใช้ Method setTemp( ) ของ Object thermostat โดยมีการส่งค่าตัวเลขของอุณหภูมิที่ต้องการเป็น parameter ไปด้วยคือ 20
// Call a method associated with a buffer
// object that returns the next value
// in the buffer
v = circularBuffer.Get () ;
// Call the method associated with a
// thermostat object that sets the
// temperature to be maintained
thermostat.setTemp (20) ;
Generalisation
ย้อนกลับไปเรื่องคลาส เมื่อเรากำหนด Object Class ขึ้นมาคลาสหนึ่ง เราสามารถพิจารณาได้ว่าภายใน
คลาสจะมี Object ต่างๆหลาย Object เช่น คลาสนศ.ก็จะมี Object นศ.อยู่มากมาย Object
นศ.นี้เราเรียกว่าเป็น members ของคลาส ซึ่งก็ยังมีความแตกต่างกันลงไปอีกคือ นศ.ก็จะแบ่งออกเป็น
2 กลุ่มคือ คลาสนศ.ปริญญาตรีกับคลาสนศ.ปริญญาโท เพราะฉะนั้นเราสามารถแตกออกไปได้เรื่อยๆตามคุณสมบัติที่แท้จริงของระบบเรา
ข้อมูลนศ.ทุกคนจะต้องมีรหัสนศ.
, GPA , วิชาที่ลงทะเบียน ไม่ว่าจะเป็นปริญญาตรีหรือโท ดังนั้นอะไรก็ตามที่เหมือนกันจะถูกเก็บไว้ใน
Super class และส่วนที่แตกต่างกันก็จะแยกเก็บไว้ใน Sub Classที่แตกต่างกัน เช่น
นศ.ปริญญาตรีไม่มีการทำวิทยานิพนธ์แต่มีการทำโปรเจ็ค ฉะนั้นโปรเจ็คจึงมีในคลาสนศ.ปริญญาตรี
ส่วนของนศ.ปริญญาโทก็จะมีเก็บการทำวิทยานิพนธ์แทน ที่เราแยกคลาสออกเป็น Super class
กับ Sub class ก็เพื่อแจกแจงความเหมือนและความแตกต่างของ Members ในคลาสนั้นๆ อย่างเช่นนศ.ปริญญาโทก็ยังสามารถแตกต่อออกไปได้อีกเป็นภาคปกติกับภาคค่ำ
คลาสที่แตกออกเป็นรายละเอียดย่อยๆของคลาสที่อยู่เหนือกว่า เราเรียกว่าเป็น Specialisation ของคลาสนั้น เช่น นศ.ภาคค่ำเป็น specialisation ของนศ.ปริญญาโท . นศ.ปริญญาโทเป็น Specialisation ของนศ. และในทางกลับกันอะไรก็ตามที่อยู่เหนือกว่า เราเรียกว่าเป็น Generalisation เช่น นศ.เป็น Generalisation ของนศ.ปริญญาโท , นศ.ปริญญาโทเป็น Generalisation ของนศ.ภาคค่ำ ดังนั้นจึงมีศัพท์อีก2 คำที่ควรรู้คือ Generalisation (ความเหมือนกัน )กับSpecialisation ( ความต่างกัน )
มีอีกคำหนึ่งคือ Inheritance คือการสืบทอดที่ Sub class ใดๆจะได้รับการสืบทอดจาก Super class เสมอ ตย.เช่น คลาสนศ.มีรหัสนศ.เป็นคุณสมบัติของ Object และนศ.ปริญญาตรีหรือนศ.ปริญญาโทก็เป็น Sub class ของนศ. เพราะฉะนั้นนศ.ปริญญาตรีและนศ.ปริญญาโทก็จะมีรหัสนศ.ด้วย
Inheritance ทำให้การพัฒนา application แบบObject ง่ายขึ้น เพราะว่าอะไรที่เหมือนกันเราเอาไปไว้ในที่เดียวกันคือ Super class ส่วนที่เหลือที่ต่างกันก็เอาไปไว้ที่ Sub class
ข้อดีของการมี Inheritance
มีข้อดีที่เด่นที่สุดคือสามารถ Reuse ได้ง่ายเพราะว่าเราไม่ต้องมาใส่คุณสมบัติทังหมดของ
Object เราเพียงแต่รู้ว่า Object นี้เป็น Sub class ของใครเท่านั้นก็พอ Object
นี้ก็จะได้รับคุณสมบัติทั้งหมดจาก Super class มา เวลาใช้งานก็ใช้ได้ทันทีไม่ต้องมาสร้างใหม่
ปัญหาของการมี Inheritance
ที่เด่นที่สุดคือ
1. ไม่ Self contained หมายความว่า การอ้างอิงถึง
Object ใดๆเดี่ยวๆไม่ได้ เราต้องรู้จัก Super class ทุกตัวด้วย ไม่เช่นนั้นคุณสมบัติจะมาไม่หมด
2. การที่Sub class ถูก Inherit จาก Super class ในทางปฏิบัติบางกรณีอาจจะเกิดเหตุการณ์
Sub class ไป Inherit จาก 2 super class กลายเป็นความสัมพันธ์แบบ N : N เรียกว่าเป็น
Multiple Inheritance กรณีถ้าเกิดเหตุการณ์นี้ขึ้นแล้วทั้ง 2 Super class มีชื่อ
Property ชื่อเดียวกัน เราจะเลือกเอา Property ไหนมาให้ Sub class ใช้ ( ทางแก้มี
3 วิธีเคยพูดแล้ว ดูได้ที่ชีทคาบที่ 5 หน้า 9)
UML Association
หมายถึงความสัมพันธ์ระหว่างคลาสต่างๆในระบบของเรา คล้ายกับเวลาเราออกแบบข้อมูลที่มี
Entity ต่างๆว่าสัมพันธ์กันอย่างไร แต่นี่จะเป็นระหว่างคลาส ซึ่งใช้ในการออกแบบระบบ
UMLก็เลยมีการกำหนดการเขียน Association model ขึ้นมา ดังรูปตย.ข้างล่าง (slide17)
เราจะแสดงรายชื่อต่างๆทั้งหมดของคลาสลงมาแล้วลากเส้น เชื่อมระหว่างคลาส และก็เขียนความสัมพันธ์ระหว่างคลาสเท่านั้นเองไม่มีอะไรซับซ้อน
Concurrent Objects
เนื่องจากเราออกแบบให้ Object เป็นตัวตนเดี่ยวๆเพราะฉะนั้นเวลาระบบของเราทำงานแล้วมี
user หลายๆคนเรียกใช้ฟังก์ชันเดียวกัน ก็เท่ากับ user หลายๆคนเรียกใช้ Object ในคลาสเดียวกันหลายๆครั้งพร้อมๆกัน
เราเรียกว่าเกิด instance หลายๆ instance และ Object ที่เกิดเป็น instance หลายๆ
instance ในเวลาเดียวกันได้เราเรียกว่า Concurrent Object โดยที่ Concurrent Object
สามารถนำไปโปรเซสใน Processor ที่ต่างเครื่องกันก็ได้ เพราะฉะนั้นถ้าเรารู้หลักการอันนี้เราก็จะออกแบบได้เหมาะสมกับระบบ
อย่างเช่นเรารู้ว่าจะมี user ใช้พร้อมกันกี่คน จะมี instance เกิดขึ้นพร้อมกันกี่
instance เราสามารถแบ่งปริมาณงานได้ว่า instance ตัวนี้จะให้ server ไหนรับผิดชอบได้
ประเภทของ Object
มี 2 ประเภทคือ Server object กับ Active object 2อันนี้มีความคลัายคลึงกันมากคือเป็น
Object ที่ implement เป็นโปรเซสย่อยๆพร้อมๆกันได้ ก็คือ Concurrent Object นั่นเอง
ถ้า Concurrent Object นั้นไม่มีการเปลี่ยนแปลงค่าจนกว่าจะมีการกระตุ้นจากภายนอกแล้วข้อมูลมีการเปลี่ยนแปลงจะเรียกว่าเป็น
Server Object เช่นการกดปุ่ม Enter ของ userแล้วจะมีการส่ง message
เพื่อไปเปลี่ยนแปลงค่าใน Object
แต่ใน Object บางประเภทมันเปลี่ยนแปลงค่าได้ด้วยตัวของมันเองได้ โดยไม่ต้องถูกกระตุ้นจากจากภายนอก เราเรียกว่าเป็น Active Object อย่างส่วนที่เราได้ยินคำว่า ActiveX ของไมโครซอฟท์ มันก็อ้างอิงมาจาก Active object นี้
กระบวนการในการออกแบบระบบแบบ OO
1. กำหนดภาพรวมของการใข้งานของระบบ
2. ออกแบบ Architecture
3. ระบุให้ได้ว่า Object มีอะไรบ้าง ( เป็นข้อที่ยากที่สุด )
4. สร้างโมเดล
5. สร้าง Object Interface เป็นการรับส่งค่าระหว่าง Object หรือการส่ง message
ระหว่าง Object
Layered Architecture ในการออกแบบเชิง
Object เราสามารถแบ่งระบบออกเป็น layer ต่างๆเป็น 4 layer ใหญ่ๆคือ
1. Data Collection เป็นเลเยอร์ที่ติดต่อกับตัวข้อมูล
2. Data Processing เป็นเลเยอร์ที่ประมวลผลข้อมูล
3. Data Archiving ผลลัพธ์ที่ได้จากการประมวลผลแล้วรอที่จะไปนำเสนอหรือประมวลผลต่อไป
4. Data Display - เป็นส่วนการนำเสนอข้อมูล
การกำหนดภาพรวมของระบบและลักษณะการใช้
- System Context หมายความว่า ภาพรวมของระบบว่าประกอบด้วยระบบย่อยๆอะไรบ้าง เราเรียกว่าเป็น Static model ดังตย.ในรูป (slide23)
- Model of system use เราเรียกว่าเป็น Dynamic model ซึ่งจะบอกว่าระบบย่อยต่างๆมีการติดต่อกันยังไงบ้าง มีการเรียกใช้ยังไง ดังตย.ในรูปข้างล่าง (slide24) หรือเราเรียกว่า Use-Case เป็นชื่อที่เรียกกันใน UML
ตัวUse-case
จะเป็นตัวระบุว่า user หรือ sub system หรือ objectใดๆมีการเรียกใช้ System ใดๆหรือ
Object ใดๆบ้าง มักจะเขียนเป็น diagram หรือภาพให้เห็นว่ามีความเกี่ยวข้องกันยังไงในระดับหนึ่งก่อน
และหลังจากนั้นก็จะเขียนเป็นตารางอธิบายรายละเอียดอีกทีหนึ่ง
วิธีการกำหนด Object
1. Grammatical approach ก็คือการใช้ความมีส่วนร่วมของสิ่งต่างๆในระบบของเรา
เช่น ระบบลงทะเบียน สิ่งที่มีส่วนร่วมกับการลงทะเบียนได้แก่ นศ. , วิชา และการลงทะเบียนวิชานั้นๆซึ่งไม่มีตัวตนแต่เกิดความมีส่วนร่วมขึ้นมาคือนศ.มีส่วนร่วมกันในเรื่องของการลงทะเบียนวิชานั้นๆ
2. พิจารณาจากของที่มีตัวตน ( Tangible )
3. ดูพฤติกรรม ( Behavioural approach ) ซึ่งบางขั้นตอนการทำงานอาจจะถือเป็น Object
ก็ได้
4. วิเคราะห์จากสถานะการณ์ต่างๆที่เป็นไปได้ ( Scenario based analysis ) เช่น
การ Drop วิชาเรียน มีกรณีใดที่เป็นไปได้บ้างคือ Dropภายในเวลาที่กำหนดและมีการคืนเงิน
, Dropในเวลาที่กำหนดแต่ไม่คืนเงิน , Dropนอกเวลาที่กำหนด และสอบออกมาแล้วผลการสอบถูกบังคับให้
Drop
รูปข้างล่างเป็นตย.ของสถานีตรวจอากาศ และการกำหนด Object ( slide 27, 30 ,31 )
Ground thermometer, Anemometer, Barometer
- Application domain objects
that are hardware objects related to the instruments in the system
Weather station
- The basic interface of the weather
station to its environment. It therefore reflects the interactions identified
in the use-case model
Weather data
- Encapsulates the summarised
data from the instruments
Design Model มี 2 ลักษณะคือ
1. Static Model - เป็นตัวที่สะท้อนโครงสร้างของระบบ
2. Dynamic Model เป็นตัวที่สะท้อนถึงปฏิกิริยาสิ่งที่เกิดขึ้นในระบบ หรือ พฤติกรรมของระบบ
Model ลักษณะต่างๆ
1. Sub-system models : เป็น static model จะบอกว่าระบบของเราประกอบด้วย Object
ย่อยๆอะไรบ้าง
2. Sequence models : เป็น Dynamic model จะบอกถึงลำดับของสิ่งที่เกิดขึ้นในระบบของเราถ้าเหตุการณ์ใดเหตุการณ์หนึ่งเกิดขึ้น
เวลาออกแบบระบบเราต้องมา List ว่ามีทั้งหมดกี่กระบวนการ แล้วมาเขียนเป็นแบบนี้เพื่อที่จะสรุปได้ว่ามี
Object ใดบ้างจะถูกทำงานในเหตุการณ์ใดบ้าง ก่อนหรือหลังใคร
3. State charts หรือเรียกว่า State Diagram : ประกอบด้วยสถานะต่างๆของระบบ สถานะเหล่านั้นจะถูกเปลี่ยนแปลงจากสถานะหนึ่งไปยังอีกสถานะหนึ่งได้ก็ต่อเมื่อมีการถูกกระตุ้น
4. Other models
บรรยายเมื่อ 18 กพ. 2545 เทอม 2/44
ฺBack | Lesson 11 | Lesson 12 | Lesson 13 | Lesson 14 | Lesson 15 | Index | Mores |