patternphpMinor
Reducing complexity of method
Viewed 0 times
reducingcomplexitymethod
Problem
I'm trying to reduce the complexity of some methods, and I'm not exactly sure what approach to take. I'm currently building a PHP wrapper for a REST API, and the main problematic class is here:
https://github.com/petrepatrasc/blizzard-starcraft-api/blob/master/Service/ApiService.php
In short, since data retrieved from the API is not always consistent, I have to do this:
What would be a better way of handling the problem, so that the method complexity goes down? I suppose that I can try and catch an "undefined index exception", but I kind of wanted to see if there's something a bit more elegant that I can use.
https://github.com/petrepatrasc/blizzard-starcraft-api/blob/master/Service/ApiService.php
In short, since data retrieved from the API is not always consistent, I have to do this:
$portrait = new Portrait();
$portrait->setXCoordinate(isset($apiData['portrait']['x']) ? $apiData['portrait']['x'] : null)
->setYCoordinate(isset($apiData['portrait']['y']) ? $apiData['portrait']['y'] : null)
->setWidth(isset($apiData['portrait']['w']) ? $apiData['portrait']['w'] : null)
->setHeight(isset($apiData['portrait']['h']) ? $apiData['portrait']['h'] : null)
->setOffset(isset($apiData['portrait']['offset']) ? $apiData['portrait']['offset'] : null)
->setUrl(isset($apiData['portrait']['url']) ? $apiData['portrait']['url'] : null);
return $portrait;What would be a better way of handling the problem, so that the method complexity goes down? I suppose that I can try and catch an "undefined index exception", but I kind of wanted to see if there's something a bit more elegant that I can use.
Solution
You could remove some duplication with a
getPortraitValue function:function getPortraitValue($apiData, $key) {
$portrait = $apiData['portrait'];
if (isset($portrait[$key])) {
return $portrait[$key];
}
return null;
}
$portrait = new Portrait();
$portrait->setXCoordinate(getPortraitValue($apiData, 'x')
->setYCoordinate(getPortraitValue($apiData, 'y'))
->setWidth(getPortraitValue($apiData, 'w'))
->setHeight(getPortraitValue($apiData, 'h'))
->setOffset(getPortraitValue($apiData, 'offset')
->setUrl(getPortraitValue($apiData, 'url');
return $portrait;Code Snippets
function getPortraitValue($apiData, $key) {
$portrait = $apiData['portrait'];
if (isset($portrait[$key])) {
return $portrait[$key];
}
return null;
}
$portrait = new Portrait();
$portrait->setXCoordinate(getPortraitValue($apiData, 'x')
->setYCoordinate(getPortraitValue($apiData, 'y'))
->setWidth(getPortraitValue($apiData, 'w'))
->setHeight(getPortraitValue($apiData, 'h'))
->setOffset(getPortraitValue($apiData, 'offset')
->setUrl(getPortraitValue($apiData, 'url');
return $portrait;Context
StackExchange Code Review Q#43058, answer score: 4
Revisions (0)
No revisions yet.