Tải bản đầy đủ (.pdf) (20 trang)

Giáo trình Lập trình hệ thống - Đại học SPKT Hưng Yên

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (258.53 KB, 20 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>LẬP TRÌNH HỆ THỐNG</b>


<b>Biên tập bởi:</b>


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>LẬP TRÌNH HỆ THỐNG</b>


<b>Biên tập bởi:</b>


Khoa CNTT ĐHSP KT Hưng Yên
<b>Các tác giả:</b>


Khoa CNTT ĐHSP KT Hưng Yên


Phiên bản trực tuyến:


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<b>MỤC LỤC</b>



1. Bài 1: TỔNG QUAN VỀ LẬP TRÌNH HỆ THỐNG
1.1. Khái niệm về lập trình hệ thống


1.2. Tổng quan về lập trình hệ thống
1.3. Lịch sử về lập trình hệ thống


1.4. Cấu trúc tổng quan lập trình hệ thống
2. Bài 2: CƠNG CỤ LẬP TRÌNH HỆ THỐNG


2.1. Các ngơn ngữ lập trình
2.2. Giới thiệu về C++


2.3. Giới thiệu về Visual C++


3. Bài 3: THỰC HÀNH MỘT SỐ BÀI TẬP CƠ BẢN TRÊN C++
3.1. Thực hành một số bài tập cơ bản trên C++



4. Bài 4: CƠ BẢN VÀ CẤU TRÚC VỀ DRIVER
4.1. Tóm lược lịch sử các bộ điều khiển thiết bị


4.2. Tổng quan về các Hệ điều hành (An Overview of the Operating Systems)
4.3. Các kiểu Driver


4.4. Tổng quan về quản lý và kiểm tra danh sách


5. Bài 5: THỰC HÀNH MỘT SỐ BÀI TẬP CƠ BẢN TRÊN VC++
5.1. Thực hành một số bài tập cơ bản trên VC++


6. Bài 6: CÁC KỸ THUẬT LẬP TRÌNH CƠ BẢN
6.1. Mơi trường lập trình kiểu Kernel – Mode
6.2. Trình bày lỗi (Lỗi xử lý)


6.3. Quản lý bộ nhớ (Memory Management )
6.4. Trình bày chuỗi (String Handling)


6.5. Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques )
7. Bài 7: THỰC HÀNH MỘT SỐ BÀI TẬP TRÊN VC++


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

10.2. Cấu trúc cổng COM


11. Bài 11: THỰC HÀNH VỚI CÁC CHƯƠNG TRÌNH GIAO TIẾP QUA CỔNG
COM


11.1. Thực hành với các chương trình giao tiếp qua cổng COM
12. Bài 12: VẤN ĐỀ ĐỒNG BỘ



12.1. Vấn đề đồng bộ hóa nguyên mẫu (An Archetypal Synchronization Problem )
12.2. Mức yêu cầu Ngắt (Interrupt Request Level )


12.3. Khóa xoay vịng (Spin Locks )


12.4. Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects )


12.5. Một số phương pháp đồng bộ khác (Other Kernel-Mode Synchronization
Primitives )


13. Bài 13: THỰC HÀNH LẬP TRÌNH DRIVER CƠ BẢN
13.1. Thực hành lập trình driver cơ bản


14. Bài 14: GÓI DỮ LIỆU VÀO RA


14.1. Các cấu trúc dữ liệu (Data Structures )


14.2. Hàng đợi yêu cầu Vàora (Queuing IO Requests)
14.3. Hủy bỏ yêu cầu vàora (Cancelling IO Requests )


14.4. Tóm lược các kịch bản xử lý (Summary—Eight IRP-Handling Scenarios)
15. Bài 15: THỰC HÀNH LẬP TRÌNH DRIVER CHO XỬ LÝ IRP


15.1. Thực hành một số bài lập trình driver cơ bản
16. Bài 16: ĐỌC VÀ GHI DỮ LIỆU


16.1. Cấu hình thiết bị của bạn (Configuring Your Device )
16.2. Địa chỉ một Bộ đệm dữ liệu (Addressing a Data Buffer )
16.3. Các cổng và các thanh ghi (Ports and Registers )



16.4. Phục vụ ngắt (Servicing an Interrupt )


16.5. Truy nhập bộ nhớ trực tiếp (Direct Memory Access )


17. Bài 17: ĐIỀU KHIỂN VÀO/RA VÀ HÀM ĐIỀU KHIỂN PLUG AND PLAY
17.1. Hàm DeviceIoControl API (The DeviceIoControl API)


17.2. Điều khiển IRP MJ DEVICE CONTROL


17.3. Những thao tác bên trong điều khiển IO (Internal IO Control Operations)
18. Bài 18: THỰC HÀNH LẬP TRÌNH DRIVER CHO ĐIỂU KHIỂN VÀO/ RA


18.1. Thực hành lập trình driver cho điều khiển Vàora
19. Bài 19: TRÌNH ĐIỀU KHIỂN CHO USB


19.1. Giới thiệu cổng USB


20. Bài 20: THỰC HÀNH ĐIỀU KHIỂN QUA CỔNG USB


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

21. Bài 21: TRÌNH ĐIỀU KHIỂN CHO HID


21.1. Những bộ điều khiển cho thiết bị HID (Drivers for HID Devices )


21.2. Những mô tả báo cáo và những báo cáo (Reports and Report Descriptors )
21.3. Những điều khiển nhỏ HIDCLASS (HIDCLASS Minidrivers)


22. Bài 22: THỰC HÀNH LẬP TRÌNH HID


22.1. Thực hành với các chương trình ví dụ điều khiển cho HID



23. Bài 23: THỰC HÀNH LẬP TRÌNH DRIVER GIAO TIẾP CÁC CỔNG
23.1. Thực hành một số bài tập tổng hợp


24. TÀI LIỆU THAM KHẢO


24.1. Lập trình hệ thống: Tài liệu tham khảo
25. MỤC LỤC


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<b>Bài 1: TỔNG QUAN VỀ LẬP TRÌNH HỆ</b>


<b>THỐNG</b>



<b>Khái niệm về lập trình hệ thống</b>



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<b>Tổng quan về lập trình hệ thống</b>



Những điểm đặc biệt hơn trong lập trình hệ thống:


• Những nhà lập trình sẽ tạo những gánh vác về phần cứng và một số thuộc tính
khác của những chương trình chạy trên hệ thống đó, và sẽ thường khai thác
những thuộc tính đó (cho ví dụ bởi việc sử dụng một giải thuật mà được biết
mà hiệu quả khi nào được sử dụng với phần cứng đặc biệt).


• Thơng thường một ngơn ngữ lập trình cấp thấp hoặc tiếng địa phương ngơn ngữ
lập trình sử dụng đó là:


◦ có thể hoạt động trong những mơi trường tài nguyên bắt buộc
◦ là rất hiệu quả và có thể thực hiện một ít ở trên đầu


◦ có một thư viện thực hiện nhỏ, hoặc không ở mọi thứ



◦ cho phép trực tiếp và “thô” mà điều khiển qua truy cập bộ nhớ và điều
khiển chảy tràn


◦ để cho người lập trình viết những phần của chương trình ngay tức khắc
trên ngơn ngữ assembly.


• Gỡ rối có thể là khó nếu nó là thật khơng có thể để chạy chương trình trong một
chương trình gỡ rối vì những sự ràng buộc tài nguyên. Chạy chương trình bên
trong một mơi trường giả có thể sử dụng để giảm bớt vấn đề này.


Những nhà lập trình hệ thống một cách đầy đủ thì khác với lập trình ứng dụng mà những
người lập trình hướng tới chuyên về một hoặc cái khác.


Trong lập trình hệ thống, những phương tiện lập trình có hạn thường sẵn có. Sự sử dụng
của tập hợp rác tự động thì khơng phải là phổ biến và gỡ rối là không đổi đôi khi để làm.
Thư viện thực hiện, nếu sẵn có ở mọi nơi, thì ít mạnh hơn nhiều thơng thường, và làm ít
sợ kiểm tra lỗi hơn. Bởi vì những sự hạn chế đó, màn hình và sự đăng ký thường được
sử dụng; những hệ điều hành có thể có vơ cùng chi tiết hóa những hệ thống con đăng
ký.


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>Lịch sử về lập trình hệ thống</b>



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

<b>Cấu trúc tổng quan lập trình hệ thống</b>



Hình 1-1 là biểu đồ thu gọn của hệ điều hành Windows XP, nó rất quan trọng đối với
người lập trình driver. Các hoạt động của Windows XP đều được hỗ trợ bởi hai chế độ.
Đó là User Mode và Kernel mode.


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

<b>Bài 2: CÔNG CỤ LẬP TRÌNH HỆ THỐNG</b>




<b>Các ngơn ngữ lập trình</b>



Lập trình hệ thống không nhất thiết phải sử dụng ngôn ngữ assembly. Thật vậy, tuyệt
đại đa số các module chức năng cấu thành hệ điều hành Windows, Unix, Linux... đều
được viết bằng ngôn ngữ C. Ưu điểm của các ngôn ngữ cấp cao là rõ ràng, dễ đọc, dễ
diễn đạt giải thuật, diễn đạt giải thuật cô đọng... Như vậy, nếu chưa thật cần thiết phải
dùng assembly hay ngôn ngữ máy, bạn nên dùng 1 ngôn ngữ cấp cao như C, C++ để
viết các ứng dụng của bạn.


Ngược lại, ngôn ngữ Assembly hay ngôn ngữ máy không nhất thiết chỉ để dùng cho lập
trình hệ thống mà có thể được dùng để viết ứng dụng bất kỳ. Tuy nhiên do nhược điểm
của assembly và ngôn ngữ máy là quá yếu để diễn đạt giải thuật nên rất ít người dùng
chúng trực tiếp. Như trên đã nói, ngay cả khi viết hệ điều hành hay các hệ thống nhúng
(chương trình điều khiển thiết bị và được ghi trên ROM của thiết bị đó), người ta cũng
cố gắng dùng ngơn ngữ cấp cao như C, trừ những đoạn code đặc biệt mới dùng assembly
hay mã máy.


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

<b>Giới thiệu về C++</b>



C++ là một ngơn ngữ lập trình tiến tiến, mạnh trong các ngơn ngữ lập trình hiện nay,
nó được sử dụng bởi hàng triệu lập trình viên trên thế giới. Nó là một trong những ngôn
ngữ phổ biến để viết các ứng dụng máy tính – và ngơn ngữ thơng dụng nhất để lập trình
games. Được sáng tạo bởi Bjarne Stroustrup, C++ là thế hệ sau của ngôn ngữ C. Thực
tế, C++ giữ lại hầu hết các đặc điểm của C. Như thế nào đi nữa, C++ đem đến cho chúng
ta những thuận lợi hơn trong việc lập trình.


<b>Dùng C++ cho Games:</b>



C++ là ngơn ngữ được các lập trình viên games lựa chọn. Hầu hết các games được giới
thiệu hiện nay đều được viết bởi C++. Có nhiều lí do khác nhau để giải thích vì sao


những người lập trình games sử dụng C++. Đây là một vài lí do:


<i>Nhanh:</i>Nếu bạn rành C++ thì bạn có thể lập trình nhanh. Một trong những mục tiêu của
C++ là khả năng thực thi. Và nếu bạn cần thêm các tính năng cho chương trình, C++
cho phép bạn dùng ngôn ngữ Assembly (Hợp ngữ) – Ngơn ngữ lập trình bậc thấp nhất
– để giao tiếp trực tiếp với phần cứng của máy tính.


<i>Dễ điều khiển:</i>C++ là một ngơn ngữ biến hóa, nó hỗ trợ các phong cách lập trình khác
nhau, bao gồm lập trình hướng đối tượng. Không giống các ngôn ngữ khác, C++ không
ép buộc lập trình viên phải đi theo một phong cách nào cả.


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

<b>Tạo File thực thi: (.exe)</b>



File mà bạn dùng để chạy chương trình – dù bạn đang nói đến game hay các ứng dụng
windows – gọi là file thực thi (Executable File). Có rất nhiều bước để tạo một file thực
thi từ mã nguồn của C++ (tập hợp các lệnh trong ngơn ngữ C++). Q trình này được
mơ tả ở hình 1.1.


1. Đầu tiên, người lập trình dùng editor (trình soạn thảo) để viết mã nguồn C++, file đó
thường có đi .cpp. Trình soạn thảo giống như bộ xử lý ngơn ngữ cho chương trình, nó
cho phép lập trình viên tạo, chỉnh sửa, và lưu trữ mã nguồn.


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

3. Tiếp theo, bộ phận kết nối (Linker) sẽ kết nối file object đến những file ngoài nếu cần
thiết, sau đó tạo file thực thi (executable file), thường có đi mở rộng là .exe. Đến lúc
này, người dùng có thể chạy chương trình bằng cách chạy file thực thi.


<i>Lưu ý:</i>Q trình tơi miêu tả ở trên chỉ là một trường hợp đơn giản. Để tạo nên một ứng
dụng phức tạp trong C++ thường liên quan đến rất nhiều file mã nguồn được viết bởi
lập trình viên (hay một nhóm lập trình viên).



Để tự động hóa q trình này, lập trình viên dùng một cơng cụ tổng hợp, đó là IDE
(Integrated Development Environment – mơi trường tương thích khai triển). IDE thường
bao gồm editor, compiler, linker và một số công cụ khác. Phiên bản thương mại IDE cho
Windows bao gồm Visual Studio.NET và C++ Builder Studio. Dev-C++ là một ngơn
ngữ mà nguồn mở miễn phí cho Windows (hyutar: strong CD ROM kèm quyển sách
gốc có cái Dev-C++, nhưng sách này là đồ lậu nên hổng có, mọi người có thể tải cái này
từ trên net về, hoặc dùng C++ 6.0 hay Visual C++ cũng được, mình nghĩ hầu hết mọi
người đều có bản thương mại của C rồi).


<b>Xử lý lỗi: (error)</b>



Khi miêu tả quá trình tạo file thực thi từ mã nguồn C++, tôi đã bỏ qua một chi tiết nhỏ:
đó là lỗi. Lỗi là một chuyện hay gặp của các chương trình máy tính. Lập trình viên chính
là người thường xuyên mắc lỗi nhất. Ngay cả lập trình viên giỏi nhất đều có thể mắc lỗi
ở lần thứ 1 (hoặc nhiều hơn) chạy chương trình. Lập trình viên phải sửa lỗi và chạy lại
quá trình tạo file thực thi. Sau đây là một vài loại lỗi cơ bản bạn thường mắc phải khi
chạy chương trình:


<i>Lỗi biên dịch (Compile Errors):</i>Nó xảy ra trong q trình biên dịch. Kết quả, file object
không được tạo ra. Lỗi này thường do lỗi cú pháp, có nghĩa là trình biên dịch khơng hiểu
cái gì đó. Nó có thể đơn giản như gõ sai lệnh chẳng hạn, hay thiếu dấu “;”. Trình biên
dịch còn đưa ra những cảnh báo (warning). Mặc dù bạn thường không cần phải chú ý
đến warning, nhưng bạn nên giải quyết nó như là lỗi, sữa chửa, sau đó biên dịch lại, đây
là một thói quen tốt đấy ^^.


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

<b>Trong thực tế:</b>Như các nhà tạo phần mềm, công ty game thường gặp rắc rối với các sản
phẩm bị lỗi. Biện pháp khắc phục của họ là trước khi đem ra ngoài thị trường, họ thuê
những người chơi game thử (game testers). Những người này chỉ chơi games, nhưng
công việc của họ không thú vị như bạn tưởng đâu. Họ phải chơi đi chơi lại một phần
nào đó của game – có thể lên đến hàng trăm – cố gắng tìm xem có lỗi nào khơng. Và


với cơng việc buồn tẻ này, lương của họ cũng bèo nhèo. Nhưng trở thành game testers
là một nấc thang để bạn có thể vào làm việc tại cơng ty làm games.


<b>Ví dụ:</b>



#include <stdio.h>
#include <conio.h>
void main()


{


printf(“chao cac ban”);
getch();


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

<b>Giới thiệu về Visual C++</b>



Visual C++ là mơt phần mềm lập trình hướng đối tượng được phát triển trên cơ sở là
ngôn ngữ lập trình C và C++.


Phương pháp thiết kế hướng đối tượng vừa mới phát triển nhằm giúp nhà phát triển khai
thác được sức mạnh của đối tượng và ngôn ngữ lập trình hướng đối tượng, dùng các lớp
và đối tượng như là khối xây dựng cơ sở.


OOP (ngôn ngữ lập trình hướng đối tượng ) là ngơn ngữ hiện thực trong đó chương trình
được tổ chức như tập hợp những đối tượng hợp tác với nhau, mỗi đối tượng đại diện cho
một instance của một vài lớp và những lớp mà chúng là thành viên của một lớp phân cấp
thơng qua quan hệ thừa kế.


<b>1. Abstraction ( tính trừu tượng) :</b>




Sự trừu tượng thể hiện những đặc tính cốt yếu của một đối tượng mà những đặc tính
này dùng để phân biệt đối tượng này với tất cả các loại đối tượng khác và do vậy cung
cấp một cách rõ ràng giới hạn ý niệm được ý nghĩa, liên quan đến viễn tượng của người
nhìn.


Trừu tượng tập trung vào cái nhìn bề ngồi của đối tượng và do đó thỏa mãn được các
hành vi chủ yếu của đối tượng riêng biệt từ hiện thực của nó.


Ta có thể có các loại trừu tượng sau:


- Thực thể trừu tượng : một đối tượng mà nó đại diện cho một mơ hình hữu dụng của
một miền vấn đề hay thực thể miền giải quyết.


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

mà nó có thể thực thi cho đối tượng khác. Quan điểm này buộc chúng ta phải tập trung
vào cái nhìn bề ngồi của đối tượng.


Chúng ta gọi toàn bộ tập hợp của các hoạt động mà một client có thể thi hành cho một
đối tượng, cùng với những câu lệnh hợp lệ mà chúng có thể được gọi là protocol. Một
protocol biểu thị những cách thức mà một đối tượng có thể hành động và phản ứng, và
do vậy có thể cấu thành tổng thể bề ngoài tĩnh và động của trừu tượng.


<b>2. Encap sulation (sự đóng kín) :</b>



Tính đóng kín là q trình phân chia các phần tử của một trừu tượng để cấu thành nên
cấu trúc và hành vi của chính nó, đóng kín cho phép hoạt động giao tiếp của một trừu
tượng và hiện thực của nó.


Sự đóng kín là cơ chế liên kết mã và dữ liệu mà nó thao tác, và giữ cho cả 2 được an
toàn khỏi sự can thiệp từ bên ngoài và do sử dụng sai. Trong ngôn ngữ hướng đối tượng,
mã và dữ liệu liên kết với nhau để tạo thành một “hộp đen” độc lập. Trong hộp này là


tất cả mã và data cần thiết. Khi mã và data liên kết với nhau như thế một đối tượng sẽ
được tạo ra. Nói cách khác, đối tượng là một dụng cụ hỗ trợ cho sự đóng kín.


Trong một đối tượng , mã, data, hoặc cả 2 có thể là private (riêng) của đối tượng đó hay
public (chung). Mã hoặc data riêng là thuộc về đối tượng đó và chỉ được truy cập với bộ
phận của đối tượng. Nghĩa là mã hoặc data riêng không thể truy cập bởi các phần khác
của chương trình tồn tại ngoài đối tượng. Khi data là chung, các bộ phận khác có thể
truy cập đến nó mặc dù nó được định nghĩa trong một đối tượng. Các phần chung của
một đối tượng dùng để cung cấp một giao diện có điều khiển cho các phần riêng của đối
tượng.


Nói chung, một đối tượng là một biến thuộc kiểu do người sử dụng định nghĩa. Mỗi lần
ta định nghĩa một đối tượng mới, ta tạo ra một loại data mới.


Đặc biệt các thành viên có thể được đặt vào public, private, hay protectedcủa lớp. Thành
viên được khai báo là public thì thấy được đối với mọi client, những thành viên khai báo
là private thì hồn tồn đóng kín, và những thành viên khai báo là protected thì chỉ thấy
với chính lớp của nó và những lớp con của nó. C++ cũng cịn cho phép kí hiệu friend :
là lớp cùng hợp tác được phép thấy những phần privated của nhau.


<b>3. Modularity (modun hóa) :</b>



</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

Việc phân chia chương trình thành những phần riêng lẻ có thể làm giảm độ phức tạp.
Ở ngơn ngữ này lớp, đối tượng hình thành cấu trúc luận lý của hệ thống. Chúng ta đặt
những trừu tượng này trong modun để tạo ra những kiến trúc vật lý của hệ thống.


Đối với những vấn đề nhỏ, nhà phát triển có thể quyết định vấn đề khai báo tất cả các lớp
và đối tượng trong cùng một gói. Ta thường nhóm những lớp vàø đối tượng có quan hệ
trong cùng một modun, và chỉ phơi bày những phần tử mà modun khác cần thấy. Trong
các hệ thống lớn, thì nó có q nhiều modun và thật là khó cho người sử dụng tìm thấy


những lớp mà họ cần. Hơn nữa , khi quyết định thay đổi hàng trăm modun phải được
hiệu chỉnh hoặc biên dịch lại. Như vậy, modun hóa đơi khi cũng khơng tốt.


Modun phục vụ như là những phần tử và những đơn vị không thể phân chia được của
phần mềm mà có thể sử dụng lại được qua các ứng dụng. Nhà phát triển sẽ chọn cách
đóng gói đối tượng thành các modun sao cho chúng thuận tiện để sử dụng lại.


<b>4. Hierachy (hệ thống phân cấp) :</b>



Hệ thống phân cấp là một sự sắp xếp theo thứ bậc hay sắp đặt các trừu tượng. Có hai
phân cấp quan trọng nhất trong một hệ thống phức tạp là : cấu trúc lớp của nó(phân cấp
“is a”), và cấu trúc đối tượng của nó ( phân cấp “part of “).


<b>Thừa kế đơn giản:</b>thừa kế là mối quan hệ “ is a “. thừa kế định nghĩa một mối quan hệ
giữa các lớp, trong đó một lớp chia sẻ cấu trúc và hành vi đã được định nghĩa trong một
lớp hay nhiều lớp ( tương ứng với thừa kế đơn giản và đa thừa kế ). Do đó thừa kế như
là sự phân cấp của các trừu tượng, trong đó một lớp con thừa kế một hay nhiều lớp cha.
Đa thừa kế đưa đến một số vấn đề phức tạp cho ngơn ngữ lập trình. Những ngôn ngữ
phải đưa ra hai vấn đề: xung đột giữa tên của các lớp cha khác nhau, và thừa kế được
lập lại nhiều lần. Sự xung đột xảy ra khi hai hay nhiều lớp cha cùng cấp cùng chia sẻ
một lớp cha chung. Và trong trường hợp như vậy, lớp lá có một hoặc nhiều bản sao cấu
trúc của lớp cha được dùng chung đó. Một số ngơn ngữ thì khơng cho phép thừa kế lập
lại, một số khác thì chọn hướng khác. C++ cho phép người lập trình quyết định: virtual
base class (lớp cơ sở ảo ) được dùng để chỉ ra sự dùng chung của cấu trúc lập lại, trong
khi đó nonvirtual base class có kết quả là trùng bản sao ở lớp con.


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

Là tính chất cho phép một tên được dùng cho hai hoặc nhiều mục đích khác nhau có
quan hệ về phương diện kỹ thuật. Mục đích của tính đa dạng khi được áp dụng cho OOP
là cho phép một tên được dùng để chỉ rõ một lớp tác động tổng quát, một tác động cụ
thể được xác định bởi loại data. Ví dụ, trong C, khơng có hỗ trợ tính đa dạng nên một


tác động giá trị tuyệt đối cần phải có ba hàm khác nhau: abs(), labs(), và fabs(). Các hàm
này tính tốn và lần lượt trả về một giá trị tuyệt đối của số nguyên, một số nguyên dài,
một giá trị dấu phẩy động. Tuy nhiên, trong C++ có đặc tính đa dạng nên có hàm abs().
Loại data được dùng để gọi hàm xác định loại hàm nào thực sự được dùng. Trong C++
có thể sử dụng một tên hàm cho nhiều mục đích khác nhau. Điều này được gọi là quá tải
hàm(function overloading).


Tổng quan hơn khái niệm tính đa dạng là ý tưởng “một giao diện, nhiều phương pháp”.
Điều này có nghĩa là có thể thiết kế một giao diện chung cho một nhóm các tác động có
liên quan. Tuy nhiên, tác động cụ thể được thi hành phụ thuộc vào data. Ưu điểm của
tính đa dạng là chúng làm giảm tính phức tạp bằng cách cho phép cùng một giao diện
được sử dụng để ghi rõ một lớp tác động tổng qt, chính trình biên dịch sẽ lựa chọn
tác động cụ thể khi áp dụng cho từng trường hợp. Là người lập trình ta khơng phải thực
hiện sự lựa chọn này bằng tay. Ta chỉ cần nhớ và sử dụng giao diện chung.


Liên kết tĩnh và kiên kết động (Static and Dynamic Binding):


Khái niệm trong typing và static typing liên kết tĩnh là hoàn toàn khác nhau. Strong
typing đề cập tới sự nhất quán của kiểu. Stactic binding có nghĩa là kiểu của mọi biến
và biểu thức là cố định vào lúc biên dịch. Dynamic binding nghĩa là các kiểu của mọi
biến và biểu thức không cho biết cho tới khi chạy chương trình. Bởi vì Strong typing
và Dynamic binding là khái niệm độc lập cho nên một ngơn ngữ có thể vừa Strong và
Static typing.


<b>6. Bản chất của đối tượng:</b>



Một đối tượng có trạng thái, hành vi, đặc tính nhân dạng; cấu trúc và hành vi của các đối
tượng giống nhau được định nghĩa trong một lớp chung của chúng, thuật ngữ instance
và đối tượng là có thể thay thế lẫn nhau được.



<b>Trạng thái (state)</b>: của một đối tượng bao gồm tất cả các đặc tính (thường là tĩnh) của
đối tượng trừ đi giá trị hiện tại ( thường là động ) của mỗi đặc tính đó.


<b>Hành vi (behavior )</b>: là đối tượng hoạt động và phản ứng như thế nào theo điều kiện
trạng thái của nó thay đổi và message truyền đến.


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

• Modifier : là operation thay đổi trạng thái của đối tượng. Selector: là Operation truy
xuất trạng thái của đối tượng nhưng khơng làm thay đổi trạng thái của nó.


• Iterrator : là operation cho phép tất cả các phần của một đối tượng được truy xuất theo
một thứ tự đã định nghĩa trước. Hai loại operation thông dụng khác cần thiết để tạo và
hủy những instance của một lớp là :


• Constructor: là operation tạo đối tượng và (hoặc) khởi động trạng thái của nó.


• Destructor là operation giải phóng trạng thái của một đối tượng và (hoặc) hủy chính
đối tượng đó.


• Indentify: (đặc điểm nhận dạng) : indentify là đặc tính của một đối tượng để phân biệt
nó với các đối tượng khác.


<b>7. Mối quan hệ giữa các đối tượng:</b>



<b>Links( liên kết)</b>: Link là nối kết vật lý hay ý niệm giữa các đối tượng. Một đối tượng
cộng tác với một đối tượng khác thơng qua link của nó tới những đối tượng này. Hay
nói cách khác, một link vó nghĩa là một hợp tác cụ thể qua đó một đối tượng ( client) áp
dụng những dịch vụ của đối tượng khác (nhà cung cấp) hoặc qua đó một đối tượng có
thể điều khiển đối tượng khác.<b>Một đối tượng có thể đóng các vai trị sau:</b>


• Actor : một đối tượng có thể làm việc trên một đối tượng khác nhưng nó khơng bao


giờ cho một đối tượng khác làm việc trên nó, thuật ngữ actor và active object có thể thay
thế lẫn nhau.


• Server: một đối tượng khơng bao giờ làm việc trên một đối tượng khác, nó chỉ cho đối
tượng khác làm việc trên nó.


• Agent : một đối tượng vừa làm việc trên đối tượng khác vừa cho đối tượng khác làm
việc trên nó, một đại lý thường được tạo ra để làm công việc cho một actor hay một
agent khác .


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

Khi có multiple thread control, việc truyền thông tin giữa các đối tượng cần xử lý vấn đề
multual exclusion trong hệ thống xử lý đồng thời. Vấn đề đồng bộ hóa cũng phải xem
xét.


Aggregation: Aggregation có nghĩa là một phân cấp tổng thể / bộ phận, với khả năng
điều khiển từ tổng thể ( còn gọi là aggregate ) tới những bộ phận (được hiểu là những
thuộc tính của nó).


<b>8. Bản chất của lớp:</b>



Class (lớp) : là tập hợp của các đối tượng có cùng cấu trúc chung hay hành vi chung.
Một đối tượng đơn giản chỉ là một instance của lớp.


Interface: của một lớp cho thấy bên ngoài của đối tượng và do đó nhấn mạnh đến vấn đề
trừu tượng trong khi che dấu cấu trúc và hành vi bên trong.


Implemention : của mơt lớp là cái nhìn bên trong của nó. Implemention của một lớp
cơ bản bao gồm tât cả các operation được định nghĩa trong interface. Chúng ta chia
interface của lớp thành ba phần:



• Public : là khai báo được truy xuất đến mọi client.


• Protected : là khai báo được truy xuất chỉ chính lớp đó, lớp con của nó, và lớp friend.
• Private: là khai báo được truy xuất chỉ chính lớp đó và lớp friend.


<b>9. Mối quan hệ giữa các lớp:</b>



Phần lớn ngôn ngữ hướng đối tượng hỗ trợ trực tiếp một vài kết hợp của những quan hệ
sau đây:


• Association : gồm có quan hệ một-một, một-nhiều, nhiều-nhiều.


• Inheritance (thừa kế) : là một lớp chia sẽ cấu trúc và (hoặc) hành vi được định nghĩa
bởi một lớp (đơn thừa kế) hoặc nhiều lớp (đa thừa kế).


• Aggregation (kết tập) : quan hệ kết tập giữa các lớp giống như quan hệ kết tập giữa các
đối tượng tượng giữa các lớp đó. Đa thừa kế thường bị lẫn lộn với kết tập. Trong C++
thừa kế protected hay private dễ dàng bị thay thế bởi kết tập protected hay private của
instace của lớp cha, mà không mất tính ngữ nghĩa của nó.


</div>

<!--links-->
<a href=' /><a href=' /> Xây dựng website tra cứu thời khóa biểu online cho giáo viên khoa CNTT trường Đại Học SPKT Hưng Yên
  • 52
  • 980
  • 0
  • ×