สวัสดี! ในบทเรียนวันนี้ เราจะพูดถึงหลักการของการเขียนโปรแกรมเชิงวัตถุ คุณเคยสงสัยหรือไม่ว่าเหตุใด Java จึงได้รับการออกแบบตรงตามที่เป็นอยู่ ฉันหมายถึง คุณประกาศคลาสและสร้างออบเจกต์ตามคลาส คลาสมีเมธอด ฯลฯ แต่ทำไมโครงสร้างภาษาจึงให้โปรแกรมประกอบด้วยคลาสและออบเจกต์ ไม่ใช่อย่างอื่น เหตุใดแนวคิดของ "วัตถุ" จึงถูกคิดค้นและวางไว้ในระดับแนวหน้า ทุกภาษาได้รับการออกแบบด้วยวิธีนี้หรือไม่? ถ้าไม่ใช่ Java ให้ประโยชน์อะไรบ้าง อย่างที่คุณเห็นมีคำถามมากมาย :) ลองตอบคำถามแต่ละข้อในบทเรียนวันนี้
คุณอาจจะอ่านโค้ดที่เขียนด้วยภาษานี้ได้ง่ายๆ และอธิบายคร่าวๆ ว่ามันทำอะไรได้บ้าง :)
การเขียนโปรแกรมเชิงวัตถุ (OOP) คืออะไร?
แน่นอน Java ไม่ได้ประกอบด้วยวัตถุและคลาสเพียงเพื่อความสนุกสนาน พวกเขาไม่ใช่ความตั้งใจของผู้สร้าง Java และไม่ใช่สิ่งประดิษฐ์ของพวกเขาด้วยซ้ำ มีภาษาอื่น ๆ อีกมากมายตามวัตถุ ภาษาดังกล่าวภาษาแรกเรียกว่า "Simula" มันถูกคิดค้นขึ้นในปี 1960 ในประเทศนอร์เวย์ ยิ่งไปกว่านั้น แนวคิดของ "คลาส" และ "วิธีการ" ยังปรากฏใน Simula ตามมาตรฐานของการพัฒนาซอฟต์แวร์ "Simula" ดูเหมือนเป็นภาษาโบราณ แต่ทุกคนสามารถเห็น "ความคล้ายคลึงของตระกูล" กับ Java ได้
Begin
Class Rectangle (Width, Height); Real Width, Height;
Begin
Real Area, Perimeter;
Procedure Update;
Begin
Area := Width * Height;
OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
Perimeter := 2*(Width + Height);
OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
End of Update;
Update;
OutText("Rectangle created: "); OutFix(Width,2,6);
OutFix(Height,2,6); OutImage;
End of Rectangle;
Rectangle Class ColouredRectangle (Color); Text Color;
Begin
OutText("ColouredRectangle created, color = "); OutText(Color);
OutImage;
End of ColouredRectangle;
Ref(Rectangle) Cr;
Cr :- New ColouredRectangle(10, 20, "Green");
End;
โค้ดตัวอย่างโค้ดนี้นำมาจาก "Simula - 50 years of OOP" โดย Weekly-geekly อย่างที่คุณเห็น Java นั้นไม่แตกต่างจากรุ่นปู่ของมันมากนัก :) นี่เป็นเพราะความจริงที่ว่าการปรากฏตัวของ Simula ถือเป็นการกำเนิดของแนวคิดใหม่: การเขียนโปรแกรมเชิงวัตถุ Wikipedia กำหนด OOP ดังนี้: "การเขียนโปรแกรมเชิงวัตถุ (OOP) เป็นกระบวนทัศน์การเขียนโปรแกรมตามแนวคิดของ "วัตถุ" ซึ่งสามารถมีข้อมูลในรูปแบบของฟิลด์ (มักเรียกว่าแอตทริบิวต์) และรหัสในรูปแบบ ของขั้นตอน (มักเรียกว่าวิธีการ)" ในความคิดของฉันนี่เป็นคำจำกัดความที่ดีจริงๆ ไม่นานมานี้คุณเริ่มเรียนรู้ Java แต่คำจำกัดความนี้อาจไม่มีคำที่คุณไม่รู้จัก :) วันนี้ OOP เป็นวิธีการเขียนโปรแกรมที่ใช้กันมากที่สุด นอกจากจาวาแล้ว หลักการ OOP ใช้ในภาษายอดนิยมหลายภาษาที่คุณอาจเคยได้ยิน ตัวอย่างเช่น C++ (ใช้อย่างแข็งขันในการพัฒนาเกม), Objective-C และ Swift (ใช้เขียนโปรแกรมสำหรับอุปกรณ์ Apple), Python (นิยมมากที่สุดในการเรียนรู้ของเครื่อง), PHP (หนึ่งในภาษาพัฒนาเว็บที่ได้รับความนิยมมากที่สุด), JavaScript ( มันง่ายกว่าที่จะบอกว่ามันไม่ได้ใช้สำหรับอะไร) และอื่นๆ อีกมากมาย ดังนั้นหลักการของ OOP คืออะไร? เราจะบอกคุณในรายละเอียด หลักการของ OOP คืออะไร? เราจะบอกคุณในรายละเอียด หลักการของ OOP คืออะไร? เราจะบอกคุณในรายละเอียด
หลักการ OOP
เหล่านี้เป็นรากฐานของมูลนิธิ คุณสมบัติหลัก 4 ประการที่รวมกันเป็นกระบวนทัศน์การเขียนโปรแกรมเชิงวัตถุ การทำความเข้าใจสิ่งเหล่านี้เป็นสิ่งสำคัญในการเป็นโปรแกรมเมอร์ที่ประสบความสำเร็จหลักการ 1. การสืบทอด
ข่าวดี: คุณรู้หลักการบางอย่างของ OOP แล้ว! :) เราพบการสืบทอดมาแล้วสองสามครั้งในบทเรียน และเราสามารถใช้มันได้ การสืบทอดเป็นกลไกที่ให้คุณอธิบายคลาสใหม่ตามคลาส (พาเรนต์) ที่มีอยู่ ในการทำเช่นนั้น คลาสใหม่จะยืมคุณสมบัติและฟังก์ชันการทำงานของคลาสพาเรนต์ มรดกมีไว้เพื่ออะไรและมีข้อดีอย่างไร? เหนือสิ่งอื่นใด การใช้โค้ดซ้ำ ฟิลด์และเมธอดที่ประกาศในคลาสพาเรนต์สามารถใช้ในคลาสที่สืบทอดมา หากรถยนต์ทุกประเภทมี 10 ฟิลด์ทั่วไปและ 5 วิธีการที่เหมือนกัน คุณเพียงแค่ย้ายพวกมันไปที่รถยนต์ชั้นเรียนผู้ปกครอง คุณสามารถใช้มันในคลาสที่สืบทอดมาได้โดยไม่มีปัญหา ข้อได้เปรียบที่มั่นคง: ทั้งเชิงปริมาณ (โค้ดน้อย) และเป็นผลให้เชิงคุณภาพ (คลาสง่ายขึ้นมาก) ยิ่งไปกว่านั้น การสืบทอดยังมีความยืดหยุ่นมาก — คุณสามารถเพิ่มฟังก์ชันการเขียนแยกต่างหากที่ลูกหลานขาดหายไป (บางฟิลด์หรือลักษณะการทำงานเฉพาะสำหรับคลาสเฉพาะ) โดยทั่วไปแล้วในชีวิตจริงเราทุกคนค่อนข้างคล้ายกับพ่อแม่ แต่ก็แตกต่างจากพวกเขาด้วย :)หลักการที่ 2. สิ่งที่เป็นนามธรรม
นี่เป็นหลักการง่ายๆ สิ่งที่เป็นนามธรรมหมายถึงการระบุลักษณะสำคัญและสำคัญที่สุดของบางสิ่ง ในขณะเดียวกันก็ละทิ้งสิ่งเล็กน้อยและไม่มีนัยสำคัญไปพร้อม ๆ กัน ไม่จำเป็นต้องคิดค้นล้อใหม่ ลองนึกถึงตัวอย่างจากบทเรียนเก่าเกี่ยวกับชั้นเรียน สมมติว่าเรากำลังสร้างระบบการยื่นเอกสารสำหรับพนักงานบริษัท ในการสร้างวัตถุ "พนักงาน" เราได้เขียนคลาสพนักงาน คุณลักษณะใดมีความสำคัญในการอธิบายไว้ในระบบการจัดเก็บเอกสารของบริษัท ชื่อ วันเกิด SSN และ ID พนักงาน แต่ไม่น่าเป็นไปได้ที่เราจะต้องการส่วนสูง สีตา หรือสีผมของพนักงานสำหรับเรกคอร์ดประเภทนี้ บริษัทไม่ต้องการข้อมูลดังกล่าวเกี่ยวกับพนักงาน ดังนั้นใน คลาส Employeeเราจึงประกาศตัวแปรดังต่อไปนี้:, int age , int socialSecurityNumberและint EmployeeId และเราลบข้อมูลที่ไม่จำเป็นออกไป เช่น สีตา อย่างไรก็ตาม หากเรากำลังสร้างระบบการจัดเก็บสำหรับเอเจนซี่โมเดล สถานการณ์จะเปลี่ยนไปอย่างมาก ความสูงของนางแบบ สีตา และสีผมเป็นคุณลักษณะที่สำคัญ แต่ SSN ของเธอไม่เกี่ยวข้องกับเราเลย ดังนั้นใน คลาส Modelเราสร้างตัวแปรต่อไปนี้: ความสูงของสตริง , ขนของสตริง , ตาของสตริงหลักการที่ 3 การห่อหุ้ม
เราได้พบเจอสิ่งนี้แล้ว ใน Java การห่อหุ้มหมายถึงการจำกัดความสามารถในการอ่านและเปลี่ยนแปลงข้อมูล อย่างที่คุณเห็น คำนี้มาจากคำว่า "แคปซูล" เราจะใช้ "แคปซูล" เพื่อซ่อนข้อมูลสำคัญบางอย่างที่เราไม่ต้องการให้ผู้อื่นเปลี่ยนแปลง นี่คือตัวอย่างง่ายๆ จากชีวิตจริง คุณมีชื่อและนามสกุล เพื่อนของคุณทุกคนรู้จักพวกเขา แต่พวกเขาไม่มีความสามารถในการเปลี่ยนชื่อหรือนามสกุลของคุณ เราอาจกล่าวได้ว่ากระบวนการในการดำเนินการนั้น "ถูกห่อหุ้ม" โดยระบบศาล: คุณสามารถเปลี่ยนนามสกุลได้ผ่านทางเสมียนศาลเท่านั้น และมีเพียงคุณเท่านั้นที่สามารถทำได้ "ผู้ใช้" รายอื่นมีสิทธิ์เข้าถึงชื่อและนามสกุลของคุณแบบ "อ่านอย่างเดียว" :) อีกตัวอย่างหนึ่งคือเงินสดที่เก็บไว้ที่บ้าน การวางทิ้งไว้กลางห้องของคุณไม่ใช่ความคิดที่ดี "ผู้ใช้" ใดๆ (ผู้ที่มาที่บ้านของคุณ) จะสามารถเปลี่ยนจำนวนเงินของคุณได้ กล่าวคือ พวกเขาสามารถรับเงินของคุณได้ มันจะดีกว่าที่จะห่อหุ้มไว้ในที่ปลอดภัย จากนั้นการเข้าถึงจะมีให้สำหรับคุณเท่านั้นและใช้รหัสพิเศษเท่านั้น ตัวอย่างที่เห็นได้ชัดเจนของการห่อหุ้มที่คุณเคยใช้คือตัวแก้ไขการเข้าถึง (ส่วนตัว สาธารณะ ฯลฯ) รวมถึงตัวตั้งและตัวรับ หากคุณไม่สรุปฟิลด์ อายุของคลาสแมวใครๆ ก็เขียนได้:
Cat.age = -1000;
กลไกการห่อหุ้มช่วยให้เราปกป้อง ฟิลด์ อายุด้วยวิธีตัวตั้งค่า ซึ่งเรามั่นใจได้ว่าอายุจะไม่สามารถตั้งค่าเป็นจำนวนลบได้
หลักการที่ 4 ความหลากหลาย
ความแตกต่างคือความสามารถในการทำงานกับหลายประเภทราวกับว่าเป็นประเภทเดียวกัน นอกจากนี้ พฤติกรรมของวัตถุจะแตกต่างกันไปตามประเภทของวัตถุ ฟังดูซับซ้อนไหม? มาทำความเข้าใจกันตอนนี้ ยกตัวอย่างที่ง่ายที่สุด: สัตว์ สร้าง คลาส Animal ด้วยเมธอด speak()เดียว และคลาสย่อย 2 คลาส ได้แก่Cat and Dog
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println ("Woof-woof!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
ตอนนี้เราจะพยายามประกาศ ตัวแปรอ้างอิง AnimalและกำหนดDog object ให้กับตัวแปรนั้น
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.speak();
}
}
ท่านคิดว่าจะเรียกวิธีใด? Animal.speak()หรือDog.speak() ? เมธอดใน คลาส Dogจะถูกเรียกว่า: Woof-woof! เราสร้าง การอ้างอิง สัตว์แต่วัตถุมีพฤติกรรมเหมือนสุนัข ถ้าจำเป็น มันอาจทำตัวเหมือนแมว ม้า หรือสัตว์อื่นๆ สิ่งสำคัญคือการกำหนดคลาสย่อยเฉพาะให้กับตัวแปรอ้างอิงAnimal ทั่วไป สิ่งนี้สมเหตุสมผลเพราะสุนัขทุกตัวเป็นสัตว์ นั่นคือสิ่งที่เราคิดไว้เมื่อเราพูดว่า "พฤติกรรมของวัตถุจะแตกต่างกันไปตามประเภทของวัตถุ" ถ้าเราสร้างCat object...
public static void main(String[] args) {
Animal cat = new Cat();
cat.speak();
}
วิธี การพูด ()จะแสดง "Meow!" แต่เราหมายถึงอะไรโดย 'ความสามารถในการทำงานกับหลายประเภทราวกับว่าเป็นประเภทเดียวกัน' นี่ค่อนข้างตรงไปตรงมา ลองจินตนาการว่าเรากำลังสร้างร้านตัดผมสำหรับสัตว์ ร้านตัดผมของเราควรสามารถเล็มขนสัตว์ตัวใดก็ได้ ดังนั้นเราจึงสร้างเมธอดtrim()ด้วย พารามิเตอร์ Animal (สัตว์กำลังตัดผม)
public class AnimalBarbershop {
public void trim(Animal animal) {
System.out.println("The haircut is done!");
}
}
และตอนนี้เราสามารถส่งวัตถุCat and Dog ไปยังวิธีการ trim() ได้แล้ว !
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
AnimalBarbershop barbershop = new AnimalBarbershop();
barbershop.trim(cat);
barbershop.trim(dog);
}
และนี่คือตัวอย่างที่ชัดเจน: คลาส AnimalBarbershopทำงานกับ ประเภท CatและDogราวกับว่าเป็นประเภทเดียวกัน ในขณะเดียวกันแมวและสุนัขก็มีพฤติกรรมที่แตกต่างกัน พวกมันต่างก็พูดไม่เหมือนกัน
GO TO FULL VERSION