@@ -312,8 +312,8 @@ addMonthToDate(1, date);
312
312
```
313
313
** [ ⬆ Về đầu trang] ( #mục-lục ) **
314
314
315
- ### Chức năng chỉ nên có 1 lớp abstract
316
- Khi bạn có nhiều hơn 1 lớp abstract của chức năng thì thông thường làm rất nhiều.
315
+ ### Chức năng chỉ nên có 1 lớp trừu tượng
316
+ Khi bạn có nhiều hơn 1 lớp trừu tượng của chức năng thì thông thường làm rất nhiều.
317
317
Chia nhỏ các chức năng thì việc tái sử dụng và testing sẽ dễ dàng hơn.
318
318
319
319
** Không tốt:**
@@ -624,26 +624,21 @@ const addItemToCart = (cart, item) => {
624
624
thư viện khác và người dùng API của bạn có thể không phải là người khôn ngoan cho đến khi
625
625
họ nhận ra được những ngoại lệ trong sản phẩm. Ví dụ: bạn sẽ làm gì nếu bạn muốn mở rộng
626
626
mảng JavaScript native để có một phương thức ` diff ` mà có thể đưa ra những
627
- sự khác nhau giữa hai mảng?
628
- Polluting globals is a bad practice in JavaScript because you could clash with another
629
- library and the user of your API would be none-the-wiser until they get an
630
- exception in production. Let's think about an example: what if you wanted to
631
- extend JavaScript's native Array method to have a ` diff ` method that could
632
- show the difference between two arrays? You could write your new function
633
- to the ` Array.prototype ` , but it could clash with another library that tried
634
- to do the same thing. What if that other library was just using ` diff ` to find
635
- the difference between the first and last elements of an array? This is why it
636
- would be much better to just use ES2015/ES6 classes and simply extend the ` Array ` global.
627
+ sự khác nhau giữa hai mảng? Bạn có thể viết một hàm mới với ` Array.prototype ` ,
628
+ nhưng nó có thể xung đột với một thư viện khác mà đã cố gắng để làm những điều tương tự.
629
+ Điều gì xảy ra nếu một thư viện chỉ sử dụng ` diff ` để tìm sự khác biệt giữa phần tử
630
+ đầu tiên và cuối cùng của một mảng? Đó là lý do tại sao nó sẽ là tốt hơn khi
631
+ chỉ sử dụng cá lớp ES2015/ES6 và đơn giản mở rộng ` Array ` toàn cục.
637
632
638
- ** Bad :**
633
+ ** Không tốt :**
639
634
``` javascript
640
635
Array .prototype .diff = function diff (comparisonArray ) {
641
636
const hash = new Set (comparisonArray);
642
637
return this .filter (elem => ! hash .has (elem));
643
638
};
644
639
```
645
640
646
- ** Good :**
641
+ ** Tốt :**
647
642
``` javascript
648
643
class SuperArray extends Array {
649
644
diff (comparisonArray ) {
@@ -652,14 +647,14 @@ class SuperArray extends Array {
652
647
}
653
648
}
654
649
```
655
- ** [ ⬆ back to top ] ( #mục-lục ) **
650
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
656
651
657
- ### Favor functional programming over imperative programming
658
- JavaScript isn't a functional language in the way that Haskell is, but it has
659
- a functional flavor to it. Functional languages are cleaner and easier to test.
660
- Favor this style of programming when you can .
652
+ ### Ủng hộ lập trình chức năng trên lập trình không bắt buộc
653
+ JavaScript không phải là ngôn ngữ chức năng trong cái của Haskell, nhưng nó có
654
+ đặc trưng chức năng của nó. Những ngôn ngữ chức năng thì gọn gàng hơn và dễ dàng hơn
655
+ để kiểm thử. Hãy ủng hộ phong cách lập trình khi bạn có thể .
661
656
662
- ** Bad :**
657
+ ** Không tốt :**
663
658
``` javascript
664
659
const programmerOutput = [
665
660
{
@@ -684,7 +679,7 @@ for (let i = 0; i < programmerOutput.length; i++) {
684
679
}
685
680
```
686
681
687
- ** Good :**
682
+ ** Tốt :**
688
683
``` javascript
689
684
const programmerOutput = [
690
685
{
@@ -708,18 +703,18 @@ const totalOutput = programmerOutput
708
703
.map ((programmer ) => programmer .linesOfCode )
709
704
.reduce ((acc , linesOfCode ) => acc + linesOfCode, INITIAL_VALUE );
710
705
```
711
- ** [ ⬆ back to top ] ( #mục-lục ) **
706
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
712
707
713
- ### Encapsulate conditionals
708
+ ### Đóng gói điều kiện
714
709
715
- ** Bad :**
710
+ ** Không tốt :**
716
711
``` javascript
717
712
if (fsm .state === ' fetching' && isEmpty (listNode)) {
718
713
// ...
719
714
}
720
715
```
721
716
722
- ** Good :**
717
+ ** Tốt :**
723
718
``` javascript
724
719
function shouldShowSpinner (fsm , listNode ) {
725
720
return fsm .state === ' fetching' && isEmpty (listNode);
@@ -729,11 +724,11 @@ if (shouldShowSpinner(fsmInstance, listNodeInstance)) {
729
724
// ...
730
725
}
731
726
```
732
- ** [ ⬆ back to top ] ( #mục-lục ) **
727
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
733
728
734
- ### Avoid negative conditionals
729
+ ### Tránh điều kiện tiêu cực
735
730
736
- ** Bad :**
731
+ ** Không tốt :**
737
732
``` javascript
738
733
function isDOMNodeNotPresent (node ) {
739
734
// ...
@@ -744,7 +739,7 @@ if (!isDOMNodeNotPresent(node)) {
744
739
}
745
740
```
746
741
747
- ** Good :**
742
+ ** Tốt :**
748
743
``` javascript
749
744
function isDOMNodePresent (node ) {
750
745
// ...
@@ -754,19 +749,19 @@ if (isDOMNodePresent(node)) {
754
749
// ...
755
750
}
756
751
```
757
- ** [ ⬆ back to top ] ( #mục-lục ) **
752
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
758
753
759
- ### Avoid conditionals
760
- This seems like an impossible task. Upon first hearing this, most people say ,
761
- "how am I supposed to do anything without an ` if ` statement?" The answer is that
762
- you can use polymorphism to achieve the same task in many cases. The second
763
- question is usually, "well that's great but why would I want to do that?" The
764
- answer is a previous clean code concept we learned: a function should only do
765
- one thing. When you have classes and functions that have ` if ` statements, you
766
- are telling your user that your function does more than one thing. Remember,
767
- just do one thing .
754
+ ### Tránh điều kiện
755
+ Đây dường như giống một công việc bất khả thi. Sau khi nghe điều này đầu tiên ,
756
+ hầu hết mọi người đều nói, "Tôi tin rằng tôi sẽ không thể làm gì mà không có
757
+ mệnh đề ` if ` ?" Câu trả lời là bạn có thể sử dụng tính đa hình để đạt được công việc
758
+ tương tự trong rất nhiều trường hợp. Câu hỏi thứ hay thường là "đó là điều tốt
759
+ nhưng tại sao tôi lại muốn làm điều đó?" Câu trả lời là khái niệm code sạch sẽ trước
760
+ chúng ta đã học: một hàm nên thực hiện 1 công việc. Khi bạn có nhiều class và hàm
761
+ mà có nhiều mệnh đề ` if ` , bạn đang nói người dùng của bạn rằng hàm của bạn
762
+ đang làm hơn 1 công việc. Hãy nhớ, chỉ làm một công việc .
768
763
769
- ** Bad :**
764
+ ** Không tốt :**
770
765
``` javascript
771
766
class Airplane {
772
767
// ...
@@ -783,7 +778,7 @@ class Airplane {
783
778
}
784
779
```
785
780
786
- ** Good :**
781
+ ** Tốt :**
787
782
``` javascript
788
783
class Airplane {
789
784
// ...
@@ -810,15 +805,15 @@ class Cessna extends Airplane {
810
805
}
811
806
}
812
807
```
813
- ** [ ⬆ back to top ] ( #mục-lục ) **
808
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
814
809
815
- ### Avoid type-checking (part 1)
816
- JavaScript is untyped, which means your functions can take any type of argument .
817
- Sometimes you are bitten by this freedom and it becomes tempting to do
818
- type-checking in your functions. There are many ways to avoid having to do this.
819
- The first thing to consider is consistent APIs .
810
+ ### Tránh kiểm tra loại (phần 1)
811
+ JavaScript không định kiểu, nó có nghĩa hàm của bạn có thể mang bất kì loại của đối số .
812
+ Đôi khi bạn có cảm giác như bị cắn bởi sự tụ do này và nó trở nên hấp dẫn để làm kiểm tra loại
813
+ trong hàm của bạn. Có rất nhiều cách để tránh phải làm điều này.
814
+ Điều đầu tiên để xem xét là các API nhất quán .
820
815
821
- ** Bad :**
816
+ ** Không tốt :**
822
817
``` javascript
823
818
function travelToTexas (vehicle ) {
824
819
if (vehicle instanceof Bicycle) {
@@ -829,26 +824,28 @@ function travelToTexas(vehicle) {
829
824
}
830
825
```
831
826
832
- ** Good :**
827
+ ** Tốt :**
833
828
``` javascript
834
829
function travelToTexas (vehicle ) {
835
830
vehicle .move (this .currentLocation , new Location (' texas' ));
836
831
}
837
832
```
838
- ** [ ⬆ back to top ] ( #mục-lục ) **
833
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
839
834
840
- ### Avoid type-checking (part 2)
841
- If you are working with basic primitive values like strings, integers, and arrays,
842
- and you can't use polymorphism but you still feel the need to type-check,
843
- you should consider using TypeScript. It is an excellent alternative to normal
844
- JavaScript, as it provides you with static typing on top of standard JavaScript
845
- syntax. The problem with manually type-checking normal JavaScript is that
835
+ ### Tránh kiểm tra loại (phần 2)
836
+ Nếu bạn đang làm với kiểu giá trị nguyên thủy cơ bản như string, integer và array,
837
+ và bạn không thể sử dụng đa hình nhưng bạn vẫn cảm thấy cần thiết kiểm tra loại,
838
+ bạn nên xem xét sử dụng TypeScript. Nó là một phương pháp thay thế tuyệt vời
839
+ cho JavaScript thông thường, vì nó cung cấp bạn cùng với gõ tính trên đỉnh của
840
+ cú pháp JavaScript chuẩn. Vấn đề với kiểm tra loại thủ công JavaScript thông thường là
841
+ làm nó cũng đòi hỏi rất nhiều
842
+ (The problem with manually type-checking normal JavaScript is that
846
843
doing it well requires so much extra verbiage that the faux "type-safety" you get
847
- doesn't make up for the lost readability. Keep your JavaScript clean, write
848
- good tests, and have good code reviews. Otherwise, do all of that but with
849
- TypeScript (which, like I said, is a great alternative!).
844
+ doesn't make up for the lost readability).
845
+ Hãy giữ JavaScript của bạn sạch sẽ, viết test tốt và có duyệt code tốt. Nếu không thì
846
+ thực hiện tất cả những điều đó nhưng với TypeScript (giống như tôi đã nói, đó là sự thay thế tốt)
850
847
851
- ** Bad :**
848
+ ** Không tốt :**
852
849
``` javascript
853
850
function combine (val1 , val2 ) {
854
851
if (typeof val1 === ' number' && typeof val2 === ' number' ||
@@ -860,45 +857,45 @@ function combine(val1, val2) {
860
857
}
861
858
```
862
859
863
- ** Good :**
860
+ ** Tốt :**
864
861
``` javascript
865
862
function combine (val1 , val2 ) {
866
863
return val1 + val2;
867
864
}
868
865
```
869
- ** [ ⬆ back to top ] ( #mục-lục ) **
866
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
870
867
871
- ### Don't over-optimize
872
- Modern browsers do a lot of optimization under-the-hood at runtime. A lot of
873
- times, if you are optimizing then you are just wasting your time. [ There are good
874
- resources ] ( https://github.com/petkaantonov/bluebird/wiki/Optimization-killers )
875
- for seeing where optimization is lacking. Target those in the meantime, until
876
- they are fixed if they can be .
868
+ ### Đừng quá tối ưu
869
+ Những trình duyệt hiện đại làm rất nhiều tối ưu hóa bên dưới trong thời thời gian chạy.
870
+ Rất nhiều lần, nếu bạn đang tối ưu thì bạn đang làm tốn thời gian của chính mình.
871
+ [ Đây là nguồn ] ( https://github.com/petkaantonov/bluebird/wiki/Optimization-killers )
872
+ để tìm kiếm nơi tối ưu hóa là thiếu. Nhằm vào những người trong khi chờ đợi,
873
+ cho đến khi chúng được cố định nếu họ có thể .
877
874
878
- ** Bad :**
875
+ ** Không tốt :**
879
876
``` javascript
880
877
881
- // On old browsers, each iteration with uncached ` list.length` would be costly
882
- // because of ` list.length` recomputation. In modern browsers, this is optimized .
878
+ // Trên các trình duyệt cũ, mỗi lần lặp với uncached ' list.length` sẽ tốn kém
879
+ // vì của `toán lại list.length`. Trong các trình duyệt hiện đại, điều này được tối ưu hóa .
883
880
for (let i = 0 , len = list .length ; i < len; i++ ) {
884
881
// ...
885
882
}
886
883
```
887
884
888
- ** Good :**
885
+ ** Tốt :**
889
886
``` javascript
890
887
for (let i = 0 ; i < list .length ; i++ ) {
891
888
// ...
892
889
}
893
890
```
894
- ** [ ⬆ back to top ] ( #mục-lục ) **
891
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
895
892
896
- ### Remove dead code
897
- Dead code is just as bad as duplicate code. There's no reason to keep it in
898
- your codebase. If it's not being called, get rid of it! It will still be safe
899
- in your version history if you still need it .
893
+ ### Xóa dead code
894
+ Dead code cũng tệ như code trùng lặp. Không có lý do gì để giữ chúng lại trong
895
+ codebase của bạn. Nếu nó không được gọi, gạt nó ra! sẽ vẫn được an toàn trong
896
+ lịch sử phiên bản của bạn nếu bạn vẫn cần nó .
900
897
901
- ** Bad :**
898
+ ** Không tốt :**
902
899
``` javascript
903
900
function oldRequestModule (url ) {
904
901
// ...
@@ -913,7 +910,7 @@ inventoryTracker('apples', req, 'www.inventory-awesome.io');
913
910
914
911
```
915
912
916
- ** Good :**
913
+ ** Tốt :**
917
914
``` javascript
918
915
function newRequestModule (url ) {
919
916
// ...
@@ -922,7 +919,7 @@ function newRequestModule(url) {
922
919
const req = newRequestModule;
923
920
inventoryTracker (' apples' , req, ' www.inventory-awesome.io' );
924
921
```
925
- ** [ ⬆ back to top ] ( #mục-lục ) **
922
+ ** [ ⬆ Về đầu trang ] ( #mục-lục ) **
926
923
927
924
## ** Đối tượng và Cấu trúc dữ liệu**
928
925
### Sử dụng getter và setter
0 commit comments