c# - TryParse dilemma-Dealing with out parameters -


i never liked out , ref parameters.when see them in action give me feeling messy design.

i thought exception called tryxxx pattern returns boolean function result (whether fine or went wrong) , out parameter real result, until read this article today , made me think if there's better pattern implement kind of methods.

i thought either have function returns more 1 result(or article says tuple)

tuple<exception,t> tryparset(object obj) 

or function accepts callback function success :

void tryparset(object obj,action<t> success) 

the question , 1 better functional design point of view ?

update : rephrase question , want know of these 2 functions more complies functional programming principles , why ?

essentially problem follow functional programming approach should provide return value input value. returning void route isn't way go. need return value can represent success (and hold successful result) , failure (and hold no result).

the closest have returned tuple includes exception. don't have 'infrastructure' deal tuple reliably once you've got it. code scaffolding around repeated.

take @ this library language-ext. deals improving out problem tryparse using implementation of option<t>.

string inp = "123";  // attempts parse value, uses 0 if can't int value1 = parseint(inp).ifnone(0);  // functional alternative above // attempts parse value, uses 0 if can't int value2 = ifnone(parseint(inp), 0);  // attempts parse value , pattern matches result  int value3 = parseint(inp).match(                  some: x  => x * 2,                  none: () => 0                  );  // functional alternative above // attempts parse value , pattern matches result int value4 = match( parseint(inp),                  some: x  => x * 2,                  none: () => 0                  ); 

the library allows check valid:

if( parseint(inp) )     return 1; else     return 0; 

and allows comparisons without extracting value:

if( parseint(inp) == 123 )     return 123; else     return 0; 

as logical operations:

var allvalid = parseint(x) && parseint(y) && parseint(z); var somevalid = parseint(x) || parseint(y) || parseint(z); 

and linq expressions can remove need if-then-else or matching:

var res = x in parseint(inp1)           y in parseint(inp2)           z in parseint(inp3)           select x + y + z; 

it has trygetvalue extensions idictionary, ireadonlydictionary, iimmutabledictionary , iimmutableset instead return option<t> , can used above.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -