W bazie danych mojej firmy (aplikacja .NET 3.5) widzę następujący wzór kodu:
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
}
Staram się owijać wokół głowy, dlaczego miałbyś to zrobić zamiast tego, że Foo
metoda po prostu bierze identyfikator i zwraca Baz
obiekt, zamiast zwracać wartość, która nie jest używana, a faktycznym obiektem jest parametr referencyjny lub wyjściowy.
Czy jest jakaś ukryta zaleta tego stylu kodowania, którego mi brakuje?
baz
jest null
i zwracany bool
istotą false
są nie równoważne. new BazObject()
jest nigdy null
, więc jeśli nie bazObject
zostanie zaktualizowany przed Exception
wrzuceniem Foo
, false
to kiedy zostanie zwrócony baz
, nigdy nie będzie null
. To pomaga ogromnie jeśli specyfikacja dla Foo
były dostępne. W rzeczywistości jest to prawdopodobnie najpoważniejszy problem związany z tym kodem.