Conditions | 1 |
Paths | 2304 |
Total Lines | 141 |
Lines | 0 |
Ratio | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | define(['underscore', 'asap'], function(_, asap) { |
||
2 | 'use strict'; |
||
3 | |||
4 | _.mixin({ |
||
5 | nl2br: function(str) { |
||
6 | var breakTag = '<br />'; |
||
7 | return String(str).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2'); |
||
8 | }, |
||
9 | |||
10 | trunc: function(str, maxLength, useWordBoundary, hellip) { |
||
11 | hellip = hellip || '…'; |
||
12 | var toLong = str.length > maxLength; |
||
13 | str = toLong ? str.substr(0, maxLength - 1) : str; |
||
14 | var lastSpace = str.lastIndexOf(' '); |
||
15 | str = useWordBoundary && toLong && lastSpace > 0 ? str.substr(0, lastSpace) : str; |
||
16 | return toLong ? str + hellip : str; |
||
17 | }, |
||
18 | |||
19 | isMobile: function() { |
||
20 | var elem = document.getElementsByTagName('body')[0]; |
||
21 | return elem && (' ' + elem.className + ' ') |
||
22 | .replace(/[\t\r\n\f]/g, ' ') |
||
23 | .indexOf(' mobile-version ') !== -1; |
||
24 | }, |
||
25 | |||
26 | isDesktop: function() { |
||
27 | return !this.isMobile(); |
||
28 | }, |
||
29 | |||
30 | trim: function(text) { |
||
31 | return text.replace(/^\s*/, '').replace(/\s*$/, ''); |
||
32 | }, |
||
33 | |||
34 | capitalize: function(text) { |
||
35 | return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(); |
||
36 | }, |
||
37 | |||
38 | /** |
||
39 | * Compares two arrays if they have the same set of elements |
||
40 | * |
||
41 | * @param firstArray {Array} |
||
42 | * @param secondArray {Array} |
||
43 | * @returns {boolean} |
||
44 | */ |
||
45 | haveEqualSet: function(firstArray, secondArray) { |
||
46 | return firstArray.length === secondArray.length && _.difference(firstArray, secondArray).length === 0; |
||
47 | }, |
||
48 | |||
49 | /** |
||
50 | * The Number.isSafeInteger() method determines whether the provided value is a number that is a safe integer. |
||
51 | * @param number {testValue} |
||
52 | * @return {boolean} |
||
53 | */ |
||
54 | isSafeInteger: function(number) { |
||
55 | // 0. Try use native API |
||
56 | if (Number.isSafeInteger) { |
||
57 | return Number.isSafeInteger(number); |
||
58 | } |
||
59 | |||
60 | // 1. If Type(number) is not Number, return false. |
||
61 | if (typeof(number) !== 'number') { |
||
62 | return false; |
||
63 | } |
||
64 | // 2. If number is NaN, +∞, or -∞, return false. |
||
65 | if (this.isNaN(number) || number === Infinity || number === -Infinity) { |
||
66 | return false; |
||
67 | } |
||
68 | // 3. Let integer. |
||
69 | var integer = parseInt(number); |
||
70 | // 4. If integer is not equal to number, return false. |
||
71 | if (integer !== number) { |
||
72 | return false; |
||
73 | } |
||
74 | // 5. If abs(integer) ≤ 2^53-1, return true. |
||
75 | if (Math.abs(integer) <= (Math.pow(2, 53) - 1)) { |
||
76 | return true; |
||
77 | } |
||
78 | // 6. Otherwise, return false. |
||
79 | return false; |
||
80 | } |
||
81 | }); |
||
82 | |||
83 | _.templateSettings.innerTempStart = '<%#'; |
||
84 | _.templateSettings.innerTempEnd = '#%>'; |
||
85 | |||
86 | _.template = _.wrap(_.template, function(original, text, settings, oldSettings) { |
||
87 | if (!settings && oldSettings) { |
||
88 | settings = oldSettings; |
||
89 | } |
||
90 | settings = _.defaults({}, settings, _.templateSettings); |
||
91 | |||
92 | var regexStart = new RegExp('^' + settings.innerTempStart); |
||
93 | var regexEnd = new RegExp(settings.innerTempEnd + '$'); |
||
94 | var evaluateStart = '(' + _.templateSettings.innerTempStart + ')'; |
||
95 | var evaluateEnd = '|(' + _.templateSettings.innerTempEnd + ')'; |
||
96 | |||
97 | var innerTempEvaluate = new RegExp(evaluateStart + evaluateEnd, 'g'); |
||
98 | |||
99 | text = _.trim(text).replace(regexStart, '').replace(regexEnd, ''); |
||
100 | |||
101 | var escapedText = text; |
||
102 | |||
103 | var levelOffsets = {}; |
||
104 | var level = 0; |
||
105 | var offsetDelta = 0; |
||
106 | |||
107 | var escapeText = function(text) { |
||
108 | return text.replace(/\<\;\%/g, '&lt;%').replace(/<%/g, '<%').replace(/%>/g, '%>'); |
||
109 | }; |
||
110 | |||
111 | text.replace(innerTempEvaluate, function(match, open, close, offset) { |
||
112 | offset += offsetDelta; |
||
113 | if (open) { |
||
114 | level++; |
||
115 | levelOffsets[level] = offset; |
||
116 | } |
||
117 | if (close && level) { |
||
118 | var start = escapedText.slice(0, levelOffsets[level]); |
||
119 | var end = escapedText.slice(offset + close.length); |
||
120 | var escape = escapedText.slice(levelOffsets[level] + settings.innerTempStart.length, offset); |
||
121 | var newEscape = escapeText(escape); |
||
122 | |||
123 | offsetDelta += newEscape.length - escape.length - (settings.innerTempEnd.length * 2); |
||
124 | escapedText = start + newEscape + end; |
||
125 | level--; |
||
126 | } |
||
127 | |||
128 | // Adobe VMs need the match returned to produce the correct offset. |
||
129 | return match; |
||
130 | }); |
||
131 | arguments[1] = _.trim(escapedText); |
||
132 | |||
133 | var func = original.apply(this, _.rest(arguments)); |
||
134 | func._source = arguments[1]; |
||
135 | return func; |
||
136 | }); |
||
137 | |||
138 | _.defer = asap; |
||
139 | |||
140 | return _; |
||
141 | }); |
||
142 |