Bài viết dưới đây sẽ tiếp tục chỉ ra một vài trường hợp có thể gặp phải khi viết code PHP nói chung, Laravel nói riêng. Đó có thể là lỗi logic cơ bản, cách sử dụng hàm chưa hợp lý; Hoặc chỉ đơn giản là những lỗi convention không đáng có.
Ngoài ra, một vài ví dụ liên quan đến JS nói chung và Jquery nói riêng cũng sẽ được đề cập.
Phần 1 của series: Điểm qua một số đoạn code chưa được ổn lắm (Phần 1)
10. Sử dụng nhiều hàm isset()
cùng lúc
Thay vì viết như sau:
1 2 | <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">}</span> |
Có thể gộp thành một lời gọi hàm:
1 2 | <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">}</span> |
11. Thứ tự assertion chưa hợp lý khi viết Unit Test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">class</span> <span class="token class-name">A</span> <span class="token punctuation">{</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">A</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">assertTrue</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">assertInstanceOf</span><span class="token punctuation">(</span>A<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Việc kiểm tra $a
có phải instance của A::class
hay không nên được thực hiện trước khi test các hàm bên trong A::class
.
1 2 3 | <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">assertInstanceOf</span><span class="token punctuation">(</span>A<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">assertTrue</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
12. Dùng hàm isset()
để kiểm tra null với cú pháp truy cập mảng trên IlluminateHttpRequest
(Laravel)
1 2 3 4 5 6 7 8 9 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Request</span> <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'a'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a is exist and not null'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a is not exist or null'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Khi gửi request với a = null
, hàm trên vẫn sẽ hiển thị kết quả bên trong điều kiện if
, thay vì else
.
Để có thể truy cập các thuộc tính của đối tượng Request
với cú pháp dạng mảng, class Request
phải implement interface ArrayAccess.
Do đó, khi sử dụng isset()
trên $request['a']
, thực chất là đang gọi tới hàm offsetExists
được implement trong class IlluminateHttpRequest
.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token comment">/** * Determine if the given offset exists. * * @param string $offset * @return bool */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">offsetExists</span><span class="token punctuation">(</span><span class="token variable">$offset</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> Arr<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">has</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">parameters</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$offset</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> |
Hàm này chỉ kiểm tra sự tồn tại của a
trong request gửi lên, chứ không kiểm tra giá trị của a
có null hay không.
1 2 | <span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'a'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">offsetExists</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a'</span><span class="token punctuation">)</span> <span class="token comment">// true;</span> |
Đây là điểm dễ nhầm lẫn khi hàm isset()
mặc định sẽ kiểm tra một biến có tồn tại và khác null hay không.
Vì vậy, hãy thận trọng khi sử dụng cú pháp array trên đối tượng IlluminateHttpRequest
: if (isset($request['a']) && !is_null($request['a']))
; hoặc chuyển về dạng array khi sử dụng hàm isset()
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Request</span> <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">only</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'a'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a is exist and not null'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'a is not exist or null'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
13. Dùng magic method vô tội vạ
1 2 3 4 5 6 7 8 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Request</span> <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">title</span><span class="token punctuation">;</span> <span class="token variable">$content</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">content</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$title</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$content</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Đoạn code trên là ví dụ điển hình khi muốn truy cập vào một giá trị trong request gửi lên theo key, dựa vào magic method.
Ở ví dụ này, dữ liệu gửi lên là một request chứa thông tin về tiêu đề (title
) và nội dung (content
) của một bài post
nào đó.
Việc truy cập thông qua key title
khá suôn sẻ, mặc dù điều này là không nên và nhiều rủi ro. Có thể tham khảo thêm tại bài viết sau: Laravel requests… DEADLY flexible
Tuy nhiên, vấn đề sẽ thấy rõ hơn khi sử dụng magic method ở dòng code phía dưới:
$content = $request->content;
Dòng code này thay vì lấy giá trị của ô input content
gửi lên, thì nó ưu tiên lấy giá trị của thuộc tính protected $content
trong class Request trước. Do đó, dẫn đến kết quả không mong muốn.
Chính vì vậy, ngoài việc không đặt tên key trong request trùng với những thuộc tính trong class Request, magic method nên hạn chế được sử dụng khi muốn truy cập vào một giá trị trong Laravel request.
14. Đặt tên hàm không bắt đầu bằng một động từ
Một hàm thường đại diện cho một thao tác/chức năng nào đó. Vì vậy nên đặt tên hàm bắt đầu bằng một động từ.
Thay vì
1 2 | <span class="token keyword">function</span> <span class="token function">passwordValidation</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
Có thể cân nhắc đổi thành:
1 2 | <span class="token keyword">function</span> <span class="token function">execPasswordValidation</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
1 2 | <span class="token keyword">function</span> <span class="token function">validatePassword</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
15. Tên của mảng không ở dạng số nhiều
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token variable">$post</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$post</span> <span class="token keyword">as</span> <span class="token variable">$eachPost</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token variable">$commentData</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$commentData</span> <span class="token keyword">as</span> <span class="token variable">$comment</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> |
Convention đặt tên mảng ở dạng số nhiều là không bắt buộc trong một số trường hợp. Tuy nhiên, việc đặt tên ở dạng số nhiều sẽ giúp code trở nên dễ đọc hơn đôi chút.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token variable">$post</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$posts</span> <span class="token keyword">as</span> <span class="token variable">$post</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token variable">$comments</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$comments</span> <span class="token keyword">as</span> <span class="token variable">$comment</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> |
16. Đặt tên route chưa hợp lý
1 2 3 4 5 6 7 8 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prefix</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">group</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'list_of_posts'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Or</span> <span class="token comment">//Route::get('/', '<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>')->name('post_list');</span> <span class="token comment">//Route::get('/', '<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>')->name('list_post');</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/create'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'create_post'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Việc gọi và sử dụng route theo route name tương ứng:
1 2 3 | <span class="token function">route</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.list_of_posts'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.create_post'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Thay vào đó, có thể rút gọn lại:
1 2 3 4 5 6 7 8 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prefix</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">group</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'list'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/create'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'create'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.list'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'posts.create'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
17. Duplicate jQuery selector
1 2 3 | <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#foo'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> $childElements <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#foo'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'.bar'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Ngoài một số trường hợp đặc biệt, thì đoạn code trên chưa được tối ưu lắm khi thực hiện tìm kiếm cùng một element tới hai lần. Có thể cân nhắc sửa lại như sau:
1 2 3 4 | <span class="token keyword">var</span> parentElement <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#foo'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> parentElement<span class="token punctuation">.</span><span class="token function">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> childElements <span class="token operator">=</span> parentElement<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'.bar'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
18. Truy cập thuộc tính có thể không tồn tại trong một đối tượng
1 2 3 4 5 6 7 | $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>errorResponse<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> errors <span class="token operator">=</span> errorResponse<span class="token punctuation">.</span>foo<span class="token punctuation">.</span>bar<span class="token punctuation">;</span> <span class="token function">showBarError</span><span class="token punctuation">(</span>errors<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Ở ví dụ trên, lỗi khi submit Ajax request sẽ được hiển thị thông qua hàm showBarError()
. Hàm này nhận tham số là giá trị của thuộc tính bar
trong đối tượng errorResponse.foo
.
Nếu như response lỗi được trả về là một đối tượng có cấu trúc đúng như trên, việc hiển thị lỗi sẽ không gặp vấn đề gì.
Tuy nhiên, trong thực tế, đặc biệt là những trường hợp xử lý lỗi, dữ liệu trả về có thể bất định và khó lường trước. Do đó, nên cân nhắc bổ sung các câu điều kiện kiểm tra trước khi truy cập thuộc tính của một đối tượng hoặc sử dụng cú pháp try-catch
.
1 2 3 4 5 6 7 8 9 10 11 | $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>errorResponse<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> errors <span class="token operator">=</span> errorResponse<span class="token punctuation">.</span>foo<span class="token punctuation">.</span>bar<span class="token punctuation">;</span> <span class="token function">showError</span><span class="token punctuation">(</span>errors<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">exception</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">showUndefinedError</span><span class="token punctuation">(</span>exception<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
1 2 3 4 5 6 7 8 9 10 11 12 | $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>errorResponse<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> errors <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> foo <span class="token operator">=</span> errorResponse<span class="token punctuation">.</span>foo<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>foo<span class="token punctuation">.</span>bar<span class="token punctuation">)</span> <span class="token punctuation">{</span> errors <span class="token operator">=</span> foo<span class="token punctuation">.</span>bar<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">showBarError</span><span class="token punctuation">(</span>errors<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
19. Khởi tạo giá trị không cần thiết
1 2 3 4 5 6 7 8 | <span class="token keyword">let</span> foo <span class="token operator">=</span> <span class="token string">'bar'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isTrue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'true'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'false'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Việc khởi tạo giá trị ban đầu bar
trong ví dụ trên là không cần thiết vì giá trị của biến foo
luôn bị ghi đè trong câu lệnh if-else
phía dưới. Tùy vào bài toán thực tế, có thể sửa lại theo một trong hai hướng sau:
1 2 3 4 5 6 | <span class="token keyword">let</span> foo <span class="token operator">=</span> <span class="token string">'false'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isTrue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'true'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 | <span class="token keyword">let</span> foo<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isTrue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'true'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'false'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Tuy nhiên, trong một số trường hợp đặc biệt, ví dụ như hàm isTrue()
throw một exception nào đó, việc khởi tạo giá trị ban đầu vẫn trở nên cần thiết.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">let</span> foo <span class="token operator">=</span> <span class="token string">'bar'</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isTrue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'true'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> foo <span class="token operator">=</span> <span class="token string">'false'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">report</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |