บทนำ

การทำงานกับแอปพลิเคชันฐานข้อมูลมักต้องการการเข้าถึงการตั้งค่าทั่วโลกที่ปรับแต่งกฎธุรกิจและฟังก์ชันการทำงานต่างๆ อย่างไรก็ตาม การจัดการการตั้งค่าเหล่านี้อาจเป็นเรื่องท้าทาย โดยเฉพาะอย่างยิ่งสำหรับการทดสอบหน่วยและการรักษาโค้ดให้สะอาด ปัญหาที่พบบ่อยที่นักพัฒนาหลายคนเผชิญคือวิธีการให้การเข้าถึงการตั้งค่าแอปพลิเคชันทั่วโลกอย่างมีประสิทธิภาพ โดยไม่มีข้อบกพร่องของตัวแปรทั่วโลก ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการโดยใช้รูปแบบ Service Locator ของ Martin Fowler ซึ่งช่วยให้นักพัฒนาสามารถลดความยุ่งยากในการเข้าถึงการตั้งค่าทั่วโลกในขณะที่ยังคงให้การทดสอบหน่วยที่มีประสิทธิภาพ

ปัญหา

เมื่อพัฒนาแอปพลิเคชัน นักพัฒนาจะสร้างวัตถุที่ทำงานเฉพาะ เช่น การคำนวณที่ซับซ้อน วัตถุเหล่านี้มักต้องการการเข้าถึงการตั้งค่าทั่วโลกที่เก็บอยู่ในฐานข้อมูล วิธีการแบบดั้งเดิมเกี่ยวข้องกับการส่งผ่านการตั้งค่าในฐานะคุณสมบัติไปยังวัตถุตอนที่สร้างขึ้น โดยทั่วไปจะถูกจัดการโดย Application Controller ในขณะที่นี่อาจเป็นทางเลือกที่ดีกว่าสำหรับการใช้วัตถุ Settings ทั่วไป แต่มันก็มีความท้าทายของตัวเอง:

  • การตั้งค่าที่ซับซ้อน: คุณอาจต้องตั้งค่าคุณสมัติมากมายสำหรับแต่ละวัตถุ ซึ่งอาจกลายเป็นเรื่องยุ่งยาก
  • การแพร่กระจายของคุณสมบัติ: อาจต้องส่งต่อคุณสมัติเพื่อไปยังวัตถุย่อย ทำให้สถาปัตยกรรมซับซ้อนมากขึ้น
  • ความยากในการทดสอบ: การทดสอบหน่วยอาจกลายเป็นเรื่องท้าทายหากวัตถุพึ่งพาตัวแปรและสถานะทั่วโลกมากเกินไป

ทางออก: การใช้รูปแบบ Service Locator

วิธีที่มีประสิทธิภาพในการจัดการกับปัญหานี้คือการใช้รูปแบบ Service Locator ของ Martin Fowler วิธีการนี้ให้แนวทางการเข้าถึงการตั้งค่าทั่วโลกแบบรวมศูนย์ในขณะเดียวกันก็อนุญาตให้ปรับแต่งได้ง่ายในระหว่างการทดสอบ

การตั้งค่า Service Locator

ขั้นตอนที่ 1: สร้างคลาส Service Locator

นี่คือการนำเสนอการทำงานของ Service Locator แบบง่ายใน PHP:

class ServiceLocator {
  private static $soleInstance;
  private $globalSettings;

  public static function load($locator) {
    self::$soleInstance = $locator;
  }

  public static function globalSettings() {
    if (!isset(self::$soleInstance->globalSettings)) {
      self::$soleInstance->setGlobalSettings(new GlobalSettings());
    }
    return self::$soleInstance->globalSettings;
  }
}
  • คำอธิบาย: คลาส Service Locator ช่วยให้คุณจัดการอินสแตนซ์เดียวของการตั้งค่าและมั่นใจว่ามีแหล่งที่มาของความจริงเพียงแหล่งเดียวสำหรับการตั้งค่าแอปพลิเคชันของคุณ

ขั้นตอนที่ 2: เริ่มต้น Service Locator ในโค้ดโปรดักชัน

เพื่อโหลด Service Locator ในสภาพแวดล้อมการผลิต คุณจะเขียน:

ServiceLocator::load(new ServiceLocator());

สิ่งนี้จะเริ่มต้น Service Locator เพื่อให้สามารถดึงการตั้งค่าทั่วไปได้ทั่วทั้งแอปพลิเคชันของคุณ

การจำลองในโค้ดทดสอบ

หนึ่งในข้อได้เปรียบที่สำคัญของรูปแบบ Service Locator คือความยืดหยุ่นสำหรับการทดสอบ ในโค้ดทดสอบของคุณ คุณสามารถแทรกการตั้งค่าโมock ได้ง่าย:

ServiceLocator s = new ServiceLocator();
s->setGlobalSettings(new MockGlobalSettings());
ServiceLocator::load(s);
  • คำอธิบาย: ด้วยการเปลี่ยนเป็น MockGlobalSettings คุณสามารถทดสอบวัตถุของคุณได้โดยไม่ต้องพึ่งพาสถานะฐานข้อมูลจริงหรือส่งผลต่อพฤติกรรมของแอปพลิเคชัน

บทสรุป

โดยการใช้รูปแบบ Service Locator คุณสามารถจัดการการเข้าถึงการตั้งค่าแอปพลิเคชันทั่วโลกในลักษณะที่หลีกเลี่ยงข้อบกพร่องของตัวแปรทั่วโลก วิธีนี้ช่วยให้การตั้งค่าที่จำเป็นสำหรับวัตถุของคุณง่ายขึ้นในขณะที่รักษาช่องทางการทดสอบหน่วยที่สะดวก

รูปแบบ Service Locator ทำหน้าที่เป็นคลังเก็บสำหรับซิงเกิลตัน ช่วยให้คุณสามารถเปลี่ยนแปลงการใช้งานเพื่อวัตถุประสงค์ในการทดสอบในขณะที่ยังคงทำให้โค้ดของคุณสะอาดและเป็นระเบียบ นี่เป็นกลยุทธ์ที่นักพัฒนาหลายคนใช้ได้อย่างประสบความสำเร็จ และสามารถเป็นการเพิ่มเติมที่ยอดเยี่ยมสำหรับสถาปัตยกรรมของแอปพลิเคชันของคุณ

ความคิดชั้นสุดท้าย

การใช้รูปแบบเช่น Service Locator ไม่เพียงแต่ช่วยปรับปรุงความสามารถในการบำรุงรักษาของโค้ดของคุณ แต่ยังช่วยเพิ่มกลยุทธ์ในการทดสอบของคุณ ซึ่งนำไปสู่การสร้างแอปพลิเคชันที่มีความแข็งแกร่งมากขึ้น หากคุณเป็นมือใหม่ในการเขียนโปรแกรม อย่าลังเลที่จะเรียนรู้และทดลองใช้รูปแบบเหล่านี้—มันสามารถช่วยประหยัดเวลาและความพยายามในระยะยาว!