อะไรจะเป็นคำอธิบายสำหรับการสังเกตนี้?
- วัตถุจำลองบัญชีธนาคารสองตัวสามารถตอบสนองต่อการฝากเงินที่เหมือนกันได้ ในขณะที่มียอดคงเหลือต่างกัน
- เริ่มต้นด้วยการทำนาย ระบุปริมาณหรือลักษณะที่คุณจะเปรียบเทียบ แล้วตัดสินใจว่าหลักฐานอะไรที่จะแยกแยะคำอธิบายสองแบบได้
สร้างโมเดล
- คลาสกำหนดชนิดที่มีสถานะและพฤติกรรม วัตถุคือ อินสแตนซ์ การห่อหุ้ม (Encapsulation) ควบคุมการเข้าถึงผ่านอินเทอร์เฟซเพื่อให้การดำเนินการรักษา invariant ไว้ได้ การสืบทอด (Inheritance) สร้างความสัมพันธ์ของชนิดที่เหมาะสม ส่วนการประกอบ (Composition) สร้างวัตถุที่ประกอบด้วยหรือใช้อีกวัตถุหนึ่ง
- encapsulation: การควบคุมการเข้าถึงสถานะผ่านอินเทอร์เฟซ; instance: วัตถุเฉพาะของคลาสหนึ่ง
เลือกหลักฐานที่นำมาทดสอบได้
- การเรียกเมทόδทำงานกับอินสแตนซ์เฉพาะ ตัวแปรสถานะควรเป็นไปตามเงื่อนไขก่อน (preconditions) และเงื่อนไขหลัง (postconditions) Polymorphism ทำให้โค้ดสามารถใช้อินเทอร์เฟซร่วมกันพร้อมกับการนำไปใช้ที่แตกต่างกัน เมื่อสัญญา (contract) ถูกเคารพ
- สร้างโมเดลบัญชีหรือสินค้าคงคลังสังเคราะห์ขนาดเล็ก ทดสอบอินสแตนซ์อิสระสองตัว ปฏิเสธการดำเนินการที่ไม่ถูกต้องและค่าขอบเขต เก็บโมเดลห่างจากบัญชีการเงินจริงและข้อมูลการเข้าสู่ระบบ
เริ่มจากปริมาณที่ทราบแล้ว
- ระบุค่าที่ทราบและหน่วยของมัน เลือกความสัมพันธ์โดยพิจารณาว่าข้อสมมติฐานสอดคล้องกับเคสนี้ แล้วจัดรูปสมการก่อนแทนค่า
- Known: Object A เริ่มต้นที่ 40 หน่วยและได้รับ 15; Object B เริ่มต้นที่ 20 และได้รับ 5. ยอดคงเหลือสุดท้ายคือ 55 และ 25. ผลรวมของทั้งสองคือ 80 แต่ยอดคงเหลือของแต่ละ object ไม่เท่ากับ 80
ตัวอย่าง:
อินสแตนซ์เริ่มต้นที่ 12 หน่วย เพิ่ม 8 และลบออก 3. หาค่าสุดท้าย用它 ใช้ลำดับเดียวกัน: จำนวน Known → โมเดล → ความสัมพันธ์ → การแทนค่า → หน่วยและการตีความ
ตรวจสอบข้อสรุปและขอบเขต
- คลาสไม่เหมือนอินสแตนซ์ใดอินสแตนซ์หนึ่ง การสืบทอดไม่ได้ดีกว่า composition เสมอ การซ่อนฟิลด์เพียงอย่างเดียวไม่ได้พิสูจน์ว่าทุกการรักษาสถานะที่ถูกต้อง
- กลับไปที่การสังเกตเดิม อธิบายว่าผลลัพธ์นี้สนับสนุนสิ่งใด มีเงื่อนไขใดบ้าง และเป็นอย่างไรในการทดสอบคำอธิบายอื่นที่ขัดแย้งกัน
เตือน:
อินสแตนซ์สองตัวของคลาสต้องแบ่งปันยอดคงเหลือเดียวกันเสมอ ข้ออ้างนี้ผิด: คลาสไม่เหมือนอินสแตนซ์ใดอินสแตนซ์หนึ่ง การสืบทอดไม่ได้ดีกว่า composition เสมอ การซ่อนฟิลด์เพียงอย่างเดียวไม่ได้พิสูจน์ว่าทุกการรักษาสถานะที่ถูกต้อง
จุดสำคัญ:
วัตถุ: สถานะ พฤติกรรม และอินเทอร์เฟซ: การเรียกเมท็อดทำงานกับอินสแตนซ์เฉพาะ ตัวแปรสถานะควรเป็นไปตามเงื่อนไขก่อน (preconditions) และเงื่อนไขหลัง (postconditions) Polymorphism ทำให้โค้ดสามารถใช้อินเทอร์เฟซร่วมกันพร้อมกับการนำไปใช้ที่แตกต่างกัน เมื่อสัญญา (contract) ถูกเคารพ
ลายเส้นที่ดำเนินการได้และขอบเขต
class Account:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if amount < 0 or amount > self.balance:
return False
self.balance -= amount
return True
a, b = Account(15), Account(20)
print(a.withdraw(30), a.balance, b.balance)
print(a.withdraw(15), a.balance, b.balance)
ผลลัพธ์ที่คาดหวัง:
False 15 20
True 0 20
การปฏิเสธจะเกิดขึ้นก่อนการเปลี่ยนแปลงสถานะ ด้วยยอดเงินเริ่มต้นที่ไม่ติดลบ การถอนเงินที่ได้รับการตรวจสอบแล้วจะรักษายอดเงินให้ ≥ 0 ชั้นเรียนการสอนขนาดเล็กนี้เปิดให้เห็นคุณสมบัติ (attributes) การออกแบบสำหรับใช้งานจริงต้องควบคุมทุกเส้นทางของการเปลี่ยนแปลงสถานะ ไม่ควรสันนิษฐานว่าเมทโธดเพียงอย่างเดียวจะรักษาการห่อหุ้มข้อมูลได้