SOLID Principles คืออะไร

SOLID คือ หลักการในการออกแบบซอฟต์แวร์ที่ดี ที่ช่วยให้โครงสร้างของโปรแกรมที่เขียนนั้นมีความชัดเจนและดูแลรักษาได้ง่ายในอนาคต SOLID ย่อมาจาก

  • S = Single Responsibility Principle (SRP)
  • O = Open-Closed Principle (OCP)
  • L = Liskov Substitution Principle (LSP)
  • I = Interface Segregation Principle (ISP)
  • D = Dependency Inversion Principle (DIP)

SRP คือ code ใน class ใดๆควรจะมีหน้าที่ทำงานเพียงแค่อย่างเดียวเท่านั้น ตัวอย่างเช่น class Customer ไม่ควรต้องสนใจว่าถ้าเกิด error จะต้องเก็บ log ไว้ที่ไหนใช้ Logger อะไร แยกการ log ไปไว้ใน class Logger แทน

OCP คือ Open for extension, closed for modification การทำงานที่ถูกกำหนดไว้แล้วและถูกต้องอยู่แล้ว ไม่ควรมีการแก้ไข แต่ควรสร้าง class ใหม่ที่ทำงานในส่วนเพิ่มเติมได้แทน ตัวอย่างเช่น class Customer ที่จะได้ส่วนลดตวามประเภทลูกค้า ไม่ควรใช้ if-clause หรือ switch เพื่อรองรับลูกค้ากลุ่มใหม่ใน class เดิม แต่ควร extend เพราะคุณสมบัตินี้ผูกติดกับลูกค้า กรณีนี้คือแยกเป็น SilverCustomer กับ GoldCustomer แล้ว Implement GetDiscount() คนละอย่างกันแทน

LSP คือ ใน parent-child inheritance เราต้องสามารถสับเปลี่ยน child ได้โดยไม่กระทบกับ business logic ไม่ควรยัดเยียดความเป็น inheritance เพียงเพราะชื่อ method เหมือนกัน ตัวอย่างในบทความจะเห็นว่าเราเพิ่ม class Enquiry ที่ไม่เกี่ยวกับว่าเป็นลูกค้าหรือไม่ แล้วเลือก throw Exception() กับ method ที่ไม่เกี่ยวข้อง ถ้าเรานำ Collection ของ Customer ไปทำงาน ไม่ควรจะต้องมาสนใจว่าจะเกิด Exception หรือไม่แล้ว

ISP คือ เมื่อต้องการเพิ่มความสามารถให้กับ interface ที่มีกระทบกับ class จำนวนน้อย ให้ขยาย interface นั้นออกเพื่อไม่ให้กระทบกับ class เดิมที่ไม่มีความจำเป็นต้องเพิ่มความสามารถใหม่นี้ เช่น interface IDatabase มี method Add() ซึ่งใช้กับ class เก่า แต่พอมี class ใหม่ที่จะต้องใช้ Read() ก็ให้ สร้าง interface ใหม่ IDatabaseV2 ซึ่ง extends จาก IDatabase อีกทีแทน

DIP คือ เปลี่ยนให้การเลือกใช้งาน class ขึ้นอยู่กับผู้เรียกใช้ แทนที่จะกำหนดลงไปตายตัว จากตัวอย่าง Logger ด้านบน class ที่ใช้งานควรจะให้คนเรียกใช้เป็นคนเลือกเองว่าจะใช้ Logger แบบไหน จะ FileLogger หรือจะ EventViewerLogger ก็ให้ส่งเข้ามา หรือที่เคยได้ยินคำว่า Dependency Injection, Inversion of Control (IoC) ง่ายที่สุดคือส่งเข้ามาใน constructor โดยประกาศรับ Interface ไว้ เช่น

class Customer {
  private ILogger logger;

  public Customer(ILogger logger) {
    this.logger = logger;
  }

  public Add() {
    ...
    logger.log(...);
    ...
  }
}

เพื่อให้เข้าใจได้ดีขึ้น ดูตัวอย่างในภาษา C# ได้ตาม link ด้านล่างได้เลย

ที่มา: https://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp

สแลช (slash)

Leave a comment