วัตถุโดเมนทั่วไปมีคุณสมบัติที่สามารถแสดงโดยชนิดในตัว แต่มีค่าที่ถูกต้องเป็นส่วนย่อยของค่าที่อาจแสดงโดยประเภทนั้น
ในกรณีเหล่านี้ค่าสามารถจัดเก็บได้โดยใช้ชนิดในตัว แต่จำเป็นต้องตรวจสอบให้แน่ใจว่าค่านั้นได้รับการตรวจสอบความถูกต้องเสมอ ณ จุดเริ่มต้นมิฉะนั้นเราอาจสิ้นสุดการทำงานด้วยค่าที่ไม่ถูกต้อง
วิธีหนึ่งในการแก้ไขปัญหานี้คือการเก็บค่าเป็นแบบกำหนดเองstruct
ซึ่งมีprivate readonly
เขตข้อมูลสำรองเดียวของชนิดในตัวและตัวสร้างที่ตรวจสอบความถูกต้องของค่าที่ให้มา จากนั้นเราสามารถมั่นใจได้ว่าใช้ค่าที่ตรวจสอบได้โดยใช้struct
ประเภทนี้เสมอ
นอกจากนี้เรายังสามารถให้บริการตัวดำเนินการส่งจากและไปยังชนิดในตัวเพื่อให้ค่าสามารถเข้าและออกจากประเภทพื้นฐานได้อย่างราบรื่น
ยกตัวอย่างสถานการณ์ที่เราต้องการแสดงชื่อของวัตถุโดเมนและค่าที่ถูกต้องคือสตริงใด ๆ ที่มีความยาวระหว่าง 1 ถึง 255 อักขระ เราสามารถนำเสนอสิ่งนี้โดยใช้โครงสร้างต่อไปนี้:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{
return x.ToString();
}
public static explicit operator ValidatedName(string x)
{
if (IsValid(x))
{
return new ValidatedName(x);
}
throw new InvalidCastException();
}
public static bool operator ==(ValidatedName x, ValidatedName y)
{
return x.Equals(y);
}
public static bool operator !=(ValidatedName x, ValidatedName y)
{
return !x.Equals(y);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public override string ToString()
{
return _value;
}
}
ตัวอย่างที่แสดงให้เห็นประstring
โยนเป็นimplicit
เช่นนี้ไม่สามารถล้มเหลว แต่ from- string
หล่อเป็นexplicit
เช่นนี้จะโยนสำหรับค่าที่ไม่ถูกต้อง แต่แน่นอนทั้งสองอาจจะเป็นอย่างใดอย่างหนึ่งหรือimplicit
explicit
โปรดทราบด้วยว่าเราสามารถเริ่มต้นโครงสร้างนี้โดยใช้วิธีการร่ายstring
เท่านั้น แต่สามารถทดสอบได้ว่าการร่ายนั้นจะล้มเหลวล่วงหน้าโดยใช้IsValid
static
วิธีการนี้หรือไม่
นี่น่าจะเป็นรูปแบบที่ดีในการบังคับใช้การตรวจสอบความถูกต้องของค่าโดเมนซึ่งสามารถแทนด้วยประเภทแบบง่าย ๆ แต่ฉันไม่เห็นมันใช้บ่อยหรือแนะนำและฉันสนใจว่าทำไม
ดังนั้นคำถามของฉันคืออะไรคุณเห็นว่าเป็นข้อดีและข้อเสียของการใช้รูปแบบนี้และทำไม?
หากคุณรู้สึกว่านี่เป็นรูปแบบที่ไม่ดีฉันอยากจะเข้าใจว่าทำไมและสิ่งที่คุณรู้สึกว่าเป็นทางเลือกที่ดีที่สุด
NBตอนแรกฉันถามคำถามนี้เกี่ยวกับ Stack Overflowแต่มันถูกพักไว้เป็นหลักโดยอิงตามความคิดเห็น (ส่วนตัวที่เป็นตัวของตัวเอง) - หวังว่ามันจะสนุกกับความสำเร็จที่นี่
ด้านบนเป็นข้อความต้นฉบับด้านล่างคิดเพิ่มเติมอีกสองสามส่วนในการตอบสนองต่อคำตอบที่ได้รับก่อนที่จะถูกระงับ:
- หนึ่งในประเด็นสำคัญที่ทำโดยคำตอบคือประมาณจำนวนรหัสแผ่นหม้อน้ำที่จำเป็นสำหรับรูปแบบข้างต้นโดยเฉพาะอย่างยิ่งเมื่อต้องมีหลายประเภทดังกล่าว อย่างไรก็ตามในการป้องกันรูปแบบนี้อาจเป็นไปโดยอัตโนมัติส่วนใหญ่โดยใช้แม่แบบและสำหรับฉันแล้วมันไม่ได้เลวร้ายไปกว่านี้ แต่นั่นเป็นเพียงความคิดเห็นของฉัน
- จากมุมมองแนวคิดแล้วมันไม่แปลกเลยหรือที่เมื่อทำงานกับภาษาที่พิมพ์อย่างรุนแรงเช่น C # เพื่อใช้หลักการที่พิมพ์อย่างรุนแรงกับค่าคอมโพสิตแทนที่จะขยายไปยังค่าที่สามารถแสดงด้วยอินสแตนซ์ของ ชนิดในตัว?