Lập trình

Lập trình

Thứ Sáu, 6 tháng 6, 2014

[B2] Class , quy tắc

Khi lập trình về class ta cũng có những quy tắc bài bản để tuôn thủ , vậy những quy tắc đó là gì , chúng ta sẽ đi tìm hiểu trong bài hôm nay


* Thứ nhất ta đến với quy tắc về hình thức :
  + Ta bắt buộc phải có ';' sau khi cài đặt lớp , vì C++ coi định nghĩa một lớp như định nghĩa
    kiễu dữ liệu
  + Để phân biệt với biến ta nên đặt tên lớp bắt đầu bằng một chữ in hoa và biến thì bắt đầu bằng
    một biến in thường

VD : class SinhVien{
             ....
            };

int sinhVien;
* Thứ hai ta đến với quy tắc về định nghĩa :
 + Trước khi đi vào quy tắc 2 chúng ta sẽ lướt qua định nghĩa về các từ khóa : public và private
  (ở đây tôi tạm thời không nói đến từ khóa protected)
    public // chung , private // riêng
 VD : class SinhVien{
             public : layten() {...};
 private : string ten;
             };

   int main() {
 SinhVien sinhVien1 , sinhVien2; // ở đây sinhVien1,sinhVien2 là 2 thực thể của class.
 sinhVien1.layten();//chấp nhận vì hàm layten() được khai báo trong public nên nó được sử
                    // dụng trong tất cả các hàm thế này
 sinhvien2.ten = "Ngo Van A"; // Sai vì trong class SinhVien , biến ten được khai báo trong
                            // private nên nó chỉ có phạm vi 'hoạt động' trong class SinhVien mà thôi

 return 0;
}
 + Trong VD trên tôi đã tuôn theo quy tắc trong lập trình hướng đối tượng (class) như sau :
  - Khi khai báo (cài đặt) class khi khai báo dữ liệu(int , string ,...) thì ta phải đặt chúng
    dưới private .
  - Tất nhiên khi có private thì phải có public vì nếu không có class không có ảnh hưởng gì cả
  - khi đó thao tác (hàm) sẽ được đặt dưới public.


  + Trong thực tế ta thấy nếu cuộc sống của chúng ta là một class thì ta không hề muốn public
   thông tin một chút nào nhất là trong thời đại bảo mật thông tin hiện nay :)) .

  Tại sao vậy ?
  Chúng ta cùng đi tới lý do , theo tôi thấy thì nó có 3 lý do cơ bản nhất :
  Trơ lại Vd :
                 class SinhVien{
             public : layten() {...};
 private : string ten;
             };
     
    Ta thử đảo đi một chút :
                class SinhVien{
             public : layten() {...};
          string ten;
 //private : string ten;
             };

 int main() {
    SinhVien sinhVien;
sinhVien.ten = "Nguyen Van A";
cout << "Ten ban la: " << sinhVien.ten << endl;
 }
  + nếu ở hàm main()
   ta có hàng trăm hàng nghìn câu lệnh sử dụng tới sinhVien.ten và rồi vào một lúc bạn muốn đổi
   biến ten trong class SinhVien thành name khi đó bạn phải tìm hàng trăm hàng nghìn câu lệnh sử
   dụng tới sinhVien.ten vừa rồi và sửa lại là sinhVien.name
 
   Nếu không tin tôi bạn thử đi nói cho hàng trăm người về thông tin của bạn rồi sau đó bạn phát hiện
   ra mình bị truy nã xem :)).
 
 +cái tiếp theo mà ta thấy(tôi tạm gọi là (loi2) ) đó là khi lập trình với nhiều người ở nhiều chỗ có nhiều câu lệnh kiểu
 sau :
 sinhVien.ten = "Nguyen Van A";
 sinhVien.ten  =      "Nguyen Van A"; .....
 khi "Nguyen Van A" muốn thay = "Nguyen V" thi bạn phải đi tìm từng dòng code một vì nếu tìm
 theo phương thức Ctrl-F bạn đâu có viết lệnh sinhVien.ten = "Nguyen Van A";  giống nhau đâu
 sinhVien.ten = "Nguyen Van A"; sinhVien.ten        = "Nguyen Van A"; sinhVien.ten =        "Nguyen Van A";

 Vậy có cách nào giải quyết không ?

 Từ đầu tut tới giờ tôi rất muốn được giới nhiệu với các bạn một phương thức get/set (lấy/thành lập)
 - một phương thức phổ biến để truy xuất dữ liệu của lớp (class)
 cách thức hoạt động của có như sau :  (code để dẽ hiểu nhé)
#include<iostream>

using namespace std;

class SinhVien{
public: 
   void set(string ten){  // lấy tên
    name = ten;
   }
   string get(){ // đã lấy thì phải xuất chứ
    return name;
   }
private : string name;
};

int main(){
//string ten;
SinhVien sinhVien;
//cout << "Ban ten gi? "; 
//getline(cin,ten);
sinhVien.set("Nguyen Van  A");
cout << "Ten ban la: " << sinhVien.get();
return 0;
}

   Quay trở lại lỗi 2 (loi2) vừa rồi ta thấy : để sưa ta chỉ việc tìm và thay đổi sinhVien.set() <-- chỉ có một cách viết như thế này .
 + Tiếp theo ta thấy nếu muốn làm công việc như sau :
ta code như sau :
#include<iostream>

using namespace std;

class SinhVien{
public: 
   void set(string ten){ 
    name = ten;
   }
   string get(){
    return name + " rat dep trai "; // Tôi đã thay đổi ở đây 
   }
private : string name;
};

int main(){
string ten;
SinhVien sinhVien;
cout << "Ban ten gi? "; 
getline(cin,ten);
sinhVien.set(ten);
cout << "Ten ban la: " << sinhVien.get();
return 0;
}
Như vậy nếu để nguyên cái kiểu public name muốn thay đổi như trên thì sau do ta phải đi tìm lệnh
cout << "Ten ban la: " << sinhVien.get() rồi thêm cout << "Ten ban la: " << sinhVien.get() <<" Rat dep trai " . Nhưng đối với cách này rất vất vả vì bạn thay đổi rất nhiều lần thay vì một lần như khi sử dụng hàm get/set .
Hẹn gặp lại ở B3 nhé

Không có nhận xét nào:

Đăng nhận xét