เมื่อเร็ว ๆ นี้มีการปฏิวัติต่อต้านซิงเกิลบ้าง แต่มีอะไรผิดปกติกับพวกเขาไหมถ้าพวกเขาไร้สัญชาติ?
ฉันรู้ว่าการพูดคุยที่มากเกินไปและทั้งหมด ... สิ่งนี้ใช้ได้กับทุกสิ่งที่ไม่ใช่แค่ซิงเกิลตัน
เมื่อเร็ว ๆ นี้มีการปฏิวัติต่อต้านซิงเกิลบ้าง แต่มีอะไรผิดปกติกับพวกเขาไหมถ้าพวกเขาไร้สัญชาติ?
ฉันรู้ว่าการพูดคุยที่มากเกินไปและทั้งหมด ... สิ่งนี้ใช้ได้กับทุกสิ่งที่ไม่ใช่แค่ซิงเกิลตัน
คำตอบ:
> Are immutable/stateless singletons bad?
สำหรับรายละเอียดเพิ่มเติมดูthe-onion-architecture
ฉันไม่เห็นเหตุผลอื่น ๆ ว่าทำไมไม่ใช้ Singletons
มันขึ้นอยู่กับการใช้งานเสมอ ผมคิดว่าการปฏิวัติมาจากข้อเท็จจริงที่ว่าโปรแกรมเมอร์ทุกคนได้เรียนรู้รูปแบบนี้เป็นรูปแบบเชิงวัตถุ ส่วนใหญ่ลืมที่จะคิดเกี่ยวกับสถานที่ที่เหมาะสมและไม่
แน่นอนว่านี่เป็นเรื่องจริงสำหรับทุกรูปแบบ เพียงแค่ใช้รูปแบบที่คุณไม่ได้สร้างรหัสที่ดีหรือซอฟต์แวร์ที่ดี
หากคุณมีซิงเกิลไร้สัญชาติทำไมไม่ใช้คลาสที่เสนอวิธีการแบบคงที่เท่านั้น (หรือใช้คลาสแบบคงที่)?
ที่นี่โพสต์บางส่วนเกี่ยวกับตัวแปรทั่วโลกและซิงเกิลตันโดยทั่วไป
ฉันจะไม่เข้มงวดเท่าผู้เขียน แต่เขาแสดงให้เห็นว่าในกรณีส่วนใหญ่ที่คุณคิดว่าคุณต้องการซิงเกิลคุณไม่ต้องการมันจริงๆ
ไม่มีสิ่งใดที่ซิงเกิลไร้สัญชาติไร้รูปสามารถทำสิ่งที่คลาสคงที่ไม่สามารถทำได้
ไม่มีเหตุผลที่จะเพิ่มความซับซ้อนในระดับพิเศษที่ -> Instance () สร้างขึ้นในขณะที่การเรียกธรรมดาไปที่วิธีการแบบสแตติกจะชัดเจนยิ่งขึ้นอนุรักษ์ในแง่ของทรัพยากรและอาจเร็วขึ้น
ไม่ใช่ว่าพวกเขาผิด มันเป็นวิธีที่ดีกว่าที่จะทำ มีหลายสถานการณ์ที่ซิงเกิลปกติ ("stateful") เป็นวิธีที่ถูกต้อง ความชั่วร้ายกับซิงเกิลตันนั้นพวกเขามักถูกทารุณกรรมโดยมีผลลัพธ์ที่ไม่ดีเช่นเดียวกับตัวแปรทั่วโลก แต่มีบางกรณีที่การใช้ซิงเกิลตันนั้นถูกต้อง ไม่มีกรณีดังกล่าวสำหรับคนไร้สัญชาติ
ปัญหาหลักของซิงเกิลตันคือมันซ่อนการพึ่งพาและการมีเพศสัมพันธ์โดยเฉพาะอย่างยิ่งเมื่อใช้ในสถานการณ์ความกังวลข้ามตัด ดูSingletons เป็นผู้โกหกทางพยาธิวิทยาหรือทำไม Singletons เป็น Evilสำหรับการอ่านเพิ่มเติม
จากด้านอื่น ๆ สถานะของซิงเกิลน้อยที่ไม่ถูกทารุณกรรมอาจเป็นประโยชน์และปรับปรุงประสิทธิภาพ ลองพิจารณาตัวอย่าง:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
ที่นี่ StatelessSingleton ทำหน้าที่เป็นการใช้งานเริ่มต้นของอินเทอร์เฟซและใส่ลงในตัวสร้างผู้ใช้ ไม่มีการเชื่อมต่อแบบฮาร์ดโค้ดและการอ้างอิงแบบซ่อน เราไม่สามารถใช้คลาสแบบคงที่เนื่องจากอินเทอร์เฟซพื้นฐาน แต่ไม่มีเหตุผลที่จะสร้างอินสแตนซ์เริ่มต้นมากกว่าหนึ่งอินสแตนซ์ นั่นเป็นเหตุผลที่คนโสดไร้สัญชาติดูเหมือนจะเป็นตัวเลือกที่เหมาะสม
อย่างไรก็ตามบางทีเราควรใช้รูปแบบอื่นสำหรับการใช้งานเริ่มต้น:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
มันกระทบกับประสิทธิภาพด้วยความเคารพ StatelessSingleton แต่ถือเป็นการใช้งานทั่วไปของอินเตอร์เฟส โซลูชันที่คล้ายกันนั้นถูกใช้โดยส่วนต่อประสานIProgress
เพิ่มอีกครั้งเหตุใดจึงอนุญาตให้สร้างการใช้งานพฤติกรรมเริ่มต้นมากกว่าหนึ่งรายการ แต่เราสามารถรวมสอง:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
โดยสรุปแล้วฉันเชื่อว่ามีสถานที่ต่างๆ (เป็นค่าเริ่มต้น) ซึ่งเป็นประโยชน์สำหรับซิงเกิล คำจำกัดความหลักของ Singleton ระบุว่าไม่อนุญาตให้สร้างอินสแตนซ์ของคลาสมากกว่าหนึ่ง มันเป็นพลังงานนิวเคลียร์ สามารถผลิตพลังงานหรือระเบิด มันขึ้นอยู่กับมนุษย์