Introduce Explaining Variable
More known as Extract Variable
You have a complicated expression.
Put the result of the expression, or parts of the expression, in a temporary variable with a name that explains the purpose.
Example 1: The code before
1: if (platform.ToUpper().IndexOf("MAC") > -1 &&
2: browser.ToUpper().IndexOf("IE") > -1 &&
3: WasInitialized() && resize > 0)
4: {
5: // do something
6: }
Example 1: The code after
1: bool isMacOs = platform.ToUpper().IndexOf("MAC") > -1;
2: bool isIEBrowser = browser.ToUpper().IndexOf("IE") > -1;
3: bool wasResized = resize > 0;
4:
5: if (isMacOs && isIEBrowser && WasInitialized() && wasResized)
6: {
7: // do something
8: }
Example 2: The code before
1: public double Price()
2: {
3: // price is base price - quantity discount + shipping
4: return _quantity * _itemPrice -
5: Math.Max(0, _quantity - 500) * _itemPrice * 0.05 +
6: Math.Min(_quantity * _itemPrice * 0.1, 100);
7: }
Example 2: The code after
1: public double Price()
2: {
3: var basePrice = _quantity * _itemPrice;
4: var quantityDiscount = Math.Max(0, _quantity - 500) * _itemPrice * 0.05;
5: var shipping = Math.Min(_quantity * _itemPrice * 0.1, 100);
6: return basePrice - quantityDiscount + shipping;
7: }
Example 2: The code after (using Extract Method)
1: public double Price()
2: {
3: return BasePrice() - QuantityDiscount() + Shipping();
4: }
5:
6: private int BasePrice()
7: {
8: return _quantity * _itemPrice;
9: }
10:
11: private double QuantityDiscount()
12: {
13: return Math.Max(0, _quantity - 500) * _itemPrice * 0.05;
14: }
15:
16: private double Shipping()
17: {
18: return Math.Min(_quantity * _itemPrice * 0.1, 100);
19: }
Example 2: The code after (using Expression Body Definitions)
If you're using C# 6 or above you can use Expression Body Definitions to shorten your methods.
1: public double Price()
2: => BasePrice - QuantityDiscount + Shipping;
3:
4: private int BasePrice
5: => _quantity * _itemPrice;
6:
7: private double QuantityDiscount
8: => Math.Max(0, _quantity - 500) * _itemPrice * 0.05;
9:
10: private double Shipping
11: => Math.Min(_quantity * _itemPrice * 0.1, 100);
Motivation
Expressions can become very complex and hard to read. In such situations temporary variables can be helpful to break down the expression into something more manageable.
Introduce Explaining Variable is particularly valuable with conditional logic in which it is useful to take each clause of a condition and explain what the condition means with a well-named temp.
The source code
Personal thoughts
An easy-to-do refactoring that can do so much for the code readability. Low hanging fruit!
Inga kommentarer:
Skicka en kommentar