Thực hiện nhiệm vụ học tập của nhà trường trong đợt thực tập tốt nghiệp, được sự đồng ý của ban lãnh đạo Khoa Viễn Thông 1 và các giảng viên hướng dẫn. Bám sát đề cương của Khoa đưa ra, những lý luận và kiến thức đã học. Trong quá trình thực tập tại Trung tâm Nghiên cứu và Phát triển Samsung Việt Nam (SRV), em đã được trau dồi thêm kiến thức về ngành viễn thông nói chung, mảng lập trình nói riêng cũng như cơ cấu và tình hình hoạt động của công ty nơi em được thực tập. Được sự tận tình giúp đỡ hướng dẫn của các giảng viên Khoa Viễn Thông 1 cùng với giáo viên hướng dẫn thực tập tại công ty và nỗ lực học tập, tìm tòi học hỏi, em đã hoàn thành báo cáo thực tập tốt nghiệp của mình. Báo cáo này gồm 2 phần chính: Phần I: Giới thiệu về đơn vị thực tập Phần II: Nội dung thực tập
Tổng quan về đơn vị thực tập
Giới thiệu về đơn vị thực tập
• Tên đơn vị: Trung tâm nghiên cứu và phát triển Samsung Việt Nam
• Tên tiếng Anh: Samsung Research and Development Center Vietnam
• Địa chỉ: Tòa Samsung, Khu đô thị Tây Hồ Tây, đường Hoàng Minh Thảo, phường Xuân Tảo, quận Bắc Từ Liêm, Hà Nội, Bắc Từ Liêm, Bắc Từ Liêm
SRV là Trung tâm Nghiên cứu và Phát triển Điện lớn nhất của Tập đoàn Samsung tại Đông Nam Á, đóng vai trò là một trong những khoản đầu tư quan trọng nhất của Tổ hợp Samsung Việt Nam Chính thức hoạt động từ tháng 2/2012, SRV chuyên cung cấp các dịch vụ Nghiên cứu và Phát triển Phần mềm, Phần cứng cho nhiều sản phẩm như điện thoại thông minh, máy tính bảng và đồng hồ thông minh.
Lĩnh vực hoạt động
SRV hoạt động trong 4 lĩnh vực chính bao gồm:
Phát triển phần mềm thương mại hóa cho thiết bị thông minh của Samsung nhằm đáp ứng nhu cầu khắt khe từ thị trường và cung cấp gói phần mềm tối ưu cho từng khu vực.
Chúng tôi tập trung vào nghiên cứu và phát triển các giải pháp phần mềm tiên tiến cùng dịch vụ hiện đại, phục vụ cho người tiêu dùng và doanh nghiệp cả trong nước lẫn toàn cầu Mục tiêu của chúng tôi là trở thành nhà cung cấp dịch vụ phần mềm hàng đầu thế giới.
Đánh giá và đảm bảo chất lượng xuất sắc cho các gói phần mềm mạng và máy chủ trong hệ thống mạng 4G/5G, phục vụ nhu cầu của người tiêu dùng toàn cầu, thông qua việc áp dụng các công cụ tự động hóa thông minh.
Chúng tôi chuyên phát triển và thiết kế phần cứng, cơ khí cho tất cả các thiết bị và sản phẩm chủ lực của Samsung, đồng thời hỗ trợ quy trình sản xuất phần cứng chuyên dụng tại các nhà máy SEV/T tại Việt Nam.
Nội dung thực tập
Đào tạo kĩ năng giải thuật cơ bản
1.1 Thuật toán và các thành phần cơ bản của thuật toán
Thuật toán là chuỗi các bước thực hiện theo thứ tự nhất định nhằm giải quyết một bài toán, chuyển từ trạng thái đầu vào ban đầu đến trạng thái đầu ra mong muốn.
- Các thành phần chính của thuật toán bao gồm:
1 Đầu vào (Input): Đây là dữ liệu mà thuật toán cần để thực hiện công việc Dữ liệu này có thể là số, văn bản, hình ảnh, hoặc bất kỳ dạng dữ liệu nào liên quan đến vấn đề cần giải quyết
2 Đầu ra (Output): Đây là kết quả mà thuật toán tạo ra sau khi hoàn thành quá trình xử lý Đầu ra thường liên quan trực tiếp đến mục tiêu mà thuật toán cố gắng đạt được
3 Bước xử lý (Processing Steps): Đây là chuỗi các bước cụ thể và logic mà thuật toán sẽ thực hiện trên dữ liệu đầu vào để tạo ra kết quả mong muốn Các bước này có thể bao gồm các phép toán số học, so sánh, lặp lại, và các thao tác khác liên quan đến loại vấn đề cụ thể
4 Lưu trữ (Memory/Storage): Một thuật toán có thể sử dụng bộ nhớ để lưu trữ tạm thời các giá trị trung gian hoặc dữ liệu quan trọng trong quá trình xử lý Điều này có thể cần thiết để thực hiện các phép toán trên dữ liệu hoặc để kiểm soát quá trình lặp lại
5 Điều kiện (Conditions): Thuật toán có thể phải thực hiện các quyết định dựa trên các điều kiện hoặc tiêu chí cụ thể Các điều kiện này quyết định liệu thuật toán có thực hiện một bước nhất định hay không, hoặc chọn một con đường xử lý khác
6 Lặp lại (Iteration/Loops): Trong một số trường hợp, thuật toán cần thực hiện một chuỗi các bước xử lý lặp lại một hoặc nhiều lần Điều này thường được thực hiện thông qua các vòng lặp (loops), cho phép thuật toán xử lý dữ liệu một cách lặp đi lặp lại cho đến khi đạt được điều kiện thoát khỏi vòng lặp
7 Điểm bắt đầu (Starting Point): Thuật toán cần biết từ đâu để bắt đầu thực hiện các bước xử lý Điểm bắt đầu này có thể là dữ liệu đầu vào ban đầu hoặc một vị trí cụ thể trong quá trình xử lý
8 Kết thúc (Termination): Một thuật toán cần có điều kiện dừng để xác định khi nào nó sẽ kết thúc việc thực hiện Điều này đảm bảo rằng thuật toán không tiếp tục thực hiện vô hạn mà sẽ kết thúc khi đã đạt được mục tiêu hoặc không còn cần thiết nữa
Các thành phần này cùng nhau tạo nên cấu trúc và logic của một thuật toán, giúp nó hoạt động hiệu quả để giải quyết vấn đề cụ thể
1.2 Cấu trúc dữ liệu sơ cấp: mảng, chuỗi, ngăn xếp, hàng đợi
Mảng (Array) là tập hợp các phần tử cùng kiểu dữ liệu, được lưu trữ trong các ô nhớ liên tục Các phần tử này có thể được truy cập thông qua chỉ số, với mảng kích thước N có chỉ số từ 0 đến N – 1.
Tất cả các mảng đều bao gồm các vị trí nhớ liền kề, với địa chỉ thấp nhất tương ứng với phần tử đầu tiên và địa chỉ cao nhất tương ứng với phần tử cuối cùng Một trong những ưu điểm nổi bật của mảng là khả năng truy cập nhanh đến các phần tử nhờ vào cấu trúc liên tiếp trong bộ nhớ.
• Truy câp phàn tử vơi thời gian hằng số O(1)
• Sử dụng bộ nhớ hiệu quả
• Tính cục bộ về bộ nhớ
• Không thể thay đổi kích thước của mảng khi chương trình đang thực hiện
Chuỗi là một tập hợp các ký tự được lưu trữ trong các ô nhớ liên tiếp, với một ký tự null (\0) để đánh dấu sự kết thúc của chuỗi.
Các hoạt động trên chuỗi bao gồm trích xuất, cắt, nối, tìm kiếm và sắp xếp các ký tự
Chuỗi thường hỗ trợ các thao tác xử lý văn bản và biểu diễn ngôn ngữ tự nhiên Ưu điểm của chuỗi:
• Các phép toán tích hợp
• Thao tác trên chuỗi có thể tốn thời gian và tài nguyên, đặc biệt là khi chuỗi có kích thước lớn
• Sử dụng chuỗi có thể dẫn đến vấn đề quản lý bộ nhớ, đặc biệt khi thêm/xóa ký tự hoặc khi tạo các bản sao của chuỗi
• Khó xử lý dữ liệu nhị phân
Ngăn xếp (stack) là một cấu trúc dữ liệu hoạt động theo nguyên tắc "Last In, First Out" (LIFO), có nghĩa là phần tử cuối cùng được thêm vào sẽ là phần tử đầu tiên được lấy ra.
Cách hoạt động cơ bản trên ngăn xếp:
• Push: Thêm một phần tử vào đỉnh của ngăn xếp
• Pop: Lấy ra phần tử ở đỉnh của ngăn xếp
• Top (Peek): Xem giá trị của phần tử ở đỉnh của ngăn xếp mà không loại bỏ nó
• IsEmpty: Kiểm tra xem ngăn xếp có rỗng hay không
• Size: Đếm số lượng phần tử trong ngăn xếp Ưu điểm của ngăn xếp:
• Dễ sử dụng: Các hoạt động trên ngăn xếp rất đơn giản và dễ hiểu, giúp quản lý thứ tự thực hiện các tác vụ
• Quản lý thứ tự: Ngăn xếp thường được sử dụng để duy trì thứ tự xử lý, đảm bảo rằng các tác vụ mới nhất được thực hiện trước
• Undo/Redo: Ngăn xếp thường được sử dụng trong các ứng dụng để hỗ trợ hoạt động undo và redo
Nhược điểm của ngăn xếp:
• Giới hạn kích thước: Ngăn xếp thường có giới hạn về kích thước, vượt quá giới hạn này có thể dẫn đến tràn bộ nhớ (stack overflow)
• Không phù hợp cho tìm kiếm phức tạp: Việc truy cập vào các phần tử khác ngoài đỉnh ngăn xếp có thể làm cho việc tìm kiếm phức tạp
Hàng đợi (queue) là một cấu trúc dữ liệu hoạt động theo nguyên tắc "First In, First Out" (FIFO), nghĩa là phần tử đầu tiên được thêm vào sẽ là phần tử đầu tiên được lấy ra.
Các hoạt động cơ bản trên hàng đợi:
• Enqueue (Push): Thêm một phần tử vào cuối hàng đợi
• Dequeue (Pop): Lấy ra phần tử ở đầu hàng đợi
• Front (Peek): Xem giá trị của phần tử ở đầu hàng đợi mà không loại bỏ nó
• IsEmpty: Kiểm tra xem hàng đợi có rỗng hay không
• Size: Đếm số lượng phần tử trong hàng đợi Ưu điểm của hàng đợi:
• Dễ sử dụng: Các hoạt động trên hàng đợi thường rất đơn giản và dễ hiểu
• Quản lý thứ tự: Hàng đợi thường được sử dụng để quản lý thứ tự xử lý các tác vụ theo nguyên tắc FIFO
• Sử dụng trong lập lịch và đồng bộ hóa: Hàng đợi có thể được sử dụng để lập lịch các tác vụ hoặc đồng bộ hóa các tiến trình
Nhược điểm của hàng đợi:
• Hiệu suất: Một số hoạt động trên hàng đợi có thể tốn thời gian, đặc biệt khi hàng đợi có số lượng lớn phần tử
• Giới hạn kích thước: Hàng đợi thường có giới hạn về kích thước, vượt quá giới hạn này có thể dẫn đến tràn bộ nhớ (queue overflow)
1.3: Hướng dẫn gỡ lỗi khi triển khai thuật toán
Gỡ lỗi khi triển khai thuật toán là một bước thiết yếu trong phát triển phần mềm và xử lý dữ liệu Để gỡ lỗi hiệu quả, bạn cần tuân thủ một số hướng dẫn cụ thể.
Đào tạo kỹ năng giải thuật lập trình
2.1: Giới thiệu về đồ thị: Đồ thị vô hướng, đồ thị có trọng số Đồ thị là một khái niệm quan trọng trong lĩnh vực toán học và khoa học máy tính Nó mô tả một tập hợp các điểm (gọi là đỉnh hoặc nút) và các kết nối giữa chúng (gọi là cạnh) Đồ thị thường được sử dụng để mô hình hóa mối quan hệ hoặc liên kết giữa các đối tượng khác nhau
Có hai loại chính của đồ thị: đồ thị vô hướng và đồ thị có hướng
Đồ thị vô hướng là loại đồ thị trong đó các cạnh không có hướng, nghĩa là nếu có cạnh nối từ đỉnh A đến đỉnh B thì cũng tồn tại cạnh nối từ đỉnh B đến đỉnh A Thông thường, đồ thị vô hướng được biểu diễn bằng các đường thẳng nối các đỉnh mà không sử dụng mũi tên để chỉ hướng.
Đồ thị có trọng số là loại đồ thị trong đó mỗi cạnh được gán một trọng số hoặc giá trị, thể hiện thông tin liên quan đến mối quan hệ giữa các đỉnh Chẳng hạn, trong mạng giao thông, trọng số có thể biểu thị khoảng cách giữa các địa điểm, và trọng số này có thể là số thực hoặc số nguyên.
• Ví dụ về đồ thị vô hướng và đồ thị có trọng số: Đồ thị vô hướng: Đỉnh: {A, B, C, D}
Trong trường hợp này, các cạnh không có hướng và chỉ biểu diễn mối quan hệ giữa các đỉnh Đồ thị có trọng số: Đỉnh: {A, B, C, D}
Trong trường hợp này, các cạnh không chỉ biểu diễn mối quan hệ giữa các đỉnh mà còn có trọng số tương ứng cho mỗi cạnh
Khi làm việc với đồ thị có trọng số, việc áp dụng các thuật toán đồ thị phức tạp là cần thiết để tính toán đường đi ngắn nhất, cây bao trùm tối thiểu và giải quyết các vấn đề liên quan khác.
Thuật toán Dijkstra là một công cụ quan trọng trong lý thuyết đồ thị, được sử dụng để xác định đường đi ngắn nhất từ một đỉnh gốc đến tất cả các đỉnh khác trong đồ thị có trọng số không âm Thuật toán này rất hữu ích trong việc giải quyết các vấn đề như tìm đường đi ngắn nhất trong mạng giao thông, mạng máy tính, và các ứng dụng khác cần tối ưu hóa lộ trình.
Bước đầu tiên trong thuật toán là khởi tạo khoảng cách từ đỉnh gốc đến chính nó là 0, đồng thời thiết lập khoảng cách nhỏ nhất ban đầu tới các đỉnh khác là vô cùng lớn (+∞) Kết quả là ta có danh sách các khoảng cách tới các đỉnh khác.
Bước 2: Chọn đỉnh a có khoảng cách nhỏ nhất trong danh sách này và ghi nhận Các lần sau sẽ không xét tới đỉnh này nữa
Bước 3: Xem xét từng đỉnh kề b của đỉnh a Nếu khoảng cách từ đỉnh gốc đến đỉnh b nhỏ hơn giá trị hiện tại, hãy cập nhật giá trị và đỉnh kề a vào khoảng cách hiện tại của b.
Sau khi xem xét tất cả các đỉnh kề của đỉnh a, ta cập nhật danh sách khoảng cách tới các điểm Tiếp tục quay lại Bước 2 với danh sách đã cập nhật này Thuật toán sẽ kết thúc khi tìm ra khoảng cách nhỏ nhất từ tất cả các điểm.
Thuật toán Dijkstra có độ phức tạp thời gian O(V^2) trong phiên bản cơ bản, với V là số đỉnh trong đồ thị Tuy nhiên, khi sử dụng hàng đợi ưu tiên (min-heap), độ phức tạp có thể được cải tiến xuống O(E + V * log(V)), trong đó E là số cạnh trong đồ thị.
Thuật toán Dijkstra là một công cụ hữu ích để giải quyết các vấn đề tìm đường đi ngắn nhất trong các mạng với trọng số không âm
2.3: Thuật toán Depth-First Search
Thuật toán Depth-First Search (DFS) là một trong những thuật toán quan trọng trong lĩnh vực đồ thị, cho phép duyệt qua tất cả các đỉnh và cạnh theo chiều sâu DFS thường được áp dụng trong việc tìm kiếm, kiểm tra tính liên thông, xác định các thành phần liên thông và giải quyết nhiều bài toán khác liên quan đến đồ thị.
Mô tả cơ bản về thuật toán DFS:
Khởi tạo: Bắt đầu từ một đỉnh bất kỳ trong đồ thị
Duyệt đỉnh: Đánh dấu đỉnh hiện tại là đã duyệt Sau đó, kiểm tra tất cả các đỉnh kề với đỉnh hiện tại mà chưa được duyệt
Lặp lại bước 2 bằng cách chọn một đỉnh kề chưa được duyệt và thực hiện lại quy trình cho đỉnh đó Tiếp tục quá trình này cho đến khi không còn đỉnh kề nào chưa được kiểm tra.
Quay lui là quá trình trở về đỉnh gốc hoặc đỉnh trước đó sau khi đã duyệt qua tất cả các đỉnh kề của một đỉnh.
Lặp lại bước 2 và 3: Tiếp tục lặp lại bước 2 và 3 cho đến khi tất cả các đỉnh trong đồ thị đều đã được duyệt
DFS là một thuật toán tìm kiếm thường được thực hiện qua đệ quy hoặc ngăn xếp Khi áp dụng đệ quy, thuật toán sẽ tự động đi sâu vào các đỉnh cho đến khi không còn đỉnh nào để duyệt Ngược lại, khi sử dụng ngăn xếp, thuật toán sẽ duyệt qua một đỉnh, đánh dấu nó và đưa các đỉnh kề chưa được duyệt vào ngăn xếp để tiếp tục quá trình tìm kiếm.
DFS có nhiều ứng dụng quan trọng, bao gồm:
• Tìm kiếm trong đồ thị: DFS có thể được sử dụng để tìm kiếm một đỉnh cụ thể hoặc kiểm tra sự tồn tại của đỉnh trong đồ thị
• Kiểm tra liên thông: DFS có thể xác định xem một đồ thị có liên thông hay không
• Tìm thành phần liên thông: DFS có thể giúp xác định các thành phần liên thông riêng biệt trong một đồ thị
• Topological Sort: DFS có thể sử dụng để thực hiện sắp xếp topological trên các đồ thị có hướng
• Thuật toán tìm đường đi: DFS có thể được sử dụng để tìm đường đi giữa hai đỉnh trong đồ thị
Thuật toán Tuy DFS là một công cụ mạnh mẽ và linh hoạt, tuy nhiên, cần lưu ý để không rơi vào vòng lặp vô tận khi làm việc với đồ thị vô hướng có chu trình.
2.4: Thuật toán Breadth-First Search
Thuật toán Breadth-First Search (BFS) là một công cụ quan trọng trong lĩnh vực đồ thị, cho phép duyệt qua tất cả các đỉnh và cạnh theo chiều rộng BFS tìm kiếm các đỉnh và cạnh xa đỉnh gốc trước khi tiếp cận những phần gần hơn, thường được áp dụng để tìm đường đi ngắn nhất trong đồ thị có trọng số không âm, kiểm tra tính liên thông và giải quyết nhiều bài toán khác liên quan đến đồ thị.
Mô tả cơ bản về thuật toán BFS:
Khởi tạo: Bắt đầu từ một đỉnh bất kỳ trong đồ thị Đánh dấu đỉnh này là đã duyệt và đưa nó vào hàng đợi (queue)
Đào tạo kĩ năng sử dụng Office
Kỹ năng sử dụng Microsoft Office và các ứng dụng văn phòng khác là rất quan trọng trong nhiều công việc và hoạt động hàng ngày Để sử dụng Microsoft Office hiệu quả, người dùng cần nắm vững một số kỹ năng cơ bản.
Microsoft Word là một công cụ soạn thảo văn bản phổ biến, cho phép người dùng làm việc với văn bản thô, hiệu ứng phông chữ, màu sắc, hình ảnh đồ họa và các hiệu ứng đa phương tiện như âm thanh và video Ngoài ra, Microsoft Word còn hỗ trợ kiểm tra chính tả và ngữ pháp cho nhiều ngôn ngữ khác nhau, giúp người dùng dễ dàng hơn trong quá trình soạn thảo.
Các tính năng chính của Microsoft Word bao gồm:
Word giúp bạn dễ dàng tạo và chỉnh sửa văn bản, cho phép nhập liệu, xóa, sửa, sao chép và dán nội dung trong tài liệu một cách thuận tiện.
Word cung cấp nhiều công cụ định dạng cho phép bạn tùy chỉnh kiểu chữ, kích thước, màu sắc và căn chỉnh văn bản, giúp bạn tạo tiêu đề, đoạn văn, danh sách đánh số và các phần tử văn bản khác một cách dễ dàng.
Word cho phép người dùng chèn hình ảnh, biểu đồ, bảng, clipart và nhiều đối tượng khác vào tài liệu Bạn có thể dễ dàng tùy chỉnh vị trí và kích thước của các đối tượng này để phù hợp với nội dung của mình.
Trong Word, bạn có thể chèn nhiều loại phần tử vào tài liệu, bao gồm tiêu đề, chú thích hình ảnh, chú thích bàn luận, thư mục và các phần tử khác, ngoài hình ảnh và đối tượng.
Word cung cấp nhiều mẫu trang bìa và tài liệu giúp bạn nhanh chóng tạo ra các tài liệu chuyên nghiệp.
Word cung cấp chức năng kiểm tra chính tả và ngữ pháp, hỗ trợ người dùng phát hiện và sửa các lỗi ngôn ngữ trong tài liệu một cách hiệu quả.
• In ấn và chia sẻ: Bạn có thể in ấn tài liệu từ Word hoặc chia sẻ tài liệu thông qua email hoặc lưu trữ trực tuyến
• Tạo biểu đồ và sơ đồ: Word cung cấp các công cụ để tạo biểu đồ và sơ đồ trực quan trong tài liệu của bạn
Microsoft Word là một công cụ mạnh mẽ và phổ biến cho việc tạo và định dạng văn bản cũng như tài liệu Nó được sử dụng rộng rãi trong các môi trường văn phòng, giáo dục và cá nhân.
Excel là một phần mềm xử lý bảng tính, bao gồm nhiều ô được sắp xếp theo hàng và cột Chương trình cho phép người dùng nhập dữ liệu và tạo công thức tính toán một cách dễ dàng.
Excel có nhiều tính năng ưu việt, giao diện đơn giản và dễ sử dụng, chủ yếu phục vụ cho việc thiết lập, xử lý bảng và thực hiện các phép tính theo hàm.
Các tính năng chính của Microsoft Excel bao gồm:
Excel cho phép người dùng tạo và quản lý bảng tính, trong đó mỗi bảng tính được cấu thành từ hàng và cột Mỗi ô trong bảng tính chứa một giá trị hoặc dữ liệu cụ thể.
Trong Excel, bạn có thể nhập liệu vào các ô trong bảng tính với nhiều loại dữ liệu như số, văn bản, và ngày tháng Ngoài ra, Excel cung cấp tính năng định dạng dữ liệu, cho phép bạn thay đổi phông chữ, kích thước, màu sắc và kiểu định dạng để tạo sự hấp dẫn cho bảng tính của mình.
Excel cung cấp nhiều công thức và hàm tính toán, giúp thực hiện các phép tính phức tạp một cách dễ dàng Các hàm như SUM cho phép tổng hợp dãy số, AVERAGE tính trung bình, và IF kiểm tra điều kiện để trả về giá trị tương ứng, cùng nhiều hàm hữu ích khác.
Excel cho phép người dùng tạo biểu đồ và đồ thị từ dữ liệu trong bảng tính, giúp hiển thị thông tin một cách trực quan và dễ hiểu Việc này không chỉ giúp nhận diện xu hướng mà còn làm nổi bật các mối quan hệ trong dữ liệu, nâng cao khả năng phân tích và ra quyết định.
Xây dựng dự án game bằng ngôn ngữ C++
4.1: Tìm hiểu về hướng đối tượng trong C++
Lập trình hướng đối tượng là một phương pháp lập trình giúp giải quyết các bài toán một cách hiệu quả, dễ phát triển và bảo trì Phương pháp này chia nhỏ chương trình thành các đối tượng và mối quan hệ giữa chúng Mỗi đối tượng sẽ có các thuộc tính (dữ liệu) và hành vi (phương thức) riêng, có thể giống hoặc khác nhau.
Trước khi khám phá hướng đối tượng trong C++, sinh viên cần nắm vững các kiến thức cơ bản như biến và hằng, kiểu dữ liệu cơ bản, mảng, con trỏ, tham chiếu, tham trị, cấu trúc dữ liệu và hàm Những kiến thức này là nền tảng quan trọng để tiếp cận và hiểu sâu về lập trình hướng đối tượng.
4.1.1: Các tính chất cơ bản
A.Tính đóng gói (Encapsulation) Đây là kỹ thuật giúp lập trình viên có thể che giấu đi những thông tin bên trong đối tượng bằng cách sử dụng phạm vi truy cập private cho các thuộc tính Muốn giao tiếp, lấy ra, sử dụng các thông tin này thì phải thông qua các phương thức public , từ đó sẽ hạn chế các lỗi khi phát triển một chương trình Ví dụ trong thực tế, ta không thể thấy được các thuộc tính thực của một người (tính cách, sở thích, các thông tin như chiều cao, cân năng, tuổi, ) Những điều mà ta biết đều thông qua các hành động của người đó, chẳng hạn như nói cho ta biết về tuổi, sở thích, Tuy nhiên, các thông tin này chưa chắc đã thực sự là thuộc tính thật của người đó (giống như việc các phương thức không trả về giá trị thực của thuộc tính mà trả về một giá trị khác)
Hình 1 Tính đóng gói (Encapsulation)
Những lợi ích mà tính đóng gói đem lại có thể kể đến như:
• Hạn chế được những truy xuất không hợp lệ tới thuộc tính của đối tượng
Để đảm bảo trạng thái của các đối tượng luôn chính xác và không bị thay đổi, việc kiểm soát thuộc tính là rất quan trọng Ví dụ, nếu thuộc tính gpa của lớp Student được định nghĩa là public, giá trị của nó có thể bị thay đổi dễ dàng mà không có sự kiểm soát Ngược lại, khi gpa được đặt là private và có hàm setGpa() để thiết lập giá trị, việc quản lý gpa sẽ trở nên an toàn và hiệu quả hơn.
19 luôn được đảm bảo tính chất của nó là không âm và nhỏ hơn hoặc bằng 4 Muốn thay đổi gpa, ta phải thông qua hàm này
• Ẩn đi những thông tin không cần thiết về đối tượng
• Cho phép thay đổi cấu trúc bên trong lớp mà không ảnh hưởng tới lớp khác Ví dụ ban đầu, ta thiết kế lớp Student giống như sau:
Hình 2 Thiết kế một lớp với hai thuộc tính private
Sau này, nếu muốn gộp 2 thuộc tính firstName và lastName thành fullName thì lớp Student sẽ giống như sau:
Hình 3 Thiết kế một lớp với một thuộc tính private
Cấu trúc lớp Student đã được thay đổi, nhưng các đối tượng sử dụng lớp này vẫn hoạt động bình thường vì chúng chỉ quan tâm đến phương thức getFullName() Nếu không có phương thức này, mọi nơi sử dụng thuộc tính firstName và lastName của lớp Student sẽ cần phải được sửa đổi.
Trong lập trình, có những trường hợp mà các đối tượng chia sẻ các thuộc tính và phương thức tương tự Chẳng hạn, khi phát triển một chương trình quản lý thông tin học sinh và giáo viên, học sinh cần lưu trữ các thông tin như tên, tuổi, địa chỉ và điểm số, trong khi giáo viên lại cần thông tin về tên, chuyên môn và số điện thoại.
20 tên, tuổi, địa chỉ, tiền lương Lúc này nếu viết chương trình riêng rẽ thì code sẽ trung lặp khá nhiều.
Kế thừa trong lập trình hướng đối tượng cho phép một lớp (ví dụ lớp A) thừa hưởng thuộc tính và phương thức từ một lớp khác (ví dụ lớp B) Điều này có nghĩa là lớp A sẽ sở hữu tất cả các đặc điểm của lớp B Ví dụ, chúng ta có thể tạo lớp Person và cho phép các lớp Student và Teacher kế thừa từ lớp này, giúp tối ưu hóa mã nguồn và tái sử dụng các thuộc tính chung.
Ta có thể xem hình dưới đây để hình dung rõ hơn:
Hình 4 Tính kế thừa (Inheritance)
Tính đa hình trong lập trình thể hiện sự linh hoạt của các đối tượng trong từng hoàn cảnh khác nhau Ví dụ, một người có thể đóng vai trò là nhân viên tại công ty và là khách hàng khi đi siêu thị Đa hình được chia thành ba hình thức khác nhau, cho phép các đối tượng và phương thức có nhiều dạng thức hoạt động.
• Đa hình với nạp chồng phương thức (Overloading):
Phương thức cộng có nhiều hình thái khác nhau, bao gồm cộng 2 số nguyên, cộng 2 số thức, và cộng 3 số nguyên Mặc dù đều thuộc cùng một phương thức, mỗi hình thái lại có những đặc điểm riêng biệt.
Hình 5 Đa hình với nạp chồng phương thức
• Đa hình với ghi đè phương thức (Overriding):
Ví dụ: phương thức getSalary() dùng để tính lương sẽ có các hình thái là tính lương cho quản lý, cho nhân viên,
Với nhân viên, ta viết các thuộc tính, phương thức như sau:
Hình 6 Ví dụ thiết kế lớp Employee
Quản lý, giống như nhân viên, cũng có tên và lương, nhưng lương của quản lý thường cao hơn nhờ vào thuộc tính private bonus Khi ghi đè (overriding), lớp Manager bao gồm hai thuộc tính cơ bản là name và salary, cùng với thuộc tính bonus bổ sung.
Hình 7 Thiết kế lớp Manager ghi đè lại phương thức của lớp Employee
• Đa hình thông qua các đối tượng đa hình (polymorphic objects):
Hình 8 Hàm makeSound() trả về kết quả khác nhau với mỗi đối tượng khác nhau
Các biến thuộc lớp cha có khả năng tham chiếu đến các đối tượng của lớp con, điều này cho thấy rằng biến trong lớp cha có nhiều hình thức khác nhau, từ đó thể hiện tính đa hình trong lập trình.
Hình 9 Đa hình thông qua các đối tượng đa hình
Trong ví dụ này, lớp cha là Animal có phương thức ảo là sound() (tiếng kêu) Các lớp con
Dog, Cat, Duck cũng có phương thức này nhưng hình thái là khác nhau vì mỗi con vật lại có một tiếng kêu khác nhau.
Tính chất này giúp người dùng tương tác với các thành phần của đối tượng một cách dễ dàng mà không cần hiểu sâu về cách thức hoạt động hay cách lập trình của chúng, chỉ cần nắm rõ chức năng của từng thành phần.
Khi rút tiền tại cây ATM, người dùng chỉ quan tâm đến tính năng rút tiền mà không cần biết cách hoạt động hay các thành phần bên trong Những thông tin không cần thiết như việc đếm tiền hay trừ tiền trong tài khoản đều được ẩn đi, giúp người dùng tập trung vào trải nghiệm rút tiền một cách dễ dàng và nhanh chóng.
Trong lập trình, khi sử dụng các phương thức của một đối tượng, người lập trình chỉ cần chú ý đến chức năng của phương thức mà không cần quan tâm đến cách thức cài đặt Điều này rất hữu ích trong môi trường làm việc nhóm, vì các thành viên chỉ cần biết đến chức năng mà không cần hiểu chi tiết về cài đặt Để đạt được tính trừu tượng, có thể sử dụng các lớp trừu tượng (abstract class) và giao diện (interface), vì chúng chỉ chứa phần khai báo mà không có phần cài đặt Interface có thể coi là một dạng lớp trừu tượng nhưng chỉ bao gồm các phương thức trừu tượng Ví dụ, lớp Customer có thể có một interface là ICustomer, và tất cả các đối tượng muốn tương tác với lớp Customer đều phải thông qua interface này.
4.1.2 Design Pattern Đây là một kỹ thuật trong lập trình hướng đối tượng Kỹ thuật này do các nhà nghiên cứu đi trước đúc kết lại, tạo thành các mẫu thiết kế chuẩn để lập trình viên có áp dụng, tối ưu chương trình của mình Trong thời gian thực tập, sinh viên được nghiên cứu 4 loại Design Pattern: RAII, Singleton, Observer, MVC Cụ thể như sau:
Kết luận
Trong quá trình thực tập, sinh viên đã nắm vững những kiến thức cơ bản về lập trình C/C++, bao gồm biến, hằng, hàm, con trỏ và các thuật toán Ngoài ra, sinh viên còn được tìm hiểu về lập trình hướng đối tượng trong C++ với bốn tính chất cơ bản: thừa kế, đa hình, trừu tượng và đóng gói, cùng với một số tính năng nổi bật như Design Pattern, STL, Thread, I/O và SFML.
Từ đó sinh viên có thể vận dụng những kiến thức này để có thể tạo nên một trò chơi đơn giản.