ฉันเห็นรูปแบบรหัสต่อไปนี้ทั่วทุกแห่งใน codebase ของ บริษัท ของฉัน (แอปพลิเคชัน. NET 3.5):
bool Foo(int barID, out Baz bazObject) {
try {
// do stuff
bazObject = someResponseObject;
return true;
}
catch (Exception ex) {
// log error
return false;
}
}
// calling code
BazObject baz = new BazObject();
fooObject.Foo(barID, out baz);
if (baz != null) {
// do stuff with baz
}
ฉันพยายามที่จะคลุมหัวทำไมฉันถึงทำแบบนี้แทนที่จะมีFooวิธีเอา ID และคืนค่าBazวัตถุแทนที่จะคืนค่าที่ไม่ได้ใช้และมีวัตถุจริงเป็นพารามิเตอร์อ้างอิงหรือผลลัพธ์
มีประโยชน์ซ่อนเร้นของรูปแบบการเข้ารหัสนี้ที่ฉันขาดหายไปหรือไม่?
bazการเป็นnullและกลับมาboolเป็นfalseเป็นไม่เทียบเท่า new BazObject()ไม่เคยมีnullดังนั้นถ้าbazObjectมีการปรับปรุงก่อนที่Exceptionจะถูกโยนทิ้งในFooเมื่อfalseถูกส่งกลับจะไม่เป็นbaz nullมันจะช่วยได้อย่างมากถ้าข้อมูลจำเพาะสำหรับFooมีอยู่ ในความเป็นจริงนี่อาจเป็นปัญหาที่ร้ายแรงที่สุดที่แสดงโดยรหัสนี้