У меня есть немного кода, который я написал несколько недель назад (цель кода не так важна, как его структура):
if (_image.Empty)
{
//Use the true image size if they haven't specified a custom size
if (_glyphSize.Width > 0)
imageSize.Width = _glyphSize.Width //override
else
imageSize.Width = _image.GetWidth;
if (_glyphSize.Height > 0) then
imageSize.Height = _glyphSize.Height
else
imageSize.Height = _image.GetHeight
}
else
{
//No image, but they can still override it with a custom size
if (_glyphSize.Width > 0) then
imageSize.Width = _glyphSize.Width
else
imageSize.Width = 0;
if (_glyphSize.Height > 0)
imageSize.Height = _glyphSize.Height
else
imageSize.Height := 0;
}
Сегодня вечером я перебирал это, и, когда я чистил его, я понял, что очищенная версия должна быть более лаконичной:
//Figure out the final image width
if (_glyphSize.Width > 0)
imageSize.Width = _glyphSize.Width
else if (not _glyph.Empty)
imageSize.Width = _glyph.GetWidth
else
imageSize.Width = 0;
//Figure out the final image height
if (_glyphSize.Height > 0)
imageSize.Height = _glyphSize.Height
else if (not _glyph.Empty)
imageSize.Height = _glyph.GetHeight
else
imageSize.Height = 0;
Примечание: Я урезал код до чистого логического потока и запутал исходный язык.
В конце концов я взял вложенные if
и перевернул их. Это позволило сократить это. У меня вопрос: как я могу распознать это в будущем?
Каковы контрольные признаки того, что я только что написал некоторый код, который может быть преобразован во что-то более короткое?
Другим примером, приведенным мной несколько недель назад, было что-то вроде проверки прав: пользователь может выполнить действие:
- если у них есть разрешение, они могут это сделать
- если у них нет разрешения, но действует переопределение
Который я изначально закодировал как:
if ((HasPermission || (!HasPermission and OverrideEnabled))
{
...do stuff
}
Логические условия в этом предложении if
казались довольно многословными. я попытался вернуться к своему курсу булевой алгебры, чтобы понять, как его упростить. В конце концов, я смог это сделать, и в итоге я нарисовал таблицу истинности:
Permission Override Result
0 0 0
0 1 1
1 0 1
1 1 1
Что, когда я смотрю на это, является ИЛИ операцией. Итак, мое if
утверждение стало:
if (HasPermission or OverrideEnabled)
{
...
}
Что очевидно и просто. И вот теперь мне интересно, как я не мог увидеть это с самого начала.
Что возвращает меня к моему такому вопросу: какие контрольные знаки можно / нужно искать, чтобы распознать, что некоторый блок кода нуждается в некотором TLC?