ฉันจะสมมติว่าคุณต้องการการตรวจสอบสำหรับความเพียร
ไม่เพียงแค่ดู แต่รุ่นไม่ควรตรวจสอบความถูกต้อง ในระหว่างวันของฉันใน IT ฉันรู้DDDเป็นหนึ่งในวิธีการเพื่อให้แน่ใจว่าคุณกำลังทำสิ่งต่าง ๆ อย่างถูกต้องเช่น ชั้นเรียนมีความรับผิดชอบในสิ่งที่ควรจะเป็นจริง
เมื่อติดตามการออกแบบที่ขับเคลื่อนด้วยโดเมนโมเดลของคุณจะมีตรรกะทางธุรกิจของคุณและนั่นก็คือ แต่พวกเขาไม่ได้รวมการตรวจสอบทำไมไม่?
สมมติว่าคุณใช้งานอยู่แล้วจนถึงData Mapper
แทนที่จะใช้งานActive Record
เลเยอร์โดเมนของคุณต่อไป แต่ถึงกระนั้นคุณต้องการให้รุ่นได้รับการตรวจสอบความถูกต้องดังนั้นคุณจึงเพิ่มการตรวจสอบความถูกต้องในโมเดลของคุณ
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
ตรรกะการตรวจสอบช่วยให้มั่นใจว่าคุณสามารถแทรกรูปแบบลงในฐานข้อมูล MySQL ของคุณได้อย่างถูกต้อง ... สองสามเดือนผ่านไปและคุณตัดสินใจว่าคุณต้องการจัดเก็บแบบจำลองของคุณในฐานข้อมูล noSQL เช่นกันฐานข้อมูลซึ่งต้องการกฎการตรวจสอบที่แตกต่างกัน
แต่คุณมีปัญหาคุณมีวิธีการตรวจสอบเพียงวิธีเดียว แต่ต้องตรวจสอบModel
ใน 2 วิธี
แบบจำลองควรทำในสิ่งที่พวกเขาต้องรับผิดชอบพวกเขาควรดูแลตรรกะทางธุรกิจของคุณและทำมันให้ดี การตรวจสอบจะเชื่อมโยงกับการติดตาไม่ตรรกะทางธุรกิจด้วยเหตุนี้การตรวจสอบไม่ได้อยู่ในรูปแบบ
คุณควรสร้างValidator
s แทนซึ่งจะใช้โมเดลเพื่อตรวจสอบความถูกต้องในคอนสตรัคเตอร์ของพวกเขาเป็นพารามิเตอร์ใช้Validation
อินเตอร์เฟสและใช้Validator
s เหล่านี้เพื่อตรวจสอบวัตถุของคุณ
interface Validation
{
public function validate();
}
class MySQLConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model here
}
}
class RedisConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model with different set of rules here
}
}
หากในอนาคตตัดสินใจว่าคุณต้องการเพิ่มวิธีการตรวจสอบอื่นสำหรับเลเยอร์การเก็บข้อมูลอื่น (เนื่องจากคุณตัดสินใจว่า Redis และ MySQL ไม่ใช่หนทางที่จะไปอีกต่อไป) คุณจะสร้างวิธีอื่นValidator
และใช้IoC
คอนเทนเนอร์ของคุณเพื่อให้ได้อินสแตนซ์ที่เหมาะสม config
บน