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é)
* 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ênname = 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ệnhHẹn gặp lại ở B3 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 .
Không có nhận xét nào:
Đăng nhận xét