1.1k likes | 1.36k Views
Lec07 :: OOP วิชา :: การเขียนโปรแกรมเชิงวัตถุ. โดน อ. นัฐพงศ์ ส่งเนียม xnatapong@hotmail.com http://www.siam2dev.com. Agenda. Imparative Programming : การเขียนโปรแกรมแบบดั้งเดิม OOP Programming : การเขียนโปรแกรมเชิงวัตถุ Imparative VS OOP : เปรียบเทียบข้อแตกต่าง
E N D
Lec07 :: OOPวิชา :: การเขียนโปรแกรมเชิงวัตถุ โดน อ. นัฐพงศ์ ส่งเนียม xnatapong@hotmail.com http://www.siam2dev.com
Agenda • Imparative Programming : การเขียนโปรแกรมแบบดั้งเดิม • OOP Programming: การเขียนโปรแกรมเชิงวัตถุ • Imparative VS OOP: เปรียบเทียบข้อแตกต่าง • Fundamental of OOP : หลักการสำคัญของ OOP • Class : ความหมายของ Object • Object : ความหมายของ class • Inheritance • Polymorphism • Overloading
Imperative Top-down design Procedure-oriented Algorithm Share global data Program-data separation Data transportation Single flow Object-oriented Bottom-up Object-oriented Behavior Information hiding Encapsulation Communication with messages Multiple objects Imperative VS Object-oriented
การเขียนโปรแกรมแบบ imparative OOP Imparative
ข้อดีของ OOP • เข้าใจง่าย เพราะการทำงานเปรียบเสมือนการจำลองเหมือนในโลกจริง โดยอาศัยการมองทุกอย่างเป็น object ซึ่งแต่ละตัวมีหน้าที่และความหมายในตัว • บำรุงรักษา และแก้ไขโปรแกรมได้ง่าย • มีความปลอดภัยสูง เพราะจัดการกับ error ได้ดี • นำกลับมาใช้ใหม่ได้ (reusability) ลดขั้นตอนในการเขียนโปรแกรม • โปรแกรมมีคุณภาพสูง ใช้ได้หลาย platform
ข้อเสียของ OOP • เข้าใจยาก สำหรับผู้เริ่มต้นเขียนโปรแกรม หรือถนัดเขียนโปรแกรม แบบ procedural • ทำงานได้ช้ากว่าภาษาโปรแกรมอื่น • ภาษามีความกำกวม ถ้ามีลักษณะ multiple inheritance
หลักการของการพัฒนาซอฟท์แวร์ด้วย Object-Oriented Programming • คือการแบ่งซอฟท์แวร์ออกเป็นส่วนๆ เรียกว่า class โดยการนิยาม class และ object ทั้งนี้เพื่อทำให้สามารถนำส่วนของซอฟท์แวร์นั้นกลับมาเรียกใช้ได้อีก(reuseable) ลดความซ้ำซ้อนและเวลาลงได้ • การทำงานของ class จะถูกกำหนดโดยส่วนอินเตอร์เฟสของ method ส่วนการทำงานของส่วนที่เป็นโค้ต จะไม่ถูกคำนึงถึงในการออกแบบ. ภาษา OOP สนใจเฉพาะข้อมูลที่จะถูกประมวลผลมากกว่าฟังก์ชั่นที่ทำการประมวลข้อมูลนั้น
หลักการที่สำคัญบางประการของ OOP • Class and Subclass • Encapsulate • Inheritance • Polymorphism • Abstract Data Type
เหตุผลที่ OOP มีบทบาทมากขึ้น • ง่าย และรวดเร็ว ทำให้ลดเวลาในการพัฒนาลงไปได้ • เพิ่มปริมาณงานที่ได้ และมีความน่าเชื่อถือมากกว่า • สามารถนำ code กลับมาใช้ได้อีก (เรียกใช้ class) • ทำต้นแบบ (Prototyping) ได้รวดเร็วกว่า • ลดต้นทุนในการสร้าง และบำรุงรักษาซอฟต์แวร์ • การเปลี่ยนแปลงแก้ไข ไม่ทำให้เกิดผลกระทบไปยังภายนอก class
มารู้จักคลาสและวัตถุกันมารู้จักคลาสและวัตถุกัน • คลาสเป็นเหมือนส่วนของแม่พิมพ์ เพื่อบอกลักษณะว่าวัตถุในคลาสนี้มีลักษณะและพฤติกรรมเป็นอย่างไร • วัตถุเป็นสิ่งที่ถูกสร้างขึ้นมาจากคลาสเพื่อใช้งาน กำหนดค่าต่างๆ ส่งข้อความสั่งให้วัตถุทำงาน คลาสสี่เหลี่ยมผืนผ้า คุณสมบัติ:กว้าง, ยาว เมธทอด:คำนวณพื้นที่ วัตถุA:สี่เหลี่ยมผืนผ้า กว้าง 2 ยาว 3 เมธทอด:คำนวณพื้นที่
Class คืออะไร • คือกลุ่ม (category) ของ objects ที่มีคุณสมบัติและพฤติกรรมที่เหมือนกัน โดย class จะต้องประกอบไปด้วย data, behavior และ interface • คือต้นแบบ (prototype) หรือพิมพ์เขียว ที่กำหนดตัวแปรและวิธีการ เพื่อนำไปใช้ได้ในทุก object ของ class
เปรียบเทียบคลาสกับวัตถุเปรียบเทียบคลาสกับวัตถุ
Class ทางบก ยานพาหนะ รถสี่ล้อ รถสิบล้อ รถสองล้อ รถสามล้อ ทางอากาศ ทางบก
Objects • คือ สิ่งใดๆ ก็ตาม ซึ่งมีคุณลักษณะ (State) บ่งบอกถึงความเป็นตัวของมันเองในขณะนั้น และสามารถแสดงพฤติกรรม (Behavior) ของตัวเองออกมาได้ เช่น รถยนต์สีน้ำเงิน : มีความหมายคือ วัตถุประเภทรถยนต์ มีคุณลักษณะของสีเป็นสีน้ำเงิน และมีพฤติกรรมที่แสดงถึงการเคลื่อนที่ และหยุดได้ • หรือกล่าวได้ว่า object ก็คือข้อมูลของ class (เป็นentities ของ class) ซึ่งทุกๆ อย่างจะจัดเป็น objects โดยต้องประกอบไปด้วย • ชื่อ (Identity) • สถานะ (State) คุณสมบัติ หรือค่าของข้อมูล ซึ่งแทนด้วย value • พฤติกรรม (Behavior) ที่ระบุว่าสามารถทำอะไรได้บ้าง ซึ่งแทนด้วย method
ตัวอย่างชนิดของวัตถุและวัตถุตัวอย่างชนิดของวัตถุและวัตถุ :siemens MobilePhone String bandname Button button Screen screen Antenna antenna Simm simNet :ericsson call() receive() hangup() sendSMS() :nokia
Method • คือ function ที่บ่งบอกพฤติกรรมของ object ว่าทำอะไรได้บ้าง กำหนดไว้ใน class โดยต้องประกอบด้วย ชื่อของ method เรียกว่า Identifier ตามด้วยเครื่องหมายวงเล็บ () โดยในวงเล็บอาจมี parameter list อยู่หรือไม่ก็ได้ เช่น • getBalance() • raiseSalary( float Salary, float Percent )
Constructor Method • คือเมธอดที่ใช้สำหรับสร้าง instance object ของคลาสนั้นๆ โดยที่ ชื่อเมธอดนี้ต้องเหมือนกับชื่อคลาส และใช้สำหรับ initialize ข้อมูลให้กับ instance variable โดยจะไม่มีการถ่ายทอดให้กับ subclass และไม่มีการ return ค่า
Message • คือคำสั่งหรือข้อความที่จะให้ข้อมูลหรือตัวแปรใดทำงาน ก็คือ parameter ในภาษาอื่นที่ไม่ใช่ OOP คือใช้เพื่อนำส่งค่าข้อมูลระหว่าง object โดยใน message นั้นต้องประกอบด้วย • Destination ก็คือชื่อของ object • Method • Parameters
Accessibility • public : เข้าถึงได้ในทุกที่ • private : เข้าถึงได้เฉพาะภายใน class เท่านั้น ไม่รวม sub class • protected : เข้าถึงได้เฉพาะภายใน class และ sub class ที่สืบทอดกันมา (Inherit) • default : ถ้าไม่ระบุ จะเข้าถึงข้อมูลภายใน class และอยู่เพ็กเกจเดียวกัน
Public Class Sub Class
Encapsulate คือ การปิดบัง หรือจำกัดการเข้าถึงข้อมูลบางอย่าง (Information hiding) ที่ไม่จำเป็นต้องให้ส่วนอื่นรับรู้ ยกตัวอย่างเช่น เราจะไม่สนใจหรือมองเห็นได้ว่า เครื่องเล่น CD จะแปลงสัญญาณดิจิตอล ออกมาเป็นเพลงได้อย่างไร เราใช้และติดต่อกับเครื่องแค่ควบคุมการทำงานผ่านแผงควบคุม เช่น เปิด-ปิด เล่น เร่งเสียง เปลี่ยนแทร๊กไปข้างหน้า ย้อนกลับ เป็นต้น โดยเราต้องออกแบบควบคุมกฏเกณฑ์ต่างๆ ของซอฟท์แวร์ให้สอดคล้องกับความเป็นจริง • Encapsulate เป็นคุณสมบัติของ object ซึ่งมีลักษณะดังนี้ • กำหนดขอบเขตที่ชัดเจนให้กับ object • กำหนดอินเตอร์เฟสว่าจะติดต่อกับ object อื่นๆ อย่างไร • ส่วนอิมพลิเมนต์ไม่สามารถเข้าถึงได้ภายนอกขอบเขตของ class
Inheritance • คือการถ่อยทอดข้อมูล (ซึ่งก็คือ state และ behavior) จาก class ลำดับที่สูงกว่า (super class หรือ parent class) ไปยังลำดับที่ต่ำกว่า (subclass) โดยที่ subclass นั้นสามารถเปลี่ยนแปลง หรือแทนที่ข้อมูล (override) ที่ได้รับการถ่ายทอดมานั้นได้
Class Animal Animal • name • leg • Eat() • Sleep()
Inheritance : สืบทอดคุณสมบัติ • ตัวอย่าง Tiger Class สามารถสืบทอดคุณสมบัติจาก Animal Class Animal Class super Class sub Class
Polymorphisim • การทำให้ message อันหนึ่งสามารถส่งให้ object แต่ละตัวใน class และ subclass ตอบสนองต่อ message อันเดียวกัน ในลักษณะที่เหมาะสบกับ class ของตัวเอง • ยกตัวอย่างเช่น method print นี้สามารถส่งให้ทุก object ของ class และ subclass ที่ทำให้ object นั้นรู้จัก method print และแต่ละ object ที่ต่างกันจะตอบสนองต่อ message นี้ต่างกันออกไป ตามความสามารถในการใช้
Shape Circle Line Rectangle +draw() +erase() +draw() +erase() +draw() +erase() +draw() +erase() Polymorphisim การถ่ายทอดให้เกิดลักษณะของพ้องรูป
โครงสร้างของ Class โปรแกรมที่สร้างจากภาษาจาวา ต้องมีออปเจ็คหรือคลาสอย่างน้อยหนึ่งตัว โดยมีรูปแบบโครงสร้างดังนี้ class Class_Name { Data_Member Method_Member } //รูปแบบของ Data Member [ Accessibility ] [ final ] [ static ] Data_Type Data_Name เช่น private static String stu_name ;
รูปแบบของ Data Member • [ Accessibility ] [ final ] [ static ] Data_Type Data_Name • เช่น private static String stud_name ; • Data คือส่วนประกอบส่วนหนึ่งของคลาส ถูกกำหนดเพื่อใช้สำหรับเก็บข้อมูล เช่นคลาส Pen มีดาต้า Color ไว้เก็บข้อมูลสี class Pen { String Color = “red”; // Data Member }
final • final : เป็นคีย์เวิร์ดตัวหนึ่งซึ่งใช้บอกว่าดาต้าตัวนั้นใช้สำหรับเก็บข้อมูล โดยที่ข้อมูลจะไม่สามารถทำการเปลี่ยนแปลงได้ไม่ว่าในกรณีใดๆ ปกติจะใส่คีย์เวิร์ดนี้ไว้เมื่อต้องการให้ดาต้าเก็บข้อมูลที่เป็นข้อมูลที่คงที่ (Constant) ตลอดการทำงานของโปรแกรม • class CircleArea { public static void main(String args[]) { final double pi = 3.14;final double r = 10; System.out.println(“Circle Area = " + pi*r*r); } }
static • static : เป็นคีย์เวิร์ด สำหรับใช้บอกถึงคุณลักษณะพิเศษในการใช้งาน เมื่อมีการกำหนดนำหน้าดาต้าใดๆ แล้ว ดาต้านั้นจะมีคุณลักษณะดังนี้ • ดาต้า จะถูกโหลดลงในหน่วยความจำและพร้อมที่จะถูกใช้งานในทันทีเมื่อมีการอ้างถึง ตามข้อกำหนดของระดับการเข้าถึง (Accessibility)• ดาต้า จะอยู่ในหน่วยความจำเพียงตัวเดียว ไม่มีการ copy static method ไปกับ instance object คือจะผูกติดอยู่กับคลาสเท่านั้น ดังนั้นจึงสามารถใช้ดาต้าเป็นที่เก็บข้อมูลรวมของกลุ่มคลาสเดียวกันได้• ไม่สามารถเรียกใช้ instance variables หรือ instance method ได้• ไม่สามารถใช้คีย์เวิร์ด this ได้
โครงสร้างของ Object • เมื่อกล่าวถึงคำว่าออปเจ็คทุกคนจะเข้าใจว่าเป็นชื่อเรียกที่ใช้เรียกส่วนที่สร้างจากโครงร่างของคลาส ซึ่งออปเจ็คถูกสร้างโดยการใช้คำสั่งในภาษาจาวาสร้างขึ้น จากขั้นตอนสองขั้นตอน คือ 1. ขั้นตอนประกาศชื่อตัวแปรอ้างถึง(Reference Variable) 2. ขั้นตอนการสร้างอินสแตนซ์ (Instance of Class)
1. ขั้นตอนประกาศชื่อตัวแปรอ้างถึง (Reference Variable) • คือขั้นตอนที่ใช้กำหนดชื่อตัวแปรเพื่อใช้ในการอ้างถึงไปยังพื้นที่ในหน่วยความจำ โดยพื้นที่ส่วนนี้เป็นส่วนที่จัดเก็บอินสแตนซ์ที่สร้างขึ้นมาในภายหลัง โดยมีรูปแบบการกำหนดดังนี้ • Class_Name Reference_Name • Class_Name : คือชื่อของคลาสซึ่งอ้างถึงด้วย Reference_Name ได้ • Reference_Name : คือชื่อตัวแปรที่ถูกกำหนดขึ้นโดยผู้เขียนโปรแกรม
2. ขั้นตอนการสร้างอินสแตนซ์ (Instance of Class) • อินสแตนซ์ คือพื้นที่ในหน่วยความจำซึ่งสร้างตามแบบโครงร่างของคลาสใดๆ ดังนั้นอินสแตนซ์คือพื้นที่ที่สามารถเก็บข้อมูลและประมวลผลตาม ส่วนที่สามารถประมวลผลได้นั่นเอง มีรูปแบบการสร้างดังนี้
new Class_Constructor(Parameter_List ) • - new : คือคีย์เวิร์ดของภาษาจาวา เพื่อเป็นคำสั่งให้มีการจัดสรรพื้นที่หน่วยความจำ ตามโครงสร้างของคลาสจากที่กำหนดไว้แล้วในขั้นตอนที่ผ่านมา • - Class_Constructor : คือเมธรอดของคลาสที่เป็นคอนสตรักเตอร์ (เมธรอดที่เป็นคอนสตรักเตอร์มีชื่อเดียวกับชื่อคลาสเสมอ) โดยคลาสหนึ่งคลาสสามารถมีเมธรอดคอนสตรักเตอร์นี้ได้หลายเมธรอด (ชื่อเดียวกันแต่พารามิเตอร์ต่างกัน) • -Parameter_List : คือพารามิเตอร์ (ตัวแปรหรือค่าคงที่ใดๆ) ที่ผ่านข้อมูลเข้าไปสู่เมธรอดคอนสตักเตอร์ ซึ่งจำนวนหรือชนิดข้อมูลที่เป็นพารามิเตอร์ ขึ้นอยู่ว่าผู้เขียนโปรแกรมเรียกใช้คอนสตรักเตอร์แบบไหน
ตัวแปรอ้างถึงและอินสแตนซ์ (Reference variable and Instance) • ในภาษาจาวาตัวแปรอ้างถึงและอินแตนซ์มีความสัมพันธ์ซึ่งกันและกัน กล่าวคือตัวแปรอ้างถึงถูกกำหนดขึ้น เพื่อประโยชน์ในการอ้างไปยังตำแหน่งของอินสแตนซ์ที่อยู่ในหน่วยความจำ โดยในหน่วยความจำบนเครื่องคอมพิวเตอร์ บางครั้งสามารถสร้างอินสแตนซ์ได้หลายๆอินสแตนซ์ของการทำงานแต่ละครั้ง จึงจำเป็นต้องใช้ชื่อตัวแปรอ้างถึงเพื่อให้สามารถเข้าใช้งานดาต้าและเมธรอดในอินสแตนซ์ได้ ตัวอย่างเช่น
อินสแตนซ์ (instance) • ถ้าพิจารณาถึงลูกโป่งสวรรค์ เปรียบกับคนขายลูกโป่งสวรรค์ตามงานทั่วไป ถ้าให้ลูกโป่งแต่ละลูกเป็นอินสแตนซ์ และให้เชือกแต่ละเส้นคือตัวแปรอ้างถึง ดังนั้นเมื่อต้องการลูกโป่งลูกใดๆ ก็ให้หยิบเส้นเชือกขึ้นมาทำให้รู้ว่าเป็นเชือกที่ผูกอยู่กับลูกโป่งลูกใด instatnce reference
ตัวอย่าง การสร้างอินสแตนซ์ • หรือจากคำสั่ง Integer x = new Integer(237)หมายถึงกำหนดตัวแปรอ้างถึงชื่อ x โดยมีการอ้างถึงไปยัง อินสแตนซ์ที่เกิดจากคลาสที่ชื่อ Integer และให้อินสแตนซ์นั้นเก็บค่า 237 ไว้ โดยที่ Integer คือชื่อคลาสที่ใช้สำหรับจัดการข้อมูลตัวเลขจำนวนเต็ม
ต.ย. การสร้าง คลาส และ ออบเจ็กต์ 10 class rectangle { int w=5; int h=10; public double CalArea() { return w*h; } } public class testRec { public static void main(String args[]) { rectangle r = new rectangle(); System.out.println(r.CalArea()); } }; 5
ต.ย. การสร้าง คลาส และ ออบเจ็กต์ rectangle & constructor 10 class rectangle { int width; int height; rectangle(int w , int h) { width = w; height = h; } public double CalArea() { return width*height; } } public class testRec { public static void main(String args[]) { rectangle r = new rectangle(5,10); System.out.println(r.CalArea()); } }; 5
Inheritance class father { void homeaddr(){ System.out.println(“lp”); } } class child extends father { public static void main (String args[]) { homeaddr(); } }
Encapsulation class friend { private int val; public int getter(){ return this.val; } public void setter(int a) { this.val=a; } } class child { public static void main (String args[]) { friend x = new friend(); x.setter(5); System.out.println(x.getter()); } }
ต.ย. เรียก object จากอีก class หนึ่งในแฟ้ม x.java เดียวกัน แต่ไม่มี constructor :: มี 2 กล่อง ให้เรียก object จากอีกกล่องมาทำงาน แสดงวิธีเรียก 2 วิธี class xxx { void prtxx() { System.out.println("xx"); } } class x { public static void main(String args[]) { System.out.println("x"); new xxx().prtxx(); xxx a = new xxx(); // ไม่มี constructor ใน xxx a.prtxx(); } } // Result of this program // x // xx // xx
ต.ย. Constructor • Inheritance และ constructor : run constructor ของ superclass ตามด้วย subclass :: ปกติ default constructor คือ object ที่มีชื่อเดียวกับ class และไม่มีส่วนขยายใด ๆ :: a.java มี constructor เป็นโปรแกรมที่ compile ผ่าน run ไม่ได้ แต่มีไว้ให้ถูกเรียกใช้ได้ :: b.java มี constructor และทำงานภายใต้ main เรียก constructor ทั้ง 2 มาทำงาน :: constructor คือ default object จะส่งค่าให้ constructor ก็ได้ :: การแปล b.java จะเรียก a.java มาแปลด้วยถ้าไม่พบ a.class แต่ถ้าพบ และ a.java ไม่เปลี่ยน ก็จะไม่แปล a.java ใหม่
// a.java public class a { a() { System.out.println("a constructor"); } } // b.java public class b extends a { b(int i) { System.out.println("b constructor " + i); } public static void main (String[] args) { b xxx = new b(100); } } // Result of this program // a constructor // b constructor 100
Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control Object Oriented Programming Nattapong Songneam
publicvoid deposit(double amount); publicvoid deposit(int amount); publicvoid deposit(double amount, double interest); publicboolean deposit(double amount); Overloading Methods • การประกาศเมทธอดซ้ำซ้อน (Overloading Methods) • คือ วิธีการเชิงวัตถุ ที่มีไว้เพื่อนำชื่อเมทธอด (Methods Name) กลับมาใช้ใหม่ (reuse) • ภาษาโปรแกรมจาวาสนับสนุน Overloading Methods โดย • อนุญาตให้ประกาศเมทธอดที่มีชื่อเดียวกันซ้ำกันได้ แต่มีเงื่อนไขดังนี้ • ชนิด หรือ จำนวน หรือ ลำดับของ argument จะต้องต่างกัน • return type ของเมทธอดจะเหมือนกัน หรือแตกต่างกันก็ได้