ฉันเห็นรูปแบบรหัสต่อไปนี้ทั่วทุกแห่งใน 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
มีอยู่ ในความเป็นจริงนี่อาจเป็นปัญหาที่ร้ายแรงที่สุดที่แสดงโดยรหัสนี้