ชั้นเรียนเป็นเสาหลักของ เขียนโปรแกรมเชิงวัตถุ OOP มีความเกี่ยวข้องอย่างมากกับการจัดระเบียบโค้ดการใช้ซ้ำและการห่อหุ้ม
ข้อแรกข้อจำกัดความรับผิดชอบ: OOP ตรงกันข้ามกับบางส่วน ฟังก์ชั่นการเขียนโปรแกรมซึ่งเป็นกระบวนทัศน์ที่แตกต่างกันมากใน Python ไม่ใช่ทุกคนที่โปรแกรมใน Python (หรือภาษาส่วนใหญ่) ใช้ OOP คุณสามารถทำสิ่งต่างๆมากมายใน Java 8 ที่ไม่ใช่ Object Oriented มาก หากคุณไม่ต้องการใช้ OOP ก็ไม่ต้องใช้ หากคุณเพิ่งเขียนสคริปต์แบบใช้ครั้งเดียวเพื่อประมวลผลข้อมูลที่คุณจะไม่ใช้อีกต่อไปให้เขียนตามที่คุณต้องการ
อย่างไรก็ตามมีเหตุผลมากมายที่จะใช้ OOP
เหตุผลบางอย่าง:
องค์กร: OOP กำหนดวิธีที่เป็นที่รู้จักและเป็นมาตรฐานในการอธิบายและกำหนดทั้งข้อมูลและขั้นตอนในรหัส ข้อมูลและขั้นตอนทั้งสองสามารถเก็บไว้ที่ระดับความหมายที่แตกต่างกัน (ในคลาสที่แตกต่างกัน) และมีวิธีมาตรฐานเกี่ยวกับการพูดคุยเกี่ยวกับคำจำกัดความเหล่านี้ นั่นคือถ้าคุณใช้ OOP ด้วยวิธีมาตรฐานมันจะช่วยให้ตัวคุณเองในภายหลังและผู้อื่นเข้าใจแก้ไขและใช้รหัสของคุณ นอกจากนี้แทนที่จะใช้กลไกการจัดเก็บข้อมูลแบบซับซ้อนและซับซ้อน (dicts ของ dicts หรือ list หรือ dicts หรือรายการ dicts ของชุดหรืออะไรก็ตาม) คุณสามารถตั้งชื่อชิ้นส่วนของโครงสร้างข้อมูลและอ้างอิงได้อย่างสะดวก
สถานะ: OOP ช่วยให้คุณกำหนดและติดตามสถานะ ตัวอย่างเช่นในตัวอย่างคลาสสิกหากคุณกำลังสร้างโปรแกรมที่ประมวลผลนักเรียน (ตัวอย่างเช่นโปรแกรมเกรด) คุณสามารถเก็บข้อมูลทั้งหมดที่คุณต้องการเกี่ยวกับพวกเขาไว้ในที่เดียว (ชื่ออายุเพศระดับชั้น หลักสูตร, เกรด, ครู, เพื่อน, อาหาร, ความต้องการพิเศษ ฯลฯ ) และข้อมูลนี้ยังคงอยู่ตราบเท่าที่วัตถุยังมีชีวิตอยู่และเข้าถึงได้ง่าย
การห่อหุ้ม : ด้วยการห่อหุ้มกระบวนการและข้อมูลจะถูกจัดเก็บไว้ด้วยกัน วิธีการ (คำศัพท์ OOP สำหรับฟังก์ชั่น) ถูกกำหนดไว้ข้างๆข้อมูลที่พวกมันทำงานและผลิต ในภาษาเช่น Java ที่อนุญาตการควบคุมการเข้าถึงหรือใน Python ขึ้นอยู่กับว่าคุณอธิบาย API สาธารณะของคุณอย่างไรซึ่งหมายความว่าวิธีการและข้อมูลสามารถซ่อนจากผู้ใช้ สิ่งนี้หมายความว่าถ้าคุณต้องการหรือต้องการเปลี่ยนรหัสคุณสามารถทำสิ่งที่คุณต้องการนำไปใช้ของรหัส แต่ให้ API สาธารณะเหมือนเดิม
การสืบทอด : การสืบทอดทำให้คุณสามารถกำหนดข้อมูลและขั้นตอนได้ในที่เดียว (ในชั้นเดียว) จากนั้นแทนที่หรือขยายการทำงานนั้นในภายหลัง ตัวอย่างเช่นใน Python ฉันมักจะเห็นคนสร้างคลาสย่อยของdict
คลาสเพื่อเพิ่มฟังก์ชันการทำงานเพิ่มเติม การเปลี่ยนแปลงทั่วไปกำลังแทนที่วิธีที่ส่งข้อยกเว้นเมื่อมีการร้องขอคีย์จากพจนานุกรมที่ไม่มีอยู่เพื่อให้ค่าเริ่มต้นตามคีย์ที่ไม่รู้จัก สิ่งนี้ช่วยให้คุณสามารถขยายรหัสของคุณเองได้ในขณะนี้หรือภายหลังอนุญาตให้ผู้อื่นขยายรหัสของคุณและอนุญาตให้คุณขยายรหัสของผู้อื่น
ความสามารถนำกลับมาใช้ใหม่ได้: เหตุผลทั้งหมดนี้และเหตุผลอื่น ๆ ทำให้สามารถใช้งานโค้ดได้มากขึ้น รหัสเชิงวัตถุช่วยให้คุณสามารถเขียนรหัสทึบ (ทดสอบ) ครั้งเดียวแล้วนำมาใช้ซ้ำแล้วซ้ำอีก หากคุณต้องการปรับแต่งบางอย่างสำหรับกรณีการใช้งานเฉพาะของคุณคุณสามารถสืบทอดจากคลาสที่มีอยู่และเขียนทับพฤติกรรมที่มีอยู่ หากคุณต้องการเปลี่ยนแปลงบางสิ่งคุณสามารถเปลี่ยนแปลงได้ทั้งหมดในขณะที่รักษาลายเซ็นวิธีสาธารณะที่มีอยู่และไม่มีใครฉลาด (หวังว่า)
มีเหตุผลหลายประการที่จะไม่ใช้ OOP และคุณไม่จำเป็นต้องใช้ แต่โชคดีที่มีภาษาเช่น Python คุณสามารถใช้เพียงเล็กน้อยหรือมากก็ได้แล้วแต่คุณ
ตัวอย่างของกรณีการใช้ของนักเรียน (ไม่รับประกันคุณภาพของโค้ดเพียงตัวอย่าง):
วัตถุที่มุ่งเน้น
class Student(object):
def __init__(self, name, age, gender, level, grades=None):
self.name = name
self.age = age
self.gender = gender
self.level = level
self.grades = grades or {}
def setGrade(self, course, grade):
self.grades[course] = grade
def getGrade(self, course):
return self.grades[course]
def getGPA(self):
return sum(self.grades.values())/len(self.grades)
# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})
# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())
Dict มาตรฐาน
def calculateGPA(gradeDict):
return sum(gradeDict.values())/len(gradeDict)
students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}
students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}
# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))