JavaScript sử dụng kế thừa nguyên mẫu. mọi đối tượng kế thừa các thuộc tính và phương thức từ đối tượng nguyên mẫu của nó
Lớp truyền thống là bản thiết kế để tạo các đối tượng, được sử dụng trong các ngôn ngữ như Java hoặc Swift, không tồn tại trong JavaScript. Kế thừa nguyên mẫu chỉ xử lý các đối tượng
Kế thừa nguyên mẫu có thể mô phỏng kế thừa lớp cổ điển. Để đưa các lớp truyền thống vào JavaScript, tiêu chuẩn ES2015 giới thiệu cú pháp
9. một đường cú pháp trên thừa kế nguyên mẫujavascript
export default class User {
// The body of class
}
Bài đăng này giúp bạn làm quen với các lớp JavaScript. cách định nghĩa một lớp, khởi tạo thể hiện, định nghĩa các trường và phương thức, hiểu trường riêng và trường công khai, nắm bắt các trường và phương thức tĩnh
Mục lục
1. Sự định nghĩa. từ khóa lớp
Từ khóa đặc biệt
9 định nghĩa một lớp trong JavaScriptjavascript
export default class User {
// The body of class
}
javascript
class User {
// The body of class
}
Đoạn mã trên định nghĩa một lớp
1. Dấu ngoặc nhọnjavascript
export class User {
// The body of class
}
2 phân định thân lớp. Lưu ý rằng cú pháp này được đặt tên là khai báo lớpjavascript
export class User {
// The body of class
}
Bạn không bắt buộc phải chỉ ra tên lớp. Bằng cách sử dụng một biểu thức lớp, bạn có thể gán lớp cho một biến
javascript
const UserClass = class {
// The body of class
};
Bạn có thể dễ dàng xuất một lớp như một phần của mô-đun ES2015. Đây là cú pháp để xuất mặc định
javascript
export default class User {
// The body of class
}
Và xuất khẩu có tên
javascript
export class User {
// The body of class
}
Lớp trở nên hữu ích khi bạn tạo một thể hiện của lớp. Một thể hiện là một đối tượng chứa dữ liệu và hành vi được mô tả bởi lớp
Toán tử
3 khởi tạo lớp trong JavaScript.javascript
export class User {
// The body of class
}
4javascript
export class User {
// The body of class
}
Ví dụ: bạn có thể khởi tạo lớp
1 bằng toán tửjavascript
export class User {
// The body of class
}
3javascript
export class User {
// The body of class
}
2javascript
export default class User {
// The body of class
}
7 tạo một thể hiện của lớpjavascript
export class User {
// The body of class
}
1javascript
export class User {
// The body of class
}
2. Khởi tạo. người xây dựng[]
9 là một phương thức đặc biệt trong phần thân của một lớp khởi tạo thể hiện. Đó là nơi bạn đặt giá trị ban đầu cho các trường hoặc thực hiện bất kỳ loại thiết lập đối tượng nàojavascript
export class User {
// The body of class
}
Trong ví dụ sau, hàm tạo đặt giá trị ban đầu của trường
20javascript
export default class User {
// The body of class
}
7javascript
export default class User {
// The body of class
}
Hàm tạo của
1 có một tham sốjavascript
export class User {
// The body of class
}
20, được sử dụng để đặt giá trị ban đầu của trườngjavascript
export default class User {
// The body of class
}
23javascript
export default class User {
// The body of class
}
Bên trong hàm tạo giá trị
24 bằng với thể hiện mới được tạojavascript
export default class User {
// The body of class
}
Các đối số được sử dụng để khởi tạo lớp trở thành các tham số của hàm tạo
2javascript
class User {
// The body of class
}
Tham số
20 bên trong hàm tạo có giá trịjavascript
export default class User {
// The body of class
}
26javascript
export default class User {
// The body of class
}
Nếu bạn không định nghĩa hàm tạo cho lớp, hàm tạo mặc định sẽ được tạo. Hàm tạo mặc định là một hàm trống, không sửa đổi thể hiện
Đồng thời, một lớp JavaScript có thể có tối đa một hàm tạo
3. Lĩnh vực
Các trường lớp là các biến chứa thông tin. Các trường có thể được đính kèm với 2 thực thể
- Các trường trên thể hiện của lớp
- Các trường trên chính lớp đó [còn gọi là tĩnh]
Các trường cũng có 2 cấp độ truy cập
- Công cộng. lĩnh vực này có thể truy cập bất cứ nơi nào
- Riêng tư. trường chỉ có thể truy cập trong nội dung của lớp
3. 1 Các trường đối tượng công khai
Hãy xem lại đoạn mã trước
5javascript
class User {
// The body of class
}
Biểu thức
27 tạo một trường thể hiệnjavascript
export default class User {
// The body of class
}
20 và gán cho nó một giá trị ban đầujavascript
export default class User {
// The body of class
}
Sau đó, bạn có thể truy cập trường
20 bằng trình truy cập thuộc tínhjavascript
export default class User {
// The body of class
}
9javascript
class User {
// The body of class
}
20 là trường công khai vì bạn có thể truy cập nó bên ngoài nội dung lớpjavascript
export default class User {
// The body of class
}
1javascript
export class User {
// The body of class
}
Khi các trường được tạo ngầm bên trong hàm tạo, giống như trong trường hợp trước, có thể khó nắm được danh sách các trường. Bạn phải giải mã chúng từ mã của hàm tạo
Một cách tiếp cận tốt hơn là khai báo rõ ràng các trường lớp. Bất kể hàm tạo nào làm, thể hiện luôn có cùng một tập hợp các trường
Đề xuất trường lớp cho phép bạn xác định các trường bên trong nội dung của lớp. Ngoài ra, bạn có thể chỉ ra giá trị ban đầu ngay lập tức
2javascript
export class User {
// The body of class
}
Hãy sửa đổi lớp
1 và khai báo một trường công khaijavascript
export class User {
// The body of class
}
20javascript
export default class User {
// The body of class
}
0javascript
const UserClass = class {
// The body of class
};
74 bên trong phần thân của lớp khai báo một trường công khaijavascript
export default class User {
// The body of class
}
20javascript
export default class User {
// The body of class
}
Các trường công cộng được khai báo theo cách như vậy là biểu cảm. một cái nhìn nhanh vào các khai báo trường là đủ để hiểu cấu trúc dữ liệu của lớp
Hơn nữa, trường lớp có thể được khởi tạo ngay khi khai báo
1javascript
const UserClass = class {
// The body of class
};
76 bên trong thân lớp khai báo một trườngjavascript
export default class User {
// The body of class
}
20 và khởi tạo nó với giá trịjavascript
export default class User {
// The body of class
}
78javascript
export default class User {
// The body of class
}
Không có hạn chế về quyền truy cập hoặc cập nhật các trường công khai. Bạn có thể đọc và gán giá trị cho các trường công khai bên trong hàm tạo, phương thức và bên ngoài lớp
3. 2 Trường phiên bản riêng
Đóng gói là một khái niệm quan trọng cho phép bạn ẩn các chi tiết bên trong của một lớp. Ai đó sử dụng một lớp được đóng gói chỉ phụ thuộc vào giao diện chung mà lớp đó cung cấp và không liên quan đến các chi tiết triển khai của lớp
Các lớp được tổ chức với tính đóng gói sẽ dễ dàng cập nhật hơn khi các chi tiết triển khai thay đổi
Một cách tốt để ẩn dữ liệu bên trong của một đối tượng là sử dụng các trường riêng tư. Đây là những trường chỉ có thể được đọc và thay đổi trong lớp mà chúng thuộc về. Thế giới bên ngoài của lớp không thể thay đổi các trường riêng tư trực tiếp
Các trường riêng chỉ có thể truy cập được trong phần thân của lớp
Đặt tiền tố tên trường bằng ký hiệu đặc biệt
79 để làm cho nó riêng tư, e. g.javascript
export default class User {
// The body of class
}
20. Tiền tốjavascript
class User {
// The body of class
}
79 phải được giữ mỗi khi bạn làm việc với lĩnh vực này. tuyên bố nó, đọc nó, hoặc sửa đổi nójavascript
export default class User {
// The body of class
}
Hãy đảm bảo rằng trường
22 có thể được đặt một lần khi khởi tạo phiên bảnjavascript
class User {
// The body of class
}
2javascript
const UserClass = class {
// The body of class
};
22 là một lĩnh vực tư nhân. Bạn có thể truy cập và sửa đổijavascript
class User {
// The body of class
}
22 trong phần thân củajavascript
class User {
// The body of class
}
1. Phương thứcjavascript
export class User {
// The body of class
}
26 [thêm về các phương thức trong ] có thể truy cập trường riêng tưjavascript
class User {
// The body of class
}
22javascript
class User {
// The body of class
}
Nhưng nếu bạn cố gắng truy cập trường riêng tư
22 bên ngoài nội dung lớpjavascript
class User {
// The body of class
}
1, sẽ xảy ra lỗi cú pháp.javascript
export class User {
// The body of class
}
50javascript
class User {
// The body of class
}
3. 3 Trường tĩnh công khai
Bạn cũng có thể xác định các trường trên chính lớp đó. các trường tĩnh. Đây là hữu ích để xác định hằng số lớp hoặc lưu trữ thông tin cụ thể cho lớp
Để tạo các trường tĩnh trong một lớp JavaScript, hãy sử dụng từ khóa đặc biệt
51 theo sau là tên trường.javascript
class User {
// The body of class
}
52javascript
class User {
// The body of class
}
Hãy thêm một trường mới
53 cho biết loại người dùng. quản trị viên hoặc thường xuyên. Các trường tĩnhjavascript
class User {
// The body of class
}
54 vàjavascript
class User {
// The body of class
}
55 là các hằng hữu ích để phân biệt các loại người dùngjavascript
class User {
// The body of class
}
3javascript
const UserClass = class {
// The body of class
};
56 vàjavascript
class User {
// The body of class
}
57 định nghĩa các biến tĩnh bên trong lớpjavascript
class User {
// The body of class
}
1. Để truy cập các trường tĩnh, bạn phải sử dụng lớp theo sau tên trường.javascript
export class User {
// The body of class
}
59 vàjavascript
class User {
// The body of class
}
90javascript
class User {
// The body of class
}
3. 4 Trường tĩnh riêng
Đôi khi, ngay cả các trường tĩnh cũng là một chi tiết triển khai mà bạn muốn ẩn. Về vấn đề này, bạn có thể đặt các trường tĩnh ở chế độ riêng tư
Để đặt trường tĩnh ở chế độ riêng tư, hãy đặt tiền tố tên trường bằng ký hiệu đặc biệt
79.javascript
export default class User {
// The body of class
}
92javascript
class User {
// The body of class
}
Giả sử bạn muốn giới hạn số lượng phiên bản của lớp
1. Để ẩn thông tin chi tiết về giới hạn phiên bản, bạn có thể tạo các trường tĩnh riêng tưjavascript
export class User {
// The body of class
}
4javascript
const UserClass = class {
// The body of class
};
Trường tĩnh
94 đặt số lượng phiên bản tối đa được phép, trong khi trường tĩnhjavascript
class User {
// The body of class
}
95 đếm số lượng phiên bản thực tếjavascript
class User {
// The body of class
}
Các trường tĩnh riêng tư này chỉ có thể truy cập được trong lớp
1. Không có gì từ thế giới bên ngoài có thể can thiệp vào cơ chế giới hạn. đó là lợi ích của việc đóng góijavascript
export class User {
// The body of class
}
4. phương pháp
Các trường chứa dữ liệu. Nhưng khả năng sửa đổi dữ liệu được thực hiện bởi các chức năng đặc biệt là một phần của lớp. Các phương pháp
Các lớp JavaScript hỗ trợ cả phương thức thể hiện và phương thức tĩnh
4. 1 Phương pháp dụ
Các phương thức của cá thể có thể truy cập và sửa đổi dữ liệu của cá thể. Các phương thức thể hiện có thể gọi các phương thức thể hiện khác, cũng như bất kỳ phương thức tĩnh nào
Ví dụ: hãy định nghĩa một phương thức
26 trả về tên trong lớpjavascript
class User {
// The body of class
}
1javascript
export class User {
// The body of class
}
5javascript
const UserClass = class {
// The body of class
};
99 là một phương thức bên trong lớpjavascript
class User {
// The body of class
}
1.javascript
export class User {
// The body of class
}
21 là một lời gọi phương thức. nó thực thi phương thức và trả về giá trị được tính nếu cójavascript
export class User {
// The body of class
}
Trong một phương thức của lớp, cũng như trong hàm tạo, giá trị
24 bằng với thể hiện của lớp. Sử dụngjavascript
export default class User {
// The body of class
}
24 để truy cập dữ liệu phiên bản.javascript
export default class User {
// The body of class
}
24, hoặc thậm chí gọi các phương thức khác.javascript
export class User {
// The body of class
}
25javascript
export class User {
// The body of class
}
Hãy thêm một phương thức mới
26 có một tham số và gọi một phương thức khácjavascript
export class User {
// The body of class
}
6javascript
const UserClass = class {
// The body of class
};
27 là một phương thức của lớpjavascript
export class User {
// The body of class
}
1 chấp nhận một tham sốjavascript
export class User {
// The body of class
}
29. Hơn thế nữa, nó thực thi một phương thức khác của thể hiệnjavascript
export class User {
// The body of class
}
00 để lấy tên người dùngjavascript
const UserClass = class {
// The body of class
};
Một phương pháp cũng có thể là riêng tư. Để đặt tiền tố riêng tư cho phương thức với tên của nó là
79javascript
export default class User {
// The body of class
}
Hãy đặt phương thức
26 ở chế độ riêng tưjavascript
class User {
// The body of class
}
7javascript
const UserClass = class {
// The body of class
};
03 là một phương pháp riêng tư. Bên trong phương thứcjavascript
const UserClass = class {
// The body of class
};
26 bạn gọi một phương thức riêng như vậy.javascript
export class User {
// The body of class
}
05javascript
const UserClass = class {
// The body of class
};
Là riêng tư,
03 không thể được gọi bên ngoài cơ thể lớpjavascript
const UserClass = class {
// The body of class
};
1javascript
export class User {
// The body of class
}
4. 2 Getters và setters
getter và setter bắt chước trường thông thường, nhưng có nhiều quyền kiểm soát hơn về cách trường được truy cập và thay đổi
Trình thu thập được thực thi khi cố gắng lấy giá trị trường, trong khi trình thiết lập cố gắng đặt giá trị
Để đảm bảo rằng thuộc tính
20 củajavascript
export default class User {
// The body of class
}
1 không thể để trống, hãy bọc trường riêngjavascript
export class User {
// The body of class
}
10 trong một getter và setterjavascript
const UserClass = class {
// The body of class
};
8javascript
const UserClass = class {
// The body of class
};
11 getter được thực thi khi bạn truy cập giá trị của trường.javascript
const UserClass = class {
// The body of class
};
12javascript
const UserClass = class {
// The body of class
};
Trong khi
13 được thực thi khi trường được cập nhậtjavascript
const UserClass = class {
// The body of class
};
14. Setter đưa ra lỗi nếu giá trị mới là một chuỗi rỗngjavascript
const UserClass = class {
// The body of class
};
4. 3 phương pháp tĩnh
Các phương thức tĩnh là các hàm được gắn trực tiếp vào lớp. Họ giữ logic liên quan đến lớp, chứ không phải là thể hiện của lớp
Để tạo một phương thức tĩnh, hãy sử dụng từ khóa đặc biệt
51 theo sau là cú pháp phương thức thông thường.javascript
class User {
// The body of class
}
16javascript
const UserClass = class {
// The body of class
};
Khi làm việc với các phương thức tĩnh, có 2 quy tắc đơn giản cần nhớ
- Một phương thức tĩnh có thể truy cập các trường tĩnh
- Một phương thức tĩnh không thể truy cập các trường mẫu
Ví dụ: hãy tạo một phương thức tĩnh để phát hiện xem người dùng có tên cụ thể đã được sử dụng chưa
9javascript
const UserClass = class {
// The body of class
};
17 là một phương thức tĩnh sử dụng trường riêng tĩnhjavascript
const UserClass = class {
// The body of class
};
18 để kiểm tra các tên đã lấyjavascript
const UserClass = class {
// The body of class
};
Các phương thức tĩnh có thể là riêng tư.
19. Một lần nữa, họ tuân theo các quy tắc về quyền riêng tư. bạn chỉ có thể gọi một phương thức tĩnh riêng tư trong nội dung lớpjavascript
const UserClass = class {
// The body of class
};
5. Di sản. mở rộng
Các lớp trong JavaScript hỗ trợ kế thừa đơn bằng cách sử dụng từ khóa
20javascript
const UserClass = class {
// The body of class
};
Trong biểu thức
21, lớpjavascript
const UserClass = class {
// The body of class
};
22 kế thừa từjavascript
const UserClass = class {
// The body of class
};
23 hàm tạo, các trường và phương thứcjavascript
const UserClass = class {
// The body of class
};
Ví dụ: hãy tạo một lớp con mới
24 mở rộng lớp chajavascript
const UserClass = class {
// The body of class
};
1javascript
export class User {
// The body of class
}
0javascript
export default class User {
// The body of class
}
24 kế thừa từ hàm tạo củajavascript
const UserClass = class {
// The body of class
};
1, phương thứcjavascript
export class User {
// The body of class
}
26 và trườngjavascript
class User {
// The body of class
}
20. Đồng thời, lớpjavascript
export default class User {
// The body of class
}
24 khai báo một trường mớijavascript
const UserClass = class {
// The body of class
};
31javascript
const UserClass = class {
// The body of class
};
Lưu ý rằng các thành viên private của lớp cha không được kế thừa bởi lớp con
5. 1 nhà xây dựng cha mẹ. super[] trong hàm tạo[]
Nếu bạn muốn gọi hàm tạo cha trong một lớp con, bạn cần sử dụng hàm đặc biệt
32 có sẵn trong hàm tạo conjavascript
const UserClass = class {
// The body of class
};
Ví dụ: hãy tạo hàm tạo
24 gọi hàm tạo chính củajavascript
const UserClass = class {
// The body of class
};
1, cũng như khởi tạo trường bài đăngjavascript
export class User {
// The body of class
}
1javascript
export default class User {
// The body of class
}
35 bên trong lớp conjavascript
const UserClass = class {
// The body of class
};
24 thực thi hàm tạo của lớp chajavascript
const UserClass = class {
// The body of class
};
1javascript
export class User {
// The body of class
}
Lưu ý rằng bên trong hàm tạo con, bạn phải thực thi
32 trước khi sử dụng từ khóajavascript
const UserClass = class {
// The body of class
};
24. Gọijavascript
export default class User {
// The body of class
}
32 đảm bảo rằng hàm tạo gốc khởi tạo thể hiệnjavascript
const UserClass = class {
// The body of class
};
2javascript
export default class User {
// The body of class
}
5. 2 Phiên bản mẹ. siêu trong phương pháp
Nếu bạn muốn truy cập phương thức cha bên trong phương thức con, bạn có thể sử dụng phím tắt đặc biệt
41javascript
const UserClass = class {
// The body of class
};
3javascript
export default class User {
// The body of class
}
26 của lớp conjavascript
class User {
// The body of class
}
24 truy cập phương thứcjavascript
const UserClass = class {
// The body of class
};
44 trực tiếp từ lớp chajavascript
const UserClass = class {
// The body of class
};
1javascript
export class User {
// The body of class
}
Tính năng này được gọi là ghi đè phương thức
Lưu ý rằng bạn cũng có thể sử dụng
41 với các phương thức tĩnh để truy cập các phương thức tĩnh của cha mẹjavascript
const UserClass = class {
// The body of class
};
6. Kiểm tra loại đối tượng. dụ của
47 là toán tử xác định xemjavascript
const UserClass = class {
// The body of class
};
48 có phải là phiên bản củajavascript
const UserClass = class {
// The body of class
};
49 hay khôngjavascript
const UserClass = class {
// The body of class
};
Hãy xem nhà điều hành
50 đang hoạt độngjavascript
const UserClass = class {
// The body of class
};
4javascript
export default class User {
// The body of class
}
51 là một thể hiện của lớpjavascript
const UserClass = class {
// The body of class
};
1,javascript
export class User {
// The body of class
}
53 đánh giá thànhjavascript
const UserClass = class {
// The body of class
};
54javascript
const UserClass = class {
// The body of class
};
Đối tượng rỗng
55 không phải là một thể hiện củajavascript
const UserClass = class {
// The body of class
};
1, tương ứng vớijavascript
export class User {
// The body of class
}
57 làjavascript
const UserClass = class {
// The body of class
};
58javascript
const UserClass = class {
// The body of class
};
50 là đa hình. toán tử phát hiện một đứa trẻ như một thể hiện của lớp chajavascript
const UserClass = class {
// The body of class
};
5javascript
export default class User {
// The body of class
}
60 là một thể hiện của lớp conjavascript
const UserClass = class {
// The body of class
};
24. Toán tử ________ 562 đánh giá thành ________ 554javascript
const UserClass = class {
// The body of class
};
Đồng thời
24 là lớp con củajavascript
const UserClass = class {
// The body of class
};
1. Vì vậy,javascript
export class User {
// The body of class
}
66 cũng ước tính thànhjavascript
const UserClass = class {
// The body of class
};
54javascript
const UserClass = class {
// The body of class
};
Điều gì xảy ra nếu bạn muốn xác định chính xác lớp của thể hiện?
6javascript
export default class User {
// The body of class
}
7. Các lớp và nguyên mẫu
Tôi phải nói rằng cú pháp lớp trong JavaScript thực hiện rất tốt việc trừu tượng hóa từ kế thừa nguyên mẫu. Để mô tả cú pháp
9, tôi thậm chí còn chưa sử dụng thuật ngữ nguyên mẫujavascript
export default class User {
// The body of class
}
Nhưng các lớp được xây dựng dựa trên sự kế thừa nguyên mẫu. Mỗi lớp là một hàm và tạo một thể hiện khi
Hai đoạn mã sau là tương đương
Phiên bản lớp học
7javascript
export default class User {
// The body of class
}
Phiên bản sử dụng nguyên mẫu
8javascript
export default class User {
// The body of class
}
Cú pháp lớp sẽ dễ làm việc hơn nếu bạn đã quen với cơ chế kế thừa cổ điển của ngôn ngữ Java hoặc Swift
Dù sao đi nữa, ngay cả khi bạn sử dụng cú pháp lớp trong JavaScript, tôi khuyên bạn nên hiểu rõ về kế thừa nguyên mẫu
8. Tính năng sẵn có của lớp học
Các tính năng của lớp được trình bày trong bài đăng này được trải rộng trên ES2015 và các đề xuất ở giai đoạn 3
Vào cuối năm 2019, các tính năng của lớp được phân chia giữa
- Các trường đối tượng công khai và riêng tư là một phần của đề xuất Trường lớp
- Các phương thức và trình truy cập cá thể riêng tư là một phần của đề xuất phương thức riêng của Lớp
- Các trường tĩnh công khai và riêng tư cũng như các phương thức tĩnh riêng tư là một phần của đề xuất các tính năng tĩnh của Lớp
- Phần còn lại là một phần của tiêu chuẩn ES2015
9. Phần kết luận
Các lớp JavaScript khởi tạo các thể hiện với các hàm tạo, xác định các trường và phương thức. Bạn có thể đính kèm các trường và phương thức ngay cả trên chính lớp đó bằng cách sử dụng từ khóa
51javascript
class User {
// The body of class
}
Kế thừa đạt được bằng cách sử dụng từ khóa
20. bạn có thể dễ dàng tạo một lớp con từ lớp cha. Từ khóajavascript
const UserClass = class {
// The body of class
};
41 được sử dụng để truy cập lớp cha từ lớp conjavascript
const UserClass = class {
// The body of class
};
Để tận dụng khả năng đóng gói, hãy đặt các trường và phương thức ở chế độ riêng tư để ẩn các chi tiết bên trong của các lớp của bạn. Các trường riêng và tên phương thức phải bắt đầu bằng
79javascript
export default class User {
// The body of class
}
Các lớp trong JavaScript ngày càng trở nên thuận tiện hơn để sử dụng
Bạn nghĩ gì về việc sử dụng
79 để đặt tiền tố cho các thuộc tính riêng tư?javascript
export default class User {
// The body of class
}
Thích bài viết?
đề xuất cải tiến
Bài đăng chất lượng vào hộp thư đến của bạn
Tôi thường xuyên xuất bản bài viết có chứa
- Các khái niệm JavaScript quan trọng được giải thích bằng các từ đơn giản
- Tổng quan về các tính năng JavaScript mới
- Cách sử dụng TypeScript và cách gõ
- Thiết kế phần mềm và thực hành mã hóa tốt
Đăng ký nhận bản tin của tôi để nhận chúng ngay trong hộp thư đến của bạn
Đặt muaTham gia cùng 6719 người đăng ký khác
Giới thiệu về Dmitri Pavlutin
Nhà văn và huấn luyện viên công nghệ. Thói quen hàng ngày của tôi bao gồm [nhưng không giới hạn] uống cà phê, viết mã, viết, huấn luyện, vượt qua sự nhàm chán 😉