tek4

Trừu tượng và đóng gói C++

by - September. 26, 2021
Kiến thức
Học
<p>Trừu tượng v&agrave; đ&oacute;ng g&oacute;i C++ l&agrave; hai kh&aacute;i niệm cơ bản, quan trọng v&agrave; li&ecirc;n quan tới nhau trong qu&aacute; tr&igrave;nh lập tr&igrave;nh. Do vậy, trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ c&ugrave;ng t&igrave;m hiểu về đ&oacute;ng g&oacute;i dữ liệu v&agrave; trừu tượng trong C ++ c&ugrave;ng với c&aacute;c v&iacute; dụ dẫn chứng.</p> <h1>Trừu tượng</h1> <p>Trừu tượng h&oacute;a dữ liệu l&agrave; qu&aacute; tr&igrave;nh hiển thị c&aacute;c th&ocirc;ng tin cần thiết cho người d&ugrave;ng nhưng ẩn đi c&aacute;c chi tiết hoạt động kh&ocirc;ng cần thiết v&agrave;o b&ecirc;n trong.</p> <p>V&iacute; dụ: Một người sử dụng điện thoại di động, anh ta sẽ kh&ocirc;ng thể biết được bất cứ điều g&igrave; kh&aacute;c ngo&agrave;i c&aacute;c n&uacute;t bấm tr&ecirc;n m&agrave;n h&igrave;nh điện thoại, trừ khi anh ta c&oacute; nền tảng về c&ocirc;ng nghệ. Như vậy, c&aacute;c hoạt động chi tiết b&ecirc;n trong điện thoại ho&agrave;n to&agrave;n bị che giấu khỏi người d&ugrave;ng.</p> <p>Trong lập tr&igrave;nh C ++ nếu ch&uacute;ng ta triển khai lớp với c&aacute;c th&agrave;nh vi&ecirc;n Private v&agrave; Public th&igrave; đ&oacute; được coi l&agrave; một v&iacute; dụ về trừu tượng h&oacute;a dữ liệu.</p> <p>C&oacute; hai c&aacute;ch để triển khai trừu tượng dữ liệu:</p> <ol> <li>Trừu tượng h&oacute;a sử dụng c&aacute;c lớp (Class): Một lớp được sử dụng để nh&oacute;m tất cả c&aacute;c th&agrave;nh vi&ecirc;n dữ liệu v&agrave; c&aacute;c h&agrave;m th&agrave;nh vi&ecirc;n th&agrave;nh một đơn vị duy nhất bằng c&aacute;ch sử dụng c&aacute;c chỉ định truy cập. V&agrave; n&oacute; sẽ x&aacute;c định dữ liệu n&agrave;o được hiển thị b&ecirc;n ngo&agrave;i v&agrave; dữ liệu n&agrave;o kh&ocirc;ng.</li> <li>Trừu tượng h&oacute;a bằng c&aacute;ch sử dụng tệp ti&ecirc;u đề: V&iacute; dụ, h&agrave;m pow () c&oacute; sẵn được sử dụng để t&iacute;nh lũy thừa của một số m&agrave; kh&ocirc;ng cần biết thuật to&aacute;n n&agrave;o được sử dụng để t&iacute;nh lũy thừa. Do đ&oacute;, ch&uacute;ng ta c&oacute; thể n&oacute;i rằng c&aacute;c tệp ti&ecirc;u đề che giấu đi tất cả c&aacute;c chi tiết triển khai b&ecirc;n trong h&agrave;m pow() khỏi người d&ugrave;ng.</li> </ol> <p>C&oacute; hai kiểu loại trừu tượng h&oacute;a:</p> <ol> <li>Trừu tượng h&oacute;a dữ liệu: Ẩn đi c&aacute;c chi tiết về dữ liệu được gọi l&agrave; trừu tượng h&oacute;a dữ liệu.</li> <li>Trừu tượng h&oacute;a hoạt động: Ẩn đi c&aacute;c chi tiết về việc thực hiện.</li> </ol> <h2>Ưu điểm của trừu tượng h&oacute;a</h2> <ul> <li>Cho ph&eacute;p thực hiện c&aacute;c thay đổi đối với dữ liệu hoặc h&agrave;m của m&igrave;nh v&agrave; kh&ocirc;ng ai kh&aacute;c c&oacute; thể thực hiện.</li> <li>Bảo mật ứng dụng bằng c&aacute;ch kh&ocirc;ng cho ph&eacute;p bất kỳ ai kh&aacute;c xem chi tiết b&ecirc;n trong.</li> <li>Tăng khả năng sử dụng lại c&aacute;c đoạn m&atilde;.</li> <li>Tr&aacute;nh tr&ugrave;ng lặp đoạn m&atilde;.</li> <li>Một lập tr&igrave;nh vi&ecirc;n kh&ocirc;ng cần phải viết c&aacute;c đoạn m&atilde; bậc thấp.</li> </ul> <h2>V&iacute; dụ về trừu tượng h&oacute;a dữ liệu</h2> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class sinh_vien { private: int ID_sv; string ten; public: void gan_gia_tri(int a, string b){ ID_sv = a; ten = b; } int getID(){ return ID_sv; } string getTen(){ return ten; } }; int main() { sinh_vien sv; sv.gan_gia_tri(1,"Nguyen A"); cout &lt;&lt; "Ten sinh vien: " &lt;&lt; sv.getTen() &lt;&lt; endl; cout &lt;&lt; "ID sinh vien: " &lt;&lt; sv.getID(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Ten sinh vien: Nguyen A ID sinh vien: 1</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, c&aacute;c h&agrave;m gan_gia_tri, getTen v&agrave; getID được khai b&aacute;o l&agrave; Public, điều n&agrave;y nghĩa l&agrave; c&aacute;c h&agrave;m n&agrave;y sẽ được truy cập b&ecirc;n ngo&agrave;i lớp v&agrave; người d&ugrave;ng cần biết để c&oacute; thể sử dụng ch&uacute;ng. C&aacute;c biến th&agrave;nh vi&ecirc;n l&agrave; ID_sv v&agrave; ten được khai b&aacute;o l&agrave; private v&agrave; kh&ocirc;ng thể truy cập b&ecirc;n ngo&agrave;i lớp, do vậy người d&ugrave;ng sẽ kh&ocirc;ng thể biết được c&aacute;c dữ liệu n&agrave;y.</p> <h1>Đ&oacute;ng g&oacute;i</h1> <p>Tất cả c&aacute;c chương tr&igrave;nh C ++ đều bao gồm hai yếu tố cơ bản sau:</p> <ol> <li>C&acirc;u lệnh chương tr&igrave;nh (Đoạn m&atilde;) - Đ&acirc;y l&agrave; một phần của chương tr&igrave;nh thực hiện c&aacute;c thao t&aacute;c v&agrave; ch&uacute;ng được gọi l&agrave; c&aacute;c h&agrave;m.</li> <li>Dữ liệu chương tr&igrave;nh - Dữ liệu l&agrave; th&ocirc;ng tin của chương tr&igrave;nh bị ảnh hưởng bởi c&aacute;c h&agrave;m của chương tr&igrave;nh.</li> </ol> <p>Đ&oacute;ng g&oacute;i l&agrave; một kh&aacute;i niệm trong lập tr&igrave;nh hướng đối tượng, kết hợp giữa dữ liệu v&agrave; c&aacute;c h&agrave;m thao t&aacute;c dữ liệu với nhau, đồng thời đảm bảo sự an to&agrave;n v&agrave; tr&aacute;nh khỏi sự can thiệp v&agrave; sử dụng sai c&aacute;ch. N&oacute; li&ecirc;n quan đến việc đ&oacute;ng g&oacute;i c&aacute;c th&agrave;nh vi&ecirc;n dữ liệu v&agrave; c&aacute;c chức năng b&ecirc;n trong một lớp duy nhất. Đ&oacute;ng g&oacute;i dữ liệu li&ecirc;n quan tới một kh&aacute;i niệm kh&aacute;c đ&oacute; l&agrave; che giấu dữ liệu.</p> <p>N&oacute;i chung, đ&oacute;ng g&oacute;i l&agrave; một qu&aacute; tr&igrave;nh g&oacute;i c&aacute;c đoạn m&atilde; tương tự v&agrave;o c&ugrave;ng một nơi.</p> <p>T&iacute;nh năng đ&oacute;ng g&oacute;i dữ liệu l&agrave; một cơ chế đ&oacute;ng g&oacute;i dữ liệu v&agrave; c&aacute;c h&agrave;m sử dụng dữ liệu. Trừu tượng h&oacute;a dữ liệu l&agrave; cơ chế chỉ để cho ph&eacute;p hiện ra c&aacute;c giao diện v&agrave; ẩn dấu đi c&aacute;c chi tiết b&ecirc;n trong khỏi người d&ugrave;ng.</p> <p>C ++ hỗ trợ c&aacute;c thuộc t&iacute;nh đ&oacute;ng g&oacute;i v&agrave; che giấu dữ liệu th&ocirc;ng qua việc tạo ra c&aacute;c kiểu dữ liệu do người d&ugrave;ng tự định nghĩa, được gọi l&agrave; c&aacute;c lớp hay Class. Một lớp c&oacute; thể chứa c&aacute;c th&agrave;nh vi&ecirc;n trong phạm vi Private, Protected v&agrave; Public. Theo mặc định, tất cả c&aacute;c th&agrave;nh vi&ecirc;n sẽ được x&aacute;c định trong phạm vi l&agrave; Private.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>class sinh_vien { public: void in_thong_tin(){ cout &lt;&lt; "Thong tin sinh vien" &lt;&lt; endl; } private: int ID_sv; string ten; };</code></pre> <p>Trong v&iacute; dụ tr&ecirc;n, c&aacute;c biến ID_sv, ten v&agrave; h&agrave;m in_thong_tin() được đặt trong c&ugrave;ng một lớp class sinh_vien. Đ&acirc;y l&agrave; một c&aacute;ch đ&oacute;ng g&oacute;i dữ liệu trong C++.</p> <p><img class="aligncenter wp-image-7318 size-full" style="display: block; margin-left: auto; margin-right: auto;" src="https://tek4.vn/wp-content/uploads/2020/12/Capture-195.png" alt="Trừ tượng v&agrave; đ&oacute;ng g&oacute;i C++" width="470" height="465" /></p> <p>Bất kỳ chương tr&igrave;nh C ++ n&agrave;o m&agrave; ta triển khai một lớp Class c&ugrave;ng với c&aacute;c dữ liệu th&agrave;nh vi&ecirc;n được khai b&aacute;o l&agrave; Public v&agrave; Private sẽ đều l&agrave; một v&iacute; dụ về đ&oacute;ng g&oacute;i dữ liệu v&agrave; trừu tượng h&oacute;a dữ liệu.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class sinh_vien { public: void in_thong_tin(){ cout &lt;&lt; "Thong tin sinh vien" &lt;&lt; endl; cout &lt;&lt; ID_sv &lt;&lt; endl; cout &lt;&lt; ten &lt;&lt; endl; } void gan_gia_tri(int a, string b){ ID_sv = a; ten = b; } private: int ID_sv; string ten; }; int main() { sinh_vien sv; sv.gan_gia_tri(1,"Nguyen A"); sv.in_thong_tin(); return 0; }</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, ta sử dụng c&aacute;c h&agrave;m gan_gia_tri, in_thong_tin v&agrave; c&aacute;c biến ten, ID_sv v&agrave; đặt c&aacute;c dữ liệu n&agrave;y trong c&ugrave;ng một lớp sinh_vien. Đ&acirc;y được gọi l&agrave; đ&oacute;ng g&oacute;i dữ liệu.</p> <p>Để đặt c&aacute;c phần của một lớp ở chế độ c&ocirc;ng khai (tức l&agrave; c&aacute;c phần kh&aacute;c của chương tr&igrave;nh c&oacute; thể truy cập được), bạn phải khai b&aacute;o ch&uacute;ng sau từ kh&oacute;a Public. Tất cả c&aacute;c biến hoặc h&agrave;m được x&aacute;c định sau m&atilde; chỉ định c&ocirc;ng khai đều c&oacute; thể truy cập được bởi tất cả c&aacute;c h&agrave;m kh&aacute;c trong chương tr&igrave;nh của bạn.</p> <h2>Tại sao lại phải đ&oacute;ng g&oacute;i dữ liệu?</h2> <p>Trong C ++, t&iacute;nh năng đ&oacute;ng g&oacute;i dữ liệu gi&uacute;p ch&uacute;ng ta lưu trữ c&aacute;c dữ liệu v&agrave; c&aacute;c h&agrave;m li&ecirc;n quan lại với nhau, điều n&agrave;y l&agrave;m cho đoạn m&atilde; của ch&uacute;ng ta tr&ocirc;ng gọn v&agrave; dễ đọc hiểu hơn.</p> <h2>Che giấu dữ liệu</h2> <p>Che giấu dữ liệu l&agrave; một c&aacute;ch hạn chế quyền truy cập v&agrave;o c&aacute;c th&agrave;nh vi&ecirc;n dữ liệu. Đ&oacute;ng g&oacute;i cũng cung cấp một c&aacute;ch để che giấu dữ liệu.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class sinh_vien { public: void in_thong_tin(){ cout &lt;&lt; "Thong tin sinh vien" &lt;&lt; endl; cout &lt;&lt; ID_sv &lt;&lt; endl; cout &lt;&lt; ten &lt;&lt; endl; } void gan_gia_tri(int a, string b){ ID_sv = a; ten = b; } private: int ID_sv; string ten; }; int main() { sinh_vien sv; sv.gan_gia_tri(1,"Nguyen A"); sv.in_thong_tin(); return 0; }</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, biến ID_sv v&agrave; ten l&agrave; c&aacute;c dữ liệu th&agrave;nh vi&ecirc;n được khai b&aacute;o với chỉ định quyền truy cập l&agrave; Private. Do đ&oacute;, n&oacute; kh&ocirc;ng thể được truy cập b&ecirc;n ngo&agrave;i lớp sinh_vien v&agrave; đ&acirc;y được coi l&agrave; che giấu dữ liệu. Ngược lại, c&aacute;c h&agrave;m in_thong_tin() v&agrave; gan_gia_tri() được khai b&aacute;o trong phạm vi Public, do đ&oacute; c&aacute;c h&agrave;m n&agrave;y c&oacute; thể được truy cập b&ecirc;n ngo&agrave;i lớp sinh_vien. Như vậy, c&aacute;c h&agrave;m n&agrave;y l&agrave; kh&ocirc;ng được che giấu m&agrave; n&oacute; chỉ đơn giản được coi l&agrave; đ&oacute;ng g&oacute;i.</p> <p><strong>Ch&uacute; &yacute;: Mọi người thường coi đ&oacute;ng g&oacute;i dữ liệu l&agrave; che giấu dữ liệu, nhưng điều đ&oacute; kh&ocirc;ng ho&agrave;n to&agrave;n đ&uacute;ng. Đ&oacute;ng g&oacute;i li&ecirc;n quan đến việc đ&oacute;ng g&oacute;i c&aacute;c trường v&agrave; phương thức lại với nhau. Điều n&agrave;y c&oacute; thể được sử dụng để che giấu dữ liệu. Bản th&acirc;n việc đ&oacute;ng g&oacute;i kh&ocirc;ng phải l&agrave; che giấu dữ liệu.</strong></p> <h1>So s&aacute;nh giữa trừu tượng v&agrave; đ&oacute;ng g&oacute;i</h1> <table> <tbody> <tr> <td width="312">Trừu tượng</td> <td width="312">Đ&oacute;ng g&oacute;i</td> </tr> <tr> <td width="312">L&agrave; qu&aacute; tr&igrave;nh lấy dữ liệu</td> <td width="312">L&agrave; qu&aacute; tr&igrave;nh lưu trữ dữ liệu</td> </tr> <tr> <td width="312">C&aacute;c vấn đề được giải quyết ở mức giao diện cho người d&ugrave;ng</td> <td width="312">C&aacute;c vấn đề được giải quyết ở mức thực thi</td> </tr> <tr> <td width="312">Che giấu dữ liệu kh&ocirc;ng mong muốn</td> <td width="312">Che giấu dữ liệu trong một thực thể c&ugrave;ng một phương thức để bảo vệ dữ liệu an to&agrave;n khỏi b&ecirc;n ngo&agrave;i</td> </tr> <tr> <td width="312">Thực hiện trừu tượng h&oacute;a bằng c&aacute;c lớp trừu tượng v&agrave; Interface</td> <td width="312">Thực hiện đ&oacute;ng g&oacute;i bằng c&aacute;ch sử dụng c&aacute;c chỉ định truy cập gồm Private, Public, Protected</td> </tr> <tr> <td width="312">C&aacute;c th&ocirc;ng tin thực thi được che giấu bởi c&aacute;c lớp trừu tượng v&agrave; Interface</td> <td width="312">Dữ liệu được che giấu bởi c&aacute;c phương thức</td> </tr> <tr> <td width="312">C&aacute;c đối tượng thực hiện việc trừu tượng h&oacute;a sẽ được đ&oacute;ng g&oacute;i.</td> <td width="312">C&aacute;c đối tượng tạo ra việc đ&oacute;ng g&oacute;i kh&ocirc;ng cần phải trừu tượng h&oacute;a.</td> </tr> </tbody> </table> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về trừu tượng v&agrave; đ&oacute;ng g&oacute;i trong C++. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>