1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO CÁO THI CUỐI KÌ MÔN HỌC PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG THÔNG TIN

56 56 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 56
Dung lượng 1,25 MB

Nội dung

10.Interpreter patternMẫu này được sử dụng để thiết kế các thành phần mà thông dịch các chương trình được viết trong một ngôn ngữ chuyên dụng.. Phân tích hệ thống được thực hiện với mục

Trang 1

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

Trang 2

MỤC LỤC

PART 1: QUESTION 1

I Q1: Styles of software architecture 1

II Q2: Steps for analysis 10

III Q3: Steps for design (cohesion, coupling….give example, Relationship, code…) 19

IV Q4: 3 Layer architecture style & MVC 24

V Q5: DAO? Why? class diagram & code for DAO Review Appendix B1 & Explain diagram 28 VI Q6: Database design 39

VII Q7: Interface design (principles…) 47

Trang 3

PART 1: QUESTION

I Q1: Styles of software architecture

Một mô hình kiến trúc là một giải pháp chung, có thể tái sử dụng cho một vấn đề thường xảy ra trong kiến trúc phần mềm trong một ngữ cảnh nhất định Các mẫu kiến trúc tương tự như mẫu thiết kế phần mềm nhưng có phạm vi rộng hơn

Trong đây em sẽ giới thiệu ngắn gọn 10 mẫu kiến trúc phổ biến hiện nay

Phổ biến nhất là hệ thống thông tin chung gồm 4 tầng như sau:

- Tầng trình diễn – Presentation layer (còn được gọi là UI layer)

- Tầng ứng dụng – Application layer (còn được gọi là service layer)

- Tầng xử lý logic nghiệp vụ – Business logic layer (còn được gọi là domain layer)

Trang 4

- Tầng truy suất dữ liệu – Data access layer (còn được gọi là persistence layer)

Sử dụng:

- Các ứng dụng desktop nói chung

- Các ứng dụng web thương mại điện tử

2 Client-server pattern

Mẫu này bao gồm 2 thành phần; một server và nhiều clients Thành phần server

sẽ cung cấp các dịch vụ cho nhiều thành phần client Các client gửi yêu cầu các dịch vụ lên server và server cung cấp các dịch vụ tương ứng cho các client đó Ngoài ra, server tiếp tục lắng nghe các yêu cầu từ client

Sử dụng:

Các ứng dụng online như email, chia sẻ document và banking

Trang 5

3 Master-slave pattern

Mẫu này bao gồm 2 phần; master and slaves Thành phần master phân phối công việc giữa các thành phần slave giống nhau và tính toán ra kết quả cuối cùng từ các kết quả mà các slave trả về

Trang 6

4 Pipe-filter pattern

Mẫu này có thể được sử dụng trong các hệ thống cấu trúc mà gồm các thủ tục và

xử lý 1 luồng dữ liệu Mỗi bước xử lý được khép kín bên trong 1 thành phần lọc(filter) Dữ liệu cần xử lý được truyền qua đường ống (pipes) Các đường ống này có thể được sử dụng cho việc buffer hoặc cho mục đích đồng bộ hóa

Các server publish các năng lực của nó (các dịch vụ và các thuộc tính) cho broker Các client yêu cầu 1 dịch vụ từ broker và broker sẽ điều hướng client tớidịch vụ phù hợp tương ứng từ bộ đăng ký của nó

Sử dụng

- Phần mềm Message broker như Apache ActiveMQ, Apache Kafka,

RabbitMQ and JBoss Messaging

Trang 7

6 Peer-to-peer pattern

Trong mẫu này, các thành phần riêng lẻ còn được gọi là các peer Các peer có thể hoạt động giống như các client, yêu cầu các dịch vụ từ các peer khác, và cũng giống như 1 server, cung cấp các dịch vụ cho các peer khác Một peer có thể đóng vai là 1 client hoặc như một server hoặc đóng vai trò cả 2 và nó có thể thay đổi vai trò linh động tùy theo thời điểm

Sử dụng

- Các mạng chia sẻ file như Gnutella và G2

- Các giao thức Multimedia như P2PTV và PDTP

Trang 8

7 Event-bus pattern

Mẫu này phù hợp chính cho các sự kiện và có 4 thành phần chính; event source, event listener, channel và event bus Các nguồn (source) phát hành message trêncác kênh cụ thể ở trên event bus Các bộ lắng nghe (listener) đăng ký nghe trên các kênh cụ thể Các bộ lắng nghe được notify có message mới được phát hành trên kênh mà nó đã đăng ký trước đó

Sử dụng

- Phát triển Android

- Dịch vụ Notification

Trang 9

8 Model-view-controller pattern

Mẫu này còn được gọi là mẫu MVC, chia ứng dụng tương tác thành 3 phần, gồm

- model - là bộ phận có chức năng lưu trữ toàn bộ dữ liệu của ứng dụng

- view - đây là phần giao diện (theme) dành cho người sử dụng

- controller - bộ phận có nhiệm vụ xử lý các yêu cầu người dùng đưa đến thông qua view Từ đó, C đưa ra dữ liệu phù hợp với người dùng

Mẫu này giúp chia tách các tầng trình diễn thông tin nội bộ khỏi các thông tin được biểu diễn cho và chấp nhận bởi người dùng Nó phân tách sự phụ thuộc các thành phần và cho phép tái sử dụng code hiệu quả hơn

Sử dụng

- Kiến trúc cho các ứng dụng World Wide Web trong hầu hết các ngôn ngữ lập trình chính

Trang 10

- knowledge source - các modules đặc biệt với biểu diễn riêng của nó

- control component - lựa chọn, cấu hình và thực thi các module

Tất cả các thành phần có quyền truy cập tới blackboard Các thành phần có thể tạo

ra đối tượng dữ liệu mới và được thêm vào blackboard Các thành phần tìm kiếm các loại dữ liệu cụ thể trên blackboard, và có thể tìm chúng theo các mẫu phù hợp với những nguồn kiến thức đang tồn tại

Trang 11

10.Interpreter pattern

Mẫu này được sử dụng để thiết kế các thành phần mà thông dịch các chương trình được viết trong một ngôn ngữ chuyên dụng Mục đích chính nó chỉ rõ cách đánh giá các dòng chương trình, được biết như các câu hoặc các công thức được viết trong ngôn ngữ cụ thể Ý tưởng cơ bản là có 1 lớp cho từng ký hiệu ngôn ngữ

Sử dụng

- Ngôn ngữ truy vấn CSDL như SQL

- Các ngôn ngữ được sử dụng để mô tả các giao thức truyền thông

Trang 12

II Q2: Steps for analysis

 Phân tích hệ thống là một quá trình thu thập và diễn giải các dữ kiện, xác định

các vấn đề và phân rã một hệ thống thành các thành phần của nó

Phân tích hệ thống được thực hiện với mục đích nghiên cứu một hệ thống hoặc các bộ phận của nó để xác định các mục tiêu của nó Đây là một kỹ thuật giải quyết vấn đề nhằm cải thiện hệ thống và đảm bảo rằng tất cả các thành phần của

hệ thống hoạt động hiệu quả để hoàn thành mục đích của chúng

Trang 13

+ Mô tả chi tiết ca sử dụng

+ Xây dựng biểu đồ giao tiếp

+ Xây dựng biểu đồ hoạt động

o Yêu cầu phi chức năng

+ Thao tác, hiệu năng, bảo mật, văn hóa, chính trị,…

+ Phác họa giao diện người dùng

2 Phân tích yêu cầu

- Viết tài liệu đặc tả yêu cầu phần mềm

 Phân tích có cấu trúc (Structured analysis) là gì?

Phân tích có cấu trúc là một phương pháp phát triển cho phép người phân tích hiểu

hệ thống và các hoạt động của nó một cách hợp lý Đây là một cách tiếp cận có hệ thống, sử dụng các công cụ đồ họa để phân tích và tinh chỉnh các mục tiêu của hệ

Trang 14

thống hiện có và phát triển một đặc tả hệ thống mới mà người dùng có thể dễ dàng hiểu được.

Nó có các đặc điểm sau:

 Nó là đồ họa chỉ định cách trình bày của ứng dụng

 Nó phân chia các quá trình để đưa ra một bức tranh rõ ràng về luồng hệ thống

 Nó mang tính logic hơn là tính vật lý, tức là các phần tử của hệ thống không phụ thuộc vào nhà cung cấp hoặc phần cứng

 Đây là một cách tiếp cận hoạt động từ tổng quan cấp cao đến chi tiết cấp thấphơn

 Công cụ phân tích có cấu trúc (Structured analysis tool)

Trong quá trình Phân tích có cấu trúc, nhiều công cụ và kỹ thuật khác nhau được sửdụng để phát triển hệ thống:

 Sơ đồ luồng dữ liệu (Data Flow Diagrams –DFD)

 Từ điển dữ liệu (Data Dictionary)

 Cây quyết định (Decision Trees)

 Bảng Quyết định (Decision Tables)

 Tiếng Anh có cấu trúc (Structured English)

 Mã giả (pseudocode)

Trang 15

 Sơ đồ luồng dữ liệu (Data Flow Diagrams –DFD) hoặc Biểu đồ bong bóng

 Nó cung cấp một cái nhìn tổng quan về dữ liệu mà một hệ thống xử lý,

những chuyển đổi nào được thực hiện, những dữ liệu nào được lưu trữ, những kết quả nào được tạo ra và chúng lưu chuyển đến đâu

a, Các yếu tố cơ bản của DFD

DFD dễ hiểu và khá hiệu quả khi thiết kế cần thiết không rõ ràng và người dùng muốn có một ngôn ngữ ký hiệu để giao tiếp Tuy nhiên, nó đòi hỏi một số lượng lớn các lần lặp để có được giải pháp chính xác và đầy đủ nhất

Trang 16

Bảng sau đây cho thấy các ký hiệu được sử dụng trong thiết kế DFD và ý nghĩa củachúng

Hình chữ nhật

b, Các loại DFD

Nó phụ thuộc vào việc cài đặt Nó cho

thấy những chức năng nào được thực

hiện

Nó là độc lập với việc cài đặt Nó chỉ tập trung vào luồng dữ liệu giữa các quytrình

Nó cung cấp thông tin chi tiết về phần

cứng, phần mềm, tệp và con người ở mức

độ thấp

Nó giải thích các sự kiện của hệ thống

và dữ liệu theo yêu cầu của mỗi sự kiện

Nó mô tả cách hệ thống hiện tại hoạt

động và cách một hệ thống sẽ được cài

đặt

Nó chỉ ra cách thức hoạt động của nghiệp vụ; không phải làm thế nào hệ thống có thể được cài đặt

 Sơ đồ ngữ cảnh (Context Diagram)

Một sơ đồ ngữ cảnh giúp hiểu toàn bộ hệ thống bằng một DFD cung cấp cho bạn cái nhìn tổng quan về một hệ thống Nó bắt đầu với việc đề cập đến các quy trình

Trang 17

chính với một số chi tiết nhỏ và sau đó chuyển sang cung cấp thêm chi tiết về các quy trình với cách tiếp cận từ trên xuống.

Sơ đồ ngữ cảnh của quản lý nhà ăn (mess management) được hiển thị bên dưới

 Từ điển dữ liệu (Data Dictionary)

Từ điển dữ liệu là một kho lưu trữ có cấu trúc các phần tử dữ liệu trong hệ thống

Nó lưu trữ mô tả của tất cả các phần tử dữ liệu DFD gồm chi tiết và định nghĩa về luồng dữ liệu, kho dữ liệu, dữ liệu được lưu trữ trong kho dữ liệu và các quy trình

Từ điển dữ liệu cải thiện giao tiếp giữa nhà phân tích và người dùng Nó đóng một vai trò quan trọng trong việc xây dựng cơ sở dữ liệu Hầu hết các DBMS đều có từ điển dữ liệu như một tính năng tiêu chuẩn Ví dụ, hãy tham khảo bảng sau:

 Cây quyết định (Decision Trees)

Cây quyết định là một phương pháp để xác định các mối quan hệ phức tạp bằng cách mô tả các quyết định và tránh các vấn đề trong giao tiếp Cây quyết định là

Trang 18

một sơ đồ thể hiện các hành động và điều kiện thay thế trong khuôn khổ cây ngang.

Do đó, nó mô tả các điều kiện cần xem xét đầu tiên, thứ hai, v.v

Cây quyết định mô tả mối quan hệ của từng điều kiện và các hành động được phép của chúng Một nút hình vuông biểu thị một hành động và một nút tròn biểu thị mộtđiều kiện Nó buộc các nhà phân tích phải xem xét trình tự của các quyết định và xác định quyết định thực tế cần phải đưa ra

Hạn chế chính của cây quyết định là nó thiếu thông tin trong định dạng của nó để

mô tả những kết hợp điều kiện nào khác mà bạn có thể thực hiện để kiểm tra Nó là một đại diện duy nhất của các mối quan hệ giữa các điều kiện và hành động

Ví dụ, hãy tham khảo cây quyết định sau:

 Bảng Quyết định (Decision Tables)

Bảng quyết định là một phương pháp mô tả mối quan hệ logic phức tạp một cách chính xác và dễ hiểu

Trang 19

 Nó hữu ích trong các tình huống mà các hành động phụ thuộc vào sự xuất hiện của một hoặc một số kết hợp các điều kiện độc lập

 Nó là một ma trận chứa hàng hoặc cột để xác định một vấn đề và các hành động

Các mục trong bảng quyết định được đưa ra bởi Quy tắc quyết định (Decision Rules) xác định mối quan hệ giữa các tổ hợp điều kiện và các quá trình hành động Trong phần quy tắc

Y cho thấy sự tồn tại của một điều kiện

N đại diện cho điều kiện không được thỏa mãn

Một khoảng trống (A blank) - hành động sẽ được bỏ qua

Trang 20

 Tiếng Anh có cấu trúc (Structured English)

Tiếng Anh cấu trúc có nguồn gốc từ ngôn ngữ lập trình có cấu trúc giúp mô tả quy trình dễ hiểu và chính xác hơn Nó dựa trên logic thủ tục sử dụng các câu xây dựng

và mệnh lệnh được thiết kế để thực hiện thao tác cho hành động

 Nó được sử dụng tốt nhất khi các chuỗi và vòng lặp trong một chương trình phải được xem xét và vấn đề cần các chuỗi hành động với các quyết định

 Nó không có quy tắc cú pháp nghiêm ngặt Nó thể hiện tất cả logic về cấu trúc quyết định tuần tự và sự lặp lại

Ví dụ, hãy xem chuỗi hành động sau:

 Mã giả (Pseudocode)

Mã giả không tuân theo bất kỳ ngôn ngữ lập trình nào và diễn đạt logic bằng tiếng Anh đơn giản

Trang 21

 Nó có thể chỉ định logic lập trình vật lý mà không cần mã hóa thực tế trong

và sau khi thiết kế vật lý

 Nó được sử dụng kết hợp với lập trình có cấu trúc

 Nó thay thế các sơ đồ của một chương trình

 Hướng dẫn lựa chọn công cụ thích hợp

Sử dụng các nguyên tắc sau để chọn công cụ thích hợp nhất phù hợp với yêu cầu của bạn

 Sử dụng DFD ở phân tích cấp cao hoặc cấp thấp để cung cấp tài liệu hệ thống tốt

 Sử dụng từ điển dữ liệu để đơn giản hóa cấu trúc nhằm đáp ứng yêu cầu dữ liệu của hệ thống

 Sử dụng tiếng Anh có cấu trúc nếu có nhiều vòng lặp và hành động phức tạp

 Sử dụng các bảng quyết định khi có một số lượng lớn các điều kiện cần kiểmtra và logic phức tạp

 Sử dụng cây quyết định khi trình tự các điều kiện là quan trọng và nếu có ít điều kiện cần được kiểm tra

III Q3: Steps for design (cohesion, coupling….give example, Relationship,

code…)

 Thiết kế hệ thống là giai đoạn thu hẹp khoảng cách giữa miền vấn đề và hệ thống hiện có theo cách có thể quản lý được Giai đoạn này tập trung vào miền giải pháp, tức là "làm thế nào để cài đặt?"

Đây là giai đoạn mà tài liệu SRS được chuyển đổi thành một định dạng có thể được thực hiện và quyết định cách hệ thống sẽ hoạt động

Trong giai đoạn này, hoạt động phức tạp của phát triển hệ thống được chia thành nhiều hoạt động phụ nhỏ hơn, chúng phối hợp với nhau để đạt được mục tiêu chính của phát triển hệ thống

Trang 22

1 Thiết kế kiến trúc

- Lựa chọn công nghệ mạng cho hệ thống

- Thiết kế tương tranh và an toàn bảo mật

- Phân rã hệ thống thành các hệ thống con

- Xây dụng biểu đồ gói

2 Thiết kế chi tiết

- Xây dựng mô hình lớp thiết kế

- Xây dựng lược đồ cơ sở dữ liệu

- Thiết kế giao diện người dùng

 Mô hình mối quan hệ thực thể (Entity Relationship Model)

Nó là một kỹ thuật được sử dụng trong thiết kế cơ sở dữ liệu giúp mô tả mối quan

hệ giữa các thực thể khác nhau của một tổ chức Các thuật ngữ được sử dụng trong

Thuộc tính (ATTRIBUTES) - Nó chỉ định các thuộc tính của các mối quan hệ Ví dụ: mã nhà cung cấp, tên sinh viên Các ký hiệu được sử dụng trong mô hình E-R

và ý nghĩa tương ứng của chúng

Thực thểThực thể yếu

Trang 23

(Ex: Từ dob -> age)

E2 tham gia đầy đủ trong R

Số lượng tham gia E1:E2 = 1:N

Trang 24

Ba loại mối quan hệ có thể tồn tại giữa hai tập dữ liệu: một-một, một-nhiều và nhiều-nhiều.

 Coupling

Kết nối là thước đo tính độc lập của các thành phần Nó xác định mức độ phụ thuộc của từng mô-đun phát triển hệ thống vào mô-đun khác Trong thực tế, điều này có nghĩa là sự kết hợp giữa các mô-đun trong hệ thống càng mạnh thì việc triển khai và duy trì hệ thống càng khó khăn hơn

Mỗi mô-đun phải có giao diện đơn giản, gọn gàng với các mô-đun khác và số lượng phần tử dữ liệu tối thiểu phải được chia sẻ giữa các mô-đun

- High Coupling

Các loại hệ thống này có sự kết nối với nhau với các đơn vị chương trình phụ thuộc vào nhau Những thay đổi đối với một hệ thống con dẫn đến tác động lớn đến hệ thống con khác

- Low Coupling

Loại hệ thống này được tạo thành từ các thành phần độc lập hoặc gần như độc lập Một thay đổi trong một hệ thống con không ảnh hưởng đến bất kỳ

hệ thống con nào khác

Trang 25

- Coupling Measures

Sự gắn kết ngẫu nhiên được tìm thấy trong một thành phần mà các phần của

nó không liên quan đến phần khác

+ Logical Cohesion − Nó là nơi một số chức năng hoặc phần tử dữ liệu liên quan đến logic được đặt trong cùng một thành phần

+ Temporal Cohesion − Là khi một thành phần được sử dụng để khởi tạo hệ thống hoặc tập hợp các biến thực hiện một số chức năng theo trình tự, nhưngcác chức năng có liên quan với nhau theo thời gian liên quan

+ Procedurally Cohesion − Đó là khi các chức năng được nhóm lại với nhau trong một thành phần chỉ để đảm bảo thứ tự này

+ Sequential Cohesion − Là khi đầu ra từ một phần của một thành phần là đầu vào cho phần tiếp theo của nó

 Cohesion

Sự gắn kết là thước đo mức độ chặt chẽ của mối quan hệ giữa các thành phần của nó Nó xác định mức độ phụ thuộc của các thành phần của một mô-đun vào nhau Trong thực tế, điều này có nghĩa là nhà thiết kế hệ thống phải đảm bảo rằng

- Họ không chia các quy trình thiết yếu thành các mô-đun phân mảnh

- Chúng không tập hợp các quá trình không liên quan với nhau được biểu diễndưới dạng các quá trình trên DFD thành các mô-đun vô nghĩa

Trang 26

- Các mô-đun tốt nhất là những mô-đun được gắn kết về mặt chức năng Các mô-đun tồi tệ nhất là những mô-đun được gắn kết một cách ngẫu nhiên.The worst degree of cohesion

Sự gắn kết ngẫu nhiên được tìm thấy trong một thành phần mà các phần của nó không liên quan đến phần khác

+ Logical Cohesion - Nó là nơi một số chức năng hoặc phần tử dữ liệu liên quan đến logic được đặt trong cùng một thành phần

+ Temporal Cohesion - Là khi một thành phần được sử dụng để khởi tạo hệ thống hoặc tập hợp các biến thực hiện một số chức năng theo trình tự, nhưng các chức năng có liên quan với nhau theo thời gian liên quan

+ Procedurally Cohesion - Đó là khi các chức năng được nhóm lại với nhau trong một thành phần chỉ để đảm bảo thứ tự này

+ Sequential Cohesion - Là khi đầu ra từ một phần của một thành phần là đầu vào cho phần tiếp theo của nó

IV Q4: 3 Layer architecture style & MVC

1 3 Layer architecture style

 Mô hình 3-layer gồm có 3 phần chính :

Trang 27

- Presentation Layer (GUI) : Lớp này có nhiệm vụ chính giao tiếp với người dùng Nó gồm các thành phần giao diện ( win form, web form,…) và thực hiện các công việc như nhập liệu, hiển thị dữ liêu, kiểm tra tính đúng đắn dữliệu trước khi gọi lớp Business Logic Layer (BLL).

- Business Logic Layer (BLL) : Layer này phân ra 2 thành nhiệm vụ :

+ Đây là nơi đáp ứng các yêu cầu thao tác dữ liệu của GUI layer, xử lý chính nguồn dữ liệu từ Presentation Layer trước khi truyền xuống Data Access Layer

và lưu xuống hệ quản trị CSDL

+ Đây còn là nơi kiểm tra các ràng buộc, tính toàn vẹn và hợp lệ dữ liệu, thực hiện tính toán và xử lý các yêu cầu nghiệp vụ, trước khi trả kết quả về

Presentation Layer

- Data Access Layer (DAL) : Lớp này có chức năng giao tiếp với hệ quản trị CSDL như thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu ( tìm kiếm, thêm, xóa, sửa,…)

 Ưu điểm

- Việc phân chia thành từng lớp giúp cho code được tường minh hơn Nhờ vào việc chia ra từng lớp đảm nhận các chức năng khác nhau và riêng biệt như giao diện, xử lý, truy vấn thay vì để tất cả lại một chỗ Nhằm giảm sự kết dính

- Dễ bảo trì khi được phân chia, thì một thành phần của hệ thống sẽ dễ thay đổi Việc thay đổi này có thể được cô lập trong 1 lớp, hoặc ảnh hưởng đến lớp gần nhất mà không ảnh hưởng đến cả chương trình

- Dễ phát triển, tái sử dụng: khi chúng ta muốn thêm một chức năng nào đó thì việc lập trình theo một mô hình sẽ dễ dàng hơn vì chúng ta đã có chuẩn

để tuân theo Và việc sử dụng lại khi có sự thay đổi giữa hai môi trường ( Winform sang Webfrom ) thì chỉ việc thay đổi lại lớp GUI

Trang 28

- Dễ bàn giao Nếu mọi người đều theo một quy chuẩn đã được định sẵn, thì công việc bàn giao, tương tác với nhau sẽ dễ dàng hơn và tiết kiệm được nhiều thời gian.

- Dễ phân phối khối lượng công việc Mỗi một nhóm, một bộ phận sẽ nhận một nhiệm vụ trong mô hình 3 lớp Việc phân chia rõ ràng như thế sẽ giúp các lập trình viên kiểm soát được khối lượng công việc của mình

2 MVC (Model - View - Controller)

 Trước tiên MVC được viết tắt từ 3 chữ (Model-View-Controller) là một design pattern nhằm phân tách các phần trong một ứng dụng ra các thành phần riêng biệt Cụ thể nó sẽ đưa các phần xử lý logic và business (Model) ra khỏi phần giao diện (View) từ đó giúp việc quản lý và mở rộng code trở nên dễ dàng hơn

Ngày đăng: 06/02/2022, 05:50

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w