cuốn sách gpt4 ai đã làm

02. Giải thích chi tiết nguyên tắc trách nhiệm duy nhất

In lại Tác giả: Sahara Thời gian cập nhật: 26-12-2024 10:47:52 56 4
mua khóa gpt4 Nike

02. Giải thích chi tiết nguyên tắc trách nhiệm duy nhất

Giới thiệu danh mục

  • 01. Tư duy và phân tích vấn đề
  • 02. Giới thiệu nguyên tắc trách nhiệm duy nhất
  • 03. Làm sao hiểu được một lời buộc tội
  • 04. Sử dụng ví dụ để hiểu trách nhiệm duy nhất
  • 05.Tại sao phải tuân thủ nguyên tắc duy nhất
  • 06. Trách nhiệm duy nhất ở cấp độ phương pháp
  • 07. Trách nhiệm duy nhất ở cấp độ giao diện
  • 08. Trách nhiệm duy nhất ở cấp lớp
  • 09. Phán quyết mơ hồ về trách nhiệm duy nhất
  • 10. Nguyên tắc phán xét trách nhiệm duy nhất
  • 11.Tóm tắt cuối cùng
  • 12. Thêm đề xuất nội dung

Đề xuất một trang web thú vị

Website chia sẻ công nghệ thuần túy nhất, tạo chuyên mục lập trình kỹ thuật chất lượng cao! Lập trình mạng nâng cao.

https://yccoding.com/ .

Mẫu thiết kế Địa chỉ dự án Git: https://github.com/yangchong211/YCDesignBlog.

Nguyên tắc Trách nhiệm duy nhất (SRP) là một nguyên tắc quan trọng của thiết kế hướng đối tượng, nhấn mạnh rằng một lớp hoặc mô-đun chỉ chịu trách nhiệm hoàn thành một trách nhiệm hoặc chức năng cụ thể. Bằng cách phân tách các hàm phức tạp thành nhiều lớp với độ chi tiết nhỏ và các hàm đơn lẻ, tính linh hoạt, khả năng bảo trì và khả năng mở rộng của hệ thống có thể được cải thiện.

Bài viết này giới thiệu chi tiết cách hiểu nguyên tắc trách nhiệm duy nhất, bao gồm ứng dụng của nó ở cấp độ phương pháp, giao diện và lớp, đồng thời giải thích các ưu điểm và tiêu chí phán đoán của nó thông qua các ví dụ cụ thể. Ngoài ra, nó cũng thảo luận về cách cân bằng thiết kế các lớp trong quá trình phát triển thực tế để tránh sự gia tăng độ phức tạp do sự phân chia quá mức gây ra.

01. Tư duy và phân tích vấn đề

  1. Làm thế nào để hiểu lời buộc tội duy nhất của một lớp, và lời buộc tội duy nhất này được đánh giá như thế nào trong một lời buộc tội duy nhất?
  2. Tôi hiểu, nhưng tôi có thể sử dụng nó không, hoặc ứng dụng của nó trong quá trình phát triển thực tế là gì? Bạn có thể đưa ra một ví dụ về lợi ích của trách nhiệm duy nhất không?
  3. Có phải một lời buộc tội duy nhất là thiết kế càng đơn giản thì càng tốt? Hãy cho tôi biết lý do và ý tưởng cho lập luận của bạn?
  4. Ngoài việc áp dụng nguyên tắc trách nhiệm duy nhất vào thiết kế lớp, liệu nó có thể được mở rộng sang các khía cạnh thiết kế khác không?

02. Giới thiệu nguyên tắc trách nhiệm duy nhất

Nguyên tắc trách nhiệm duy nhất (SRP) là một nguyên tắc quan trọng trong thiết kế hướng đối tượng.

Mô tả bằng tiếng Anh của nguyên tắc này như sau: Một lớp hoặc mô-đun nên có một trách nhiệm duy nhất.

Nếu chúng ta dịch sang tiếng Trung thì đó là: một lớp hoặc mô-đun chỉ chịu trách nhiệm hoàn thành một trách nhiệm (hoặc chức năng).

Bằng cách Việc phân chia các chức năng thành các mô-đun hoặc các lớp khác nhau, hệ thống có thể trở nên linh hoạt hơn, dễ bảo trì và mở rộng hơn.

Không khó để hiểu nghĩa đen. Trong một dự án, bạn sẽ thấy rằng “hiểu” và “sử dụng được” là hai công việc khác nhau, và “sử dụng tốt” lại càng khó khăn hơn.

Đánh giá từ kinh nghiệm làm việc, nhiều đồng nghiệp chưa hiểu Tường tận những nguyên tắc này, dẫn đến công việc áp dụng quy tắc quá giáo điều, coi nguyên tắc là đúng đắn và áp dụng một cách máy móc, phản tác.

03. Làm sao hiểu được một lời buộc tội

Các đối tượng được mô tả bởi nguyên tắc đơn bao gồm hai, một lớp và một mô-đun.

Một cách hiểu là: hãy nghĩ về các mô-đun như một khái niệm vật tượng hơn các lớp và các lớp cũng có thể được coi là mô-đun. Một mô-đun chứa nhiều lớp và nhiều lớp tạo nên một mô-đun.

Để Bạn dễ hiểu, tiếp theo tôi sẽ chỉ giải quyết cách áp dụng nguyên tắc thiết kế này từ góc thiết kế “đẳng” cấp”. Đối với “mô-đun”, bạn có thể tự động mở rộng nó.

04. Sử dụng ví dụ để hiểu trách nhiệm duy nhất

Định nghĩa và mô tả Nguyên tắc nhiệm vụ duy nhất rất đơn giản và không khó hiểu Một lớp chỉ cam chịu trách nhiệm hoàn thành một nhiệm vụ hoặc chức năng. chi tiết nhỏ và đơn chức năng. nói rằng trách nhiệm của nó không đủ đơn lẻ và nó phải được chia thành nhiều lớp với các hàm đơn và mức độ chi tiết lộ tốt hơn.

Ví dụ: một lớp chứa cả người vận hành và người vận hành. người dùng là hai mô hình kinh doanh độc lập. sẽ vi phạm nguyên tắc trách nhiệm duy nhất.

Để đáp ứng nguyên tắc trách nhiệm duy nhất, chúng ta cần chia lớp này thành hai lớp với mức độ chi tiết tốt hơn và các chức năng đơn lẻ: lớp đặt hàng và lớp người dùng.

05.Tại sao phải tuân thủ nguyên tắc duy nhất

Chúng ta tự tin vào công việc mình làm, vậy tại sao họ lại áp dụng nguyên tắc trách nhiệm duy nhất?

  1. Cải thiện khả năng bảo trì và khả năng đọc của các lớp. đi, mã hóa ít hơn, khả năng đọc được cải thiện và khả năng xử lý cao hơn.
  2. Cải thiện khả năng hệ thống bảo trì. prototosystem of all system intercomment.
  3. Giảm thiểu việc thay đổi.

06. Trách nhiệm duy nhất ở cấp độ phương pháp

Chúng tôi có thể phát triển nhiều chức năng này.

Trước tiên chúng ta hãy xem cách phát triển khai báo đầu tiên:

public enumOperaEnum { UPDATE_USERNAME, UPDATE_PASSWORD; } giao diện công khai UserOperate { void updateUserInfo(OperateEnum type, UserInfo userInfo); } public class UserOperateImpl phát triển UserOperate{ @Override public void updateUserInfo(OperateEnum type, UserInfo userInfo) { if (type == OperationEnum.UPDATE_PASSWORD) { //Thay đổi mật khẩu} else if(type == OperatingEnum.UPDATE_USERNAME) { //Thay đổi tên người dùng} } }

Sau đó, hãy xem cách thực hiện thứ hai:

giao diện công khai UserOperate { void updateUserName(UserInfo userInfo); void updateUserPassword(UserInfo userInfo); } public class UserOperateImpl khai UserOperate { @Override public void updateUserName(UserInfo userInfo) { // Chỉnh sửa logic tên người dùng} @Override public void updateUserPassword(UserInfo userInfo ) { // Chỉnh sửa mật khẩu logic } }

Chúng ta hãy xem các sự khác biệt giữa hai cách phát triển này

  1. Việc phát triển đầu tiên là sự phân biệt dựa trên các loại hoạt động và các loại khác nhau thực hiện logic khác nhau Hai công việc thay đổi. người dùng tên và thay đổi mật khẩu được kết hợp với nhau. thì sẽ xảy ra lỗi.
  2. Logic thay đổi tên người dùng và thay đổi mật khẩu Đặc biệt, mỗi bên thực hiện trách nhiệm riêng của mình mà không thể can thiệp lẫn nhau và các chức năng rõ ràng và rõ ràng.

Có thể thấy, thiết kế thứ hai phù hợp với nguyên tắc trách nhiệm duy nhất. nhiệm vụ duy nhất ở phương pháp cấp độ.

07. Trách nhiệm duy nhất ở cấp độ giao diện

Li Si mua đồ hóa hóa Li Si phải nấu ăn sau khi đi chợ Về. Làm cách nào để thực hiện logic này?

Trước tiên chúng ta hãy xem cách phát triển khai báo đầu tiên:

/** * Làm việc nhà*/ giao diện công khai HouseWork { // Quét sàn void scannerFloor(); // Mua sắm void shopping(); } public class Zhangsan phát triển HouseWork{ @Override public void scanFloor() { // Quét sàn } @Override public void shopping() { } } public class Lisi phát triển khai HouseWork{ @Override public void scannerFloor() { } @Override public void shopping() { // Mua sắm} }

Đầu tiên, một giao diện để làm việc nhà được xác định và hai phương pháp được xác định là quét nhà và mua hàng tạp hóa Sau đó Lý Sĩ Cả Zhang San và Li Si đều viết lại phương this pháp luật, nhưng Li Si chỉ có cách thực hiện cụ thể.

Bản thân thiết kế này là không hợp lý. Trước hết: Trương Tam chỉ quét sàn, nhưng hắn cần viết lại phương pháp mua hàng tạp hóa, Lý Tư không cần quét sàn, nhưng Lý Tư cũng cần viết lại phương pháp quét sàn. Thứ hai: Điều này cũng không tuân theo nguyên tắc đóng mở. Để thêm một kiểu nấu ăn, cần phải sửa đổi ba lớp. Bằng cách này, khi logic rất phức tạp sẽ dễ gây ra những lỗi không mong muốn.

Thiết kế trên không tuân thủ nguyên tắc trách nhiệm duy nhất Sửa đổi một nơi sẽ ảnh hưởng đến những nơi khác không cần sửa đổi.

Sau đó, hãy xem cách thực hiện thứ hai:

/** * Làm việc nhà*/ giao diện công cộng Hoursework { } giao diện công cộng Mua sắm mở rộng Hoursework{ // Mua sắm void shopping(); } giao diện công cộng SweepFloor mở rộng Hoursework{ // Quét sàn void quétFlooring() } lớp công khai Zhangsan triển khai SweepFloor { @ Ghi đè public void scannerFlooring() { // Zhang San quét sàn} } public class Lisi thực hiện Mua sắm{ @Override public void shopping() { // Li Si Mua sắm} }

Việc nhà nói trên không được định nghĩa là một sự giao thoa mà việc quét nhà và việc nhà được tách riêng ra. Zhang San quét sàn, sau đó Zhang San thực hiện giao diện quét sàn. Khi Li Si mua sắm, Li Si thực hiện giao diện mua sắm. Sau này John Doe sẽ bổ sung thêm chức năng nấu ăn. Sau đó thêm giao diện nấu ăn mới. Lần này chỉ có Li Si cần thực hiện giao diện nấu ăn.

giao diện công khai Cooking mở rộng Hoursework{ void cook(); } lớp công khai Lisi thực hiện Mua sắm, Nấu ăn{ @Override public void shopping() { // Lisi shopping} @Override public void cook() { // Lisi cooks} }

Như trên, chúng ta thấy Zhang San không triển khai các giao diện dư thừa và Li Si cũng vậy. Và khi các chức năng mới được thêm vào, nó chỉ ảnh hưởng đến Li Si chứ không ảnh hưởng đến Zhang San.

Điều này phù hợp với nguyên tắc trách nhiệm duy nhất. Một lớp chỉ thực hiện một việc và việc sửa đổi nó sẽ không mang lại những thay đổi khác.

08. Trách nhiệm duy nhất ở cấp lớp

Từ cấp độ lớp, không có cách nào phân chia hoàn toàn theo nguyên tắc trách nhiệm duy nhất, nói cách khác, trách nhiệm của lớp có thể lớn hoặc nhỏ, không giống như giao diện, nó có thể được phân chia rõ ràng theo nguyên tắc trách nhiệm duy nhất. Miễn là nó hợp lý và hợp lý.

Ví dụ: chúng tôi có thể đăng ký, đăng nhập, đăng nhập bằng WeChat, đăng ký và đăng nhập cũng như các thao tác khác trên trang chủ của trang web.

giao diện công khai UserOperate { void login(UserInfo userInfo); void register(UserInfo userInfo); void logout(UserInfo userInfo); } public class UserOperateImpl triển khai UserOperate{ @Override public void login(UserInfo userInfo) { // Đăng nhập người dùng} @Override public void register(UserInfo userInfo) { // Đăng ký người dùng} @Ghi đè đăng xuất void void(UserInfo userInfo) { // Người dùng đăng xuất } }

Nếu phân chia theo nguyên tắc trách nhiệm duy nhất thì cũng có thể phân chia thành dạng sau.

giao diện công cộng Đăng ký { void register(); } giao diện công cộng Đăng nhập { void login(); } giao diện công cộng Đăng xuất { void logout(); } public class RegisterImpl thực hiện Đăng ký{ @Override public void register() { } } public class loginImpl thực hiện Đăng nhập{ @Override public void login() { // Đăng nhập người dùng} } public class LogoutImpl thực hiện Đăng xuất{ @Override public void logout() { } }

09. Phán quyết mơ hồ về trách nhiệm duy nhất

Trong phát triển phần mềm thực tế, rất khó để xác định liệu một lớp có một trách nhiệm duy nhất hay không. Hãy để tôi cho bạn một ví dụ thực tế hơn để giải thích.

Trong một sản phẩm xã hội, chúng tôi sử dụng lớp UserInfo sau để ghi lại thông tin người dùng. Bạn có nghĩ rằng thiết kế của lớp UserInfo đáp ứng nguyên tắc trách nhiệm duy nhất không?

public class UserInfo { userId chuỗi riêng tư; Chuỗi email riêng tư; Chuỗi riêng tư điện thoại; Chuỗi riêng tư cuối cùngLoginTime; Chuỗi riêng tư ProvinceOfAddress; // Khu vực riêng Chuỗi chi tiếtĐịa chỉ; // Địa chỉ chi tiết // . . . Các thuộc tính và phương thức khác bị bỏ qua. . . }

Có hai quan điểm khác nhau về vấn đề này.

  1. Một quan điểm cho rằng lớp UserInfo chứa thông tin liên quan đến người dùng và tất cả các thuộc tính và phương thức đều thuộc mô hình kinh doanh của người dùng, đáp ứng nguyên tắc trách nhiệm duy nhất;
  2. Một quan điểm khác là thông tin địa chỉ chiếm tỷ lệ tương đối cao trong lớp UserInfo và có thể tách thành một lớp UserAddress độc lập chỉ giữ lại các thông tin khác ngoại trừ trách nhiệm của hai lớp sau khi tách ra là đơn lẻ hơn.

Quan điểm nào đúng hơn? Trên thực tế, để lựa chọn trong số đó, chúng ta không thể tách rời khỏi các tình huống ứng dụng cụ thể.

  1. Nếu trong sản phẩm xã hội này, thông tin địa chỉ của người dùng chỉ dùng để hiển thị như các thông tin khác thì thiết kế hiện tại của UserInfo là hợp lý.
  2. Nếu sản phẩm xã hội này phát triển tốt và mô-đun thương mại điện tử được thêm vào sản phẩm sau này và thông tin địa chỉ của người dùng sẽ được sử dụng trong hậu cần thương mại điện tử thì tốt hơn chúng ta nên tách thông tin địa chỉ khỏi UserInfo và làm cho nó độc lập. Thông tin hậu cần của người dùng (hoặc thông tin địa chỉ, thông tin giao hàng, v.v.).

Từ ví dụ vừa rồi, chúng ta có thể kết luận rằng trong các kịch bản ứng dụng khác nhau và các yêu cầu giai đoạn khác nhau, việc xác định liệu cùng một lớp có một trách nhiệm duy nhất có thể khác nhau hay không. Trong một kịch bản ứng dụng nhất định hoặc trong bối cảnh nhu cầu hiện tại, thiết kế của một lớp có thể đã đáp ứng nguyên tắc trách nhiệm duy nhất, nhưng nếu nó thay đổi sang một kịch bản ứng dụng khác hoặc trong bối cảnh của một nhu cầu nhất định trong tương lai thì nó có thể không phù hợp. hài lòng và cần tiếp tục được chia thành các lớp chi tiết hơn.

Đôi khi chúng ta không có một tiêu chuẩn rõ ràng và có thể định lượng được về việc trách nhiệm của một giai cấp có đủ đơn lẻ hay không. Có thể nói đây là một vấn đề rất chủ quan và những người nhân từ có quan điểm khác nhau.

10. Nguyên tắc phán xét trách nhiệm duy nhất

Có thể bạn sẽ nói, nguyên tắc này mơ hồ và mơ hồ quá, chúng ta nên xử lý thế nào? Tôi cũng có một số mẹo ở đây có thể giúp bạn đánh giá liệu trách nhiệm của một lớp có đủ đơn lẻ hay không. Các nguyên tắc phán đoán sau đây mang tính hướng dẫn và thực thi nhiều hơn là suy nghĩ chủ quan về việc liệu một lớp có một trách nhiệm duy nhất hay không:

  1. Nếu có quá nhiều dòng mã, hàm hoặc thuộc tính trong một lớp sẽ ảnh hưởng đến khả năng đọc và bảo trì của mã, vì vậy chúng ta cần xem xét việc chia lớp;
  2. Nếu một lớp phụ thuộc vào quá nhiều lớp khác hoặc nếu có quá nhiều lớp khác phụ thuộc vào lớp đó, không phù hợp với ý tưởng thiết kế về độ gắn kết cao và độ ghép thấp thì chúng ta cần xem xét việc tách lớp đó;
  3. Nếu có quá nhiều phương thức riêng tư, chúng ta cần xem xét liệu chúng ta có thể tách các phương thức riêng tư thành các lớp mới và đặt chúng làm phương thức công khai để nhiều lớp sử dụng hơn hay không, từ đó cải thiện khả năng sử dụng lại mã;
  4. Thật khó để đặt cho một lớp một cái tên phù hợp, thật khó để tóm tắt nó bằng một danh từ kinh doanh, hoặc chỉ có thể đặt tên bằng một số từ chung chung như Manager và Context, nghĩa là trách nhiệm của lớp có thể không được xác định rõ ràng. được xác định đủ;
  5. Một số lượng lớn các phương thức trong lớp tập trung vào việc vận hành các thuộc tính nhất định trong lớp. Ví dụ: trong ví dụ UserInfo, nếu một nửa số phương thức đang hoạt động trên thông tin địa chỉ thì bạn có thể xem xét việc tách các thuộc tính này và các phương thức tương ứng sẽ xuất hiện.

11.Tóm tắt cuối cùng

Làm thế nào để hiểu Nguyên tắc Trách nhiệm duy nhất (SRP)?

Một lớp chỉ chịu trách nhiệm hoàn thành một trách nhiệm hoặc chức năng. Đừng thiết kế các lớp lớn và toàn diện mà hãy thiết kế các lớp có độ chi tiết nhỏ và chức năng đơn lẻ. Nguyên tắc trách nhiệm duy nhất là đạt được sự gắn kết cao và độ ghép mã thấp, đồng thời cải thiện khả năng sử dụng lại, khả năng đọc và bảo trì mã.

Làm thế nào để đánh giá liệu trách nhiệm của một lớp có đủ đơn lẻ hay không?

  1. Các kịch bản ứng dụng khác nhau, nền tảng nhu cầu ở các giai đoạn khác nhau và cấp độ kinh doanh khác nhau có thể có kết quả đánh giá khác nhau về việc liệu các trách nhiệm của cùng một loại có đơn lẻ hay không. Trên thực tế, một số chỉ báo đánh giá bên lề mang tính hướng dẫn và thực thi cao hơn. Ví dụ: các tình huống sau đây có thể chỉ ra rằng kiểu thiết kế này không đáp ứng nguyên tắc trách nhiệm duy nhất:
  2. Có quá nhiều dòng mã, hàm hoặc thuộc tính trong lớp;
  3. Lớp phụ thuộc vào quá nhiều lớp khác, hoặc lớp phụ thuộc quá nhiều lớp khác;
  4. Quá nhiều phương pháp riêng tư;
  5. Việc đặt một cái tên thích hợp cho một lớp sẽ khó khăn hơn;
  6. Một số lượng lớn các phương thức trong lớp tập trung vào việc vận hành các thuộc tính nhất định trong lớp.

Trách nhiệm của một lớp có nên được thiết kế đơn giản nhất có thể không?

Nguyên tắc trách nhiệm duy nhất cải thiện sự gắn kết của các lớp bằng cách tránh thiết kế các lớp lớn và toàn diện như ghép các chức năng không liên kết lại với nhau. phụ thuộc và phụ thuộc vào, làm giảm độ ghép của mã, từ đó đạt được mức độ gắn kết cao và ghép thấp of code.

Tuy nhiên, nếu việc phân chia quá chi tiết sẽ thực sự phản tác dụng, làm giảm khả năng gắn kết và ảnh hưởng khả năng bảo trì của mã hóa.

12. Thêm đề xuất nội dung

mô-đun mô tả Nhận xét
GitHub Nhiều dự án nguồn mở dòng YC, bao gồm các thư viện thành phần Android và nhiều trường hợp GitHub
Blog tóm tắt Tổng hợp Java, Android, C/C++, giao thức mạng, thuật toán, trình đơn tắt thiết lập, vv YCblog
thiết kế mẫu Nguyên tắc thiết kế chính, 23 mẫu thiết kế, trường hợp thiết kế mẫu, đối tượng hướng dẫn duy nhất thiết kế mẫu
Cao nâng cấp Java Thiết kế và nguyên tắc dữ liệu, ý tưởng cốt lõi của đối tượng hướng dẫn, IO, ngoại lệ, luồng và đồng thời, JVM Cao nâng cấp Java
network Protocol Các trường hợp mạng thực tế, nguyên tắc và phân lớp mạng, HTTPS, yêu cầu mạng, xử lý sự cố network Protocol
máy tính nguyên tắc Hướng dẫn cài đặt cấu hình, cơ chế xử lý ngoại lệ, nguyên tắc và hoạt động IO khái niệm cơ bản về máy tính
Học lập trình C Hướng dẫn học tập có hệ thống và giao diện cho ngôn ngữ đầu vào cấp độ C, học cơ bản đến bốn trường hợp nhất vật thể trình cài đặt C
trình lập C++ Hướng dẫn giảng dạy toàn diện và có hệ thống về sơ đồ ngôn ngữ C++, lập trình bài hát, các nguyên tắc cốt lõi trình lập C++
Thuật toán thực hành Canvas, mảng, danh sách liên kết, ngăn xếp, hàng chờ, cây, hàm băm, đệ quy, tìm kiếm, sắp xếp, vv Leetcode
Android Giới thiệu cơ bản, mở nguồn mã thư viện giải nén, hiệu suất tối ưu, Framework, giải pháp thiết kế Android

23 thiết kế mẫu.

23 mẫu thiết kế & mô tả & cốt lõi chức năng bao gồm
sáng tạo mô hình
Cung cấp các trường hợp sử dụng để tạo đối tượng. use us in the software module
Máy chủ mẫu
Mô Hình Nhà Máy Trừu Tượng
Mẫu đơn
Build sample
Mẫu nguyên mẫu
Structure config
Tập trung vào sự kết hợp của các lớp và đối tượng.Kết hợp các lớp hoặc đối tượng lại với nhau để tạo ra các cấu hình lớn hơn
Bộ điều chỉnh mẫu
Cầu mẫu
Bộ lọc mẫu (Bộ lọc, Mẫu tiêu chí)
Mẫu tổng hợp
Mẫu trang trí
Mẫu tiền
Mẫu hạng ruồi
Mẫu proxy
model action vi
Chú ý đặc biệt về giao tiếp giữa các đối tượng. đối tượng"
Chuỗi nhiệm vụ
Lệnh mẫu
Sample user thông dịch
Vòng lặp mẫu
Bộ giải mã mẫu
Mẫu lưu trữ vật phẩm
Sample quan sát
Trạng thái mẫu
Empty object sample
Lược đồ mẫu
Mẫu mẫu
Access client sample

Cuối cùng, bài viết này về 02. Giải thích chi tiết về nguyên tắc trách nhiệm duy nhất kết thúc ở đây. về02. các bài viết liên quan hỗ trợ tôi trong blog tương lai .

56 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress