SOLID — จากศูนย์ถึงมันฝรั่ง 3

Mar 31 2023
เกี่ยวกับ Liskov Substitution Principle (LSP) วันนี้ผมจะอธิบายเกี่ยวกับ Liskov Substitution Principle (LSP) ต่อในบทความนี้ คุณสามารถอ่านบทความก่อนหน้าของผมเกี่ยวกับ Single-responsibility Principle และ Open/Closed Principle (OCP) ได้ที่นั่น ก่อนที่จะไปอธิบายรายละเอียดเกี่ยวกับ LSP เราควรรู้ว่า LSP มีประโยชน์อย่างไรในงานประจำวันของเรา

เกี่ยวกับหลักการทดแทนลิสคอฟ (LSP)

วันนี้ผมจะอธิบายเกี่ยวกับLiskov Substitution Principle (LSP)ต่อในบทความนี้ คุณสามารถอ่านบทความก่อนหน้าของผมเกี่ยวกับSingle -responsibility Principle และOpen/Closed Principle (OCP)ได้ที่นั่น

ก่อนที่จะไปอธิบายรายละเอียดเกี่ยวกับLSPเราควรรู้ว่า LSP มีประโยชน์อย่างไรในงานประจำวันของเรา LSP ช่วยให้เราจำลองลำดับชั้นการสืบทอดที่ดี ช่วยให้เราป้องกันลำดับชั้นของโมเดลที่ไม่เป็นไปตามหลักการเปิด/ปิด รูปแบบการสืบทอดใดๆ ที่เป็นไปตามหลักการทดแทนของ Liskovจะเป็นไปตามหลักการเปิด/ปิด โดยปริยาย

ข้ามไปที่การเขียนโค้ด หากคุณไม่เข้าใจเกี่ยวกับ kotlin ก็ไม่ต้องกังวลLSPสามารถนำไปใช้ในภาษาใดก็ได้ ดังนั้นคุณสามารถลองใช้ภาษาที่คุณชื่นชอบได้

เรามีStudentชั้นเรียนที่มีcalculateGPAวิธีการคำนวณเกรดเฉลี่ยตามผลการเรียนของนักเรียน:

open class Student(val grades: List<Double>) {
    open fun calculateGPA(): Double {
        // calculate the GPA based on the grades
    }
}

class HonorsStudent(grades: List<Double>) : Student(grades) {
    override fun calculateGPA(): Double {
        // calculate the GPA based on a different set of rules for honors students
    }
}

เพื่อให้เป็นไปตามLSPเราสามารถปรับเปลี่ยนการออกแบบคลาสได้ วิธีหนึ่งในการทำเช่นนี้คือการสร้างอินเทอร์เฟซใหม่ที่เรียกGPAซึ่งมีcalculateวิธีการ:

interface GPA {
    fun calculate(): Double
}

open class Student(val grades: List<Double>) : GPA {
    override fun calculate(): Double {
        // calculate the GPA based on the grades
    }
}

class HonorsStudent(grades: List<Double>) : GPA {
    override fun calculate(): Double {
        // calculate the GPA based on a different set of rules for honors students
    }
}

สิ่งนี้เป็นไปตามหลักการการแทนที่ของ Liskovเนื่องจากโค้ดใดๆ ที่คาดว่าออบเจกต์ประเภทหนึ่งGPAสามารถผ่านได้ทั้งStudentอ็อบเจ็กต์หรือHonorsStudentอ็อบเจ็กต์ และพฤติกรรมของcalculateเมธอดจะสอดคล้องกันในอ็อบเจ็กต์ทั้งสอง

ด้วยการแยกcalculateGPAลักษณะการทำงานออกเป็นอินเทอร์เฟซแยกต่างหาก เรามั่นใจว่าคลาสย่อยใดๆ ที่ใช้อินเทอร์เฟซนั้นทำงานสอดคล้องกันกับออบเจกต์อื่นๆ ของประเภทอินเทอร์เฟซนั้น

ขอบคุณที่สละเวลาอ่านบทความนี้ ฉันหวังว่างานเขียนของฉันจะให้ข้อมูลและกระตุ้นความคิด