Author Archives: blogtoiyeucsharp

REFACTORING TRONG NETBEANS PHẦN 1

Tutorial :Refactoring Java Source

REFACTORING TRONG NETBEANS

Tutorial này mình sẽ nói về tính năng rất mạnh mẽ trong NetBeans một tính năng này cá nhân mình yêu thích: “Refactoring”.

Nếu bạn chưa  biết gì NetBeans thì vào đây tìm hiểu nhé: http://netbeans.org/features/index.html, thằng này nó  miễn phí(free), Cross-flastform(Đa nền tảng).Nó là một Môi trường mã nguồn mở(Open Source) phát triển(Development) giao diện(Interface) [IDE] cho các nhà phát triển phần mềm.Netbeans là sản phẩm của Sun Microsystems. Một IDE là một ứng dụng phần mềm cung cấp các tiện ích mở rộng để các lập trình viên phát triển phần mềm, chẳng hạn như một trình soạn thảo mã nguồn(editor), trình biên dịch(Editor compiler), thông dịch, xây dựng các công cụ tự động hóa, và một trình gỡ lỗi(Debug). …

“Refactoring”, nó hổ trợ thay đổi mã nguồn của bạn một cách dễ dàng. Hãy tưởng tượng di chuyển một class giữa các gói(package) và phải chỉnh sửa nội dung trong gói bằng tay ở phía trên cùng của mỗi tập tin, hoặc muốn xóa một biến trong code  và bạn không biết rằng nếu nó được tham chiếu ở một nơi khác trong ứng dụng của bạn. Thực hiện sữa chữa bằng tay có thể dễ bị lỗi. Tuy nhiên, với khả năng sắp xếp tiên tiến có sẵn trong NetBeans, bạn có thể làm thay đổi như vậy  một cách rất dễ dàng. NetBeans cung cấp các tùy chọn sắp xếp(Menu sổ xuống) nhiều trên menu Refactor của nó. Mình sẽ minh họa một nửa trong số tiện ích trong Refactor(Netbeans) ngày hôm nay và một nửa khác trong một bài viết tiếp theo.

Refactor trong Netbeans:

Chúng ta đi tìm hiểu vào từng thành phần một của Menu sổ xuống này nhé.

Rename:

Rename refactoring cho phép bạn thay đổi không chỉ là tên của lớp(class name) mà còn bất kỳ constructor(Phương thức khởi tạo),Các member(Field,Method)….. Ở đây, tôi sẽ thay đổi tên của giá trị biến thành AddedValue trong lớp ImportingClass:

Chọn Refactor

Tự động, tên biến cũng được thay đổi trong lớp MoveClass:

Move(Di chuyển):

Move(di chuyển) một class(Lớp) từ một package(gói) đến một package(gói) khác có thể xem như là một nhiệm vụ dễ dàng, bạn chỉ cần sao chép và dán nội dung của tập tin nguồn vào thư mục mới và sau đó chỉnh sửa các câu lệnh trong gói ở phía trên cùng của tập tin .Tuy nhiên, nếu các lớp khác Import hoặc reference class đó.Sau đó các nhà phát triển(Chúng ta) cũng phải tìm kiếm thông qua và sửa đổi các tập tin. Ở đây là làm thế nào bạn có thể di chuyển MoveClass từ gói refactoringpackage2 tới  refactoringpackage1:

Copy(sao chép):

Copy refactoring  cho phép bạn sao chép nội dung của một class tới  package(gói) khác.Ttự động thay đổi package(gói) câu lệnh ở trên cùng của tập tin nguồn.

Chuyển class nội dung class copyClass đến gói refactoringpackage2

Chon copy

To Package:Copy tới gói….(bạn chọn gói để copy tới)

Safe Delete(Xóa an toàn):

Đôi khi bạn xem lại code trước đây, bạn quyết định loại bỏ một biến thành viên của 1 Class mà bạn nghĩ rằng nó không được sử dụngchỉ để tìm ra nó không thực sự xuất hiện trong code của bạn, và sau đó class của bạn không biên dịch được. Với refactoring Xóa an toàn, bạn có thể xác định từng cách sử dụng một Method(Phương thức), Class(Lớp), hoặc field(biến) trong code trước khi xóa nó. mình sẽ minh họa  nó bằng việc cố gắng để xóa các biến AddedValue từ lớp ImportingClass :

Tuy nhiên , biến được tham chiếu trong MoveClass class, vì vậy xóa nó sẽ gây ra một lỗi. Thì NetBeans cảnh báo bạn, và thậm chí có thể hiển thị cho bạn nơi mà các member  bạn  muốn xóa bị tham chiếu. nếu bạn nhấp vào  nút “Show Useges…”

Change Method Parameters (Thay đổi Tham số Phương thức):

Change Method Parameters cho phép bạn thay đổi mọi thứ một cách an toàn. Ở đây bạn có thể add Paramater(Thêm tham số) ,xóa(Remove),sữa(tên biến,kiểu dữ liệu….) Paramater(Tham số).thay đổi mức truy cập(Access),kiểu trả về(Return Type),tên phương thức(Name Method) và cho bạn create new Method(Tạo mới 1 phương thức) và Delegate phương thức tồn tại(Nghỉa là gọi phương thức hiện hành trong Create new  Method ).Hình ảnh này mình sẽ cố gắng để xóa tham số x của phương thức Show trong ImportingClass Class:

Tham số X được sử dụng trong thân của phương thức, và do đó một cảnh báo sẽ được hiển thị:

Đối các ví dụ sau , mình sẻ tạo ra thêm một lớp được gọi là Truck, lớp này được thừa kế từ một lớp  Vehicles

Pull Up:

Khi làm việc với Class và lớp cha(Supper Class), Pull Up refactoring là rất hữu ích. Nó cho phép bạn di chuyển các thành viên lớp (Field  và Method) từ một lớp con(subclass ) vào lớp cha(Supper Class).

-Chúng ta thấy nó chuyển method stop() trong class con(subclass) chuyển lên class cha(supperclass)

Push Down:

Push Down là đối lập với Pull Up refactoring. Nó đẩy một thành viên lớp cha xuống thành một lớp con.

Chỉ có bao nhiêu đây cho hướng dẫn này, lưu ý rằng ở đây chỉ có một nửa các tính năng của NetBeans refactoring. Nhóm mình sẽ viết tiếp một  nửa còn lại về Repactoring trong một bài tiếp .Các bạn đón theo giỏi nhé.

Tác giả : Trần Thanh Nhã

Trang tham khảo:

http://significantinsignificance.wordpress.com   |  http://docs.oracle.com/javase/

Advertisements

Một số giải thuật cơ bản Phần 2 _Insertion Sort

Tiếp theo giải thuật SelectionSort chúng tar bàn tiếp đến giải thuật Sắp xếp chèn trực tiếp – Insertion Sort.
Băt đầu nhé các bạn:

 Ý tưởng: Giả sử có 1 dãy a1 , a 2,…,an trong đó (i – 1) phần tử đầu tiên a1 , a 2,…, a(i-1) đã có thứ tự. Ý tưởng của giải thuật là tìm cách chèn phần tử a vào vị trí thích hợp của đoạn đã sắp xếp để có dãy mới a1 , a 2,…, ai đã có thứ tự. Cứ như thế các phần tử tiếp theo cho đến hết dãy. Vậy ta được 1 dãy sắp xếp.
Minh họa ví dụ Insertion sort 

 Cho dãy số a

 Bước 1: Dãy a0 -a0 đã có thứ tự. Cần chèn a1 vào dãy này để dãy vẩn có thứ tự

Bước 2: Dãy a1-a 0 đã có thứ tự. Cần chèn a2 vào dãy này để dãy vẫn có thứ tự

Bước 3: Dãy a2 -a0 đã có thứ tự. Cần chèn a3 vào dãy này để dãy vẫn có thứ tự

Bước 4: Dãy a3 -a0 đã có thứ tự. Cần chèn a 4 vào dãy này để dãy vẫn có thứ tự

Bước 5: Dãy a4 -a0 đã có thứ tự. Cần chèn a5 vào dãy này để dãy vẫn có thứ tự

Bước 6: Dãy a5 -a0 đã có thứ tự. Cần chèn a6 vào dãy này để dãy vẫn có thứ tự

Bước 7: Dãy a6 -a0 đã có thứ tự. Cần chèn a7 vào dãy này để dãy vẫn có thứ tự

Cài đặt 

Mã nguồn PHP:
 void InsertionSort(int a[],int n)
{
for(int i=1;i<n;i++)
{
int x=a[i];
for(int j=i- 1;j>=0;j- -)
{
if(a[j]>x) a[j+1]=a[j];
else  break;
}
a[j+1]=x;
}
}

Một số bài làm lý thuyết để chúng tar làm quen với giải thuật này.

 Minh họa thao tác sắp xếp dữ liệu theo phương pháp

Insertion Sort cho các dãy dữ liệu sau:

 Sắp xếp tăng:

 13 8 12 6 9 10 12 7

 A H K R E C Z G

 Sắp xếp giảm

 13 8 12 6 9 10 12 7

 A H K R E C Z G

Một số bài tập cho chúng tar cài đặt làm quen trên máy

 Viết bổ sung các hàm vào chương trình xử lý mảng 1 chiều

các hàm thực hiện những yêu cầu sau:

1. Viết hàm sắp xếp tăng theo PP insertion sort cho dữ liệu số

nguyên/số thực/ký tự/ chuỗi ký tự.

2. Viết hàm sắp xếp tăng theo PP interchange sort cho dữ liệu

số nguyên/số thực/ký tự/ chuỗi ký tự.

Tác giả : Trần Thanh Nhã
BQT_ITGALAXY

Một số giải thuật cơ bản Phần 2 _SelectionSort

Mình định viết chung bên Topic Interchang Sort,Nhưng thấy nếu viết chung thì nhìn bài viết của Topic rất là dài,Và như vậy thì chúng ta thật sự rất ngại đọc,rối tung lên.Chính vì thế mình viết giải thuật tiếp theo ở đây.Thời điểm này,Mình sẽ viết tiếp Giải Thuật Chọn Trực Tiếp (Selection Sort)

Chúng ta bắt đầu nhé:

2.2. Sắp xếp chọn trực tiếp – Selection sort 

 Ý tưởng giải thuật 

Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này về vị trí thứ 0 của dãy hiện hành; sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn (n – 1) phần tử, bắt đầu từ vị trí thứ 1; lặp lại quá trình đó trên dãy hiện hành … đến khi dãy hiện hành chỉ còn 1 phần tử thì dừng

Minh họa ví dụ Selection sort 
 Cho dãy số a:

 Bước 1: Tìm min của dãy số từ a0 – an-1 . Sau đó hoán đổi min với a0

 Bước 2: Tìm min của dãy số từ a1 – an-1 . Sau đó hoán đổi min với a1

 Bước 3: Tìm min của dãy số từ a2 – an-1 . Sau đó hoán đổi min với a2

 Bước 4: Tìm min của dãy số từ a3 – an-1 . Sau đó hoán đổi min với a3

 Bước 5: Tìm min của dãy số từ a4 – an-1 . Sau đó hoán đổi min với a4

 Bước 6: Tìm min của dãy số từ a5 – an-1 . Sau đó hoán đổi min với a5

 Bước 7: Tìm min của dãy số từ a6 – an-1 . Sau đó hoán đổi min với a6

Cài đặt

Mã nguồn:
void SelectionSort(int a[],int n)
{
for(int i=0;i<n- 1;i++)
{
int min=i;
for(int j=i+1;j<=n- 1;j++) //tìm min của dãy số
if(a[j]<a[min])         //từ ai   an-1
min=j;
swap(a[min],a[i]);
}
}

Các bài tập làm cho quen:
Ví dụ làm mô phỏng

 Minh họa thao tác sắp xếp dữ liệu theo phương pháp

Selection Sort cho các dãy dữ liệu sau:

 Sắp xếp tăng:

 13 8 12 6 9 10 12 7

 A H K R E C Z G

 Sắp xếp giảm

 13 8 12 6 9 10 12 7

 A H K R E C Z G

—Phần bài tập cài đặt:
 Viết bổ sung các hàm vào chương trình xử lý mảng 1 chiều

các hàm thực hiện những yêu cầu sau:

1. Viết hàm sắp xếp tăng theo PP selection sort cho dữ liệu số

nguyên/số thực/ký tự/ chuỗi ký tự.

2. Viết hàm sắp xếp tăng theo PP interchange sort cho dữ liệu

số nguyên/số thực/ký tự/ chuỗi ký tự.

———–>Vậy là cơ bản xong về giải thuật Chọn trực tiếp(Selection Sort),Tiếp theo là chúng tar nghiên cứu tiếp đến giải Thuật Sắp xếp chèn trực tiếp – Insertion Sort .Mình sẽ viết tiếp nó ở phần Tiếp theo

Tác giả : Trần Thanh Nhã
BQT_ITGALAXY

Một số giải thuật cơ bản Phần 2_Interchange Sort

Tiếp tục phần 2 nhé các bạn.

II CÁC GIẢI THUẬT SẮP XẾP 

(Các thuật toán minh họa sắp xếp dãy không tăng trên mảng 1 chiều chứa dữ liệu là các số nguyên)

– Sắp xếp là quá trình xử lý một danh sách các phần tử để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu trữ tại mỗi phần tử.

+Các phương pháp sắp xếp thông dụng
2.1. Sắp xếp đổi chỗ trực tiếp – Interchange Sort

2.2. Sắp xếp chọn trực tiếp – Selection Sort

2.3. Sắp xếp chèn trực tiếp – Insertion Sort

2.4. Sắp xếp Nổi bọt – Bubble Sort
Và còn 1 số giải thuật khác như : Merge Sort,Bucket Sort,Heap Sort….Nhưng ở đây tar chỉ bàn luận về những vấn đề cơ bản nhất.
===========================================
Bắt Đâu
2.1. Sắp xếp đổi chỗ trực tiếp – interchange Sort 

 Khái niệm nghịch thế: 
– Xét dãy các số a: a1 , a2 , … an với a là dãy không giảm.

Nếu i<j và aj >ai thì ta gọi đó là 1 nghịch thế.

 Ví dụ: Cho dãy số a như sau:
14 5 7 8 3.
Vậy dãy trên trên có các cặp nghịch thế sau: (14, 5); (7, 3); (8, 3) ….

 Ý tưởng thuật toán: 

Xuất phát từ đầu dãy, lần lượt xét từng phần tử cho đến cuối

dãy. Tại mỗi phần tử tìm tất cả nghịch thế chứa phần tử này,

đổi chỗ phần tử này với các phần tử trong cặp nghịch thế.
Minh Họa Giải Thuật:
—Cho dãy số:

* Bước 1: Xem nghịch thế của phần tử thứ 0 – a0

* Bước 2: Xem nghịch thế của phần tử thứ 1 – a1

* Bước 3: Xem nghịch thế của phần tử thứ 2 – a2

* Bước 4: Xem nghịch thế của phần tử thứ 3 – a3

* Bước 4: Xem nghịch thế của phần tử thứ 3 – a3 tiếp theo

* Bước 5: Xem nghịch thế của phần tử thứ 4 – a4

* Bước 5: Xem nghịch thế của phần tử thứ 4 – a4 tiếp theo

* Bước 6: Xem nghịch thế của phần tử thứ 5 – a5 tiếp theo

* Bước 7: Xem nghịch thế của phần tử thứ 6- a6 tiếp theo

Cài đặt 

Mã nguồn :
void Interchangesort(int a[],int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j])
swap(a[i],a[j]); //ham hoan doi gia
//tri 2 so nguyen
}
void swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}

Vậy cơ bản là xong giải thuật Đổi chổ trực tiếp(Interchang Sort).Các bạn cài đặt thử và chạy nhé.
—Một số bài tập cơ bản để làm và hiểu rỏ hơn về giải thuật này.

Bài tập cài đặt 

 Viết bổ sung các hàm vào chương trình xử lý mảng 1 chiều

các hàm thực hiện những yêu cầu sau:

1. Viết hàm sắp xếp tăng theo PP interchange sort cho dữ liệu

số nguyên/số thực/ký tự/ chuỗi ký tự.

2. Viết hàm sắp xếp tăng theo PP interchange sort cho dữ liệu

số nguyên/số thực/ký tự/ chuỗi ký tự.

 Minh họa thao tác sắp xếp dữ liệu theo phương pháp

interchange Sort cho các dãy dữ liệu sau:

 Sắp xếp tăng:

 13 8 12 6 9 10 12 7

 A H K R E C Z G

 Sắp xếp giảm

 13 8 12 6 9 10 12 7

 A H K R E C Z G
Chúc các bạn làm tốt.
==================================================
Tiếp theo là đến giải thuật: 2.2. Sắp xếp chọn trực tiếp – Selection sort 
Có thời gian Mình sẽ viết lên sớm nhất,để cho các bạn tham khảo.waiting………………

Tác giả : Trần Thanh Nhã

Một số giải thuật cơ bản Phần 2_Bubble Sort

Tiếp theo giải thuật Chèn trực tiếp(Insertion sort) mình muốn nói tiếp 1 giải thuật cuối cùng trong phần bài viết các giải thuật cơ bản này là Giải Thuật Nổi bọt(Bubble Sort).Chúng tar bắt đầu nhé.

 Ý tưởng: (sắp tăng)
–Dựa vào ý tưởng đưa phần tử nhỏ lên đầu mảng và lớn về phía sau mảng.
–Xuất phát từ cuối dãy, đổi chỗ các cặp phần tử kế cận để đưa phần tử nhỏ hơn trong cặp phần tử đó về vị trí đứng đầu dãy hiện hành, sau đó không xét tới nó ở bước tiếp theo, do vậy ở lần lặp thứ i có vị trí đầu dãy là i.

Minh họa ví dụ Bubble sort
 Cho dãy số a

 Bước 1: Đưa phần tử nhỏ bắt đầu từ cuối mảng (j=7) lên vị trí i = 0

Bước 2: Đưa phần tử nhỏ bắt đầu từ cuối mảng (j=5) lên vị trí i = 1

Bước 3: Đưa phần tử nhỏ bắt đầu từ cuối mảng (j=6) lên vị trí i = 2


Cài đặt 

Mã nguồn PHP:
void Bubblesort(int a[],int n)
{
for(int i=0;i<n-1;i++)
for(int j=n-1;j>=i;j--)
if(a[j]<a[j-1])
swap(a[j],a[j-1]);
}

Một số bài tập lý thuyết minh họa và cài đặt.
Bài tập minh họa
 Minh họa thao tác sắp xếp dữ liệu theo phương pháp Bubble
Sort cho các dãy dữ liệu sau:
 Sắp xếp tăng:
 13 8 12 6 9 10 12 7
 A H K R E C Z G
Sắp xếp giảm
 13 8 12 6 9 10 12 7
 A H K R E C Z G

Bài tập cài đặt
 Viết bổ sung các hàm vào chương trình xử lý mảng 1 chiều
các hàm thực hiện những yêu cầu sau:
1. Viết hàm sắp xếp tăng theo PP Bubble sort cho dữ liệu số
nguyên/số thực/ký tự/ chuỗi ký tự.
2. Viết hàm sắp xếp tăng theo PP Bubble sort cho dữ liệu số
nguyên/số thực/ký tự/ chuỗi ký tự

Vậy là mình đã giới thiệu qua các giải thuật tìm kiếm và sắp xếp cơ bản nhất,Thời gian tới mình sẽ viết bài về các giải thuật gọi là hơi khó hơn chút.
Các giải thuật cho các bài viết tiếp theo ví dụ như là:Merge Sort,Quick Sort,Giải thuật tìm kiếm Knuth-Morris-Pratt,Giải thuật Boyer – Moore.Các bạn đón xem nhé.
Chúc các bạn học tốt.

Một số giải thuật cơ bản Phần 1

Đây là các loại bài về Cấu Trúc dữ liệu cơ bản mà mình sẽ viết chia sẽ với các bạn .Loạt bài này nói về Các giải thuật cơ bản,bao gồm:các giải thuật tìm kiếm trên mảng số và Các giải thuật sắp xếp.
Chúng tar bắt đầu tìm hiểu về giải thuật tìm kiếm.(các giải thuật cài đặt trên C/C++)

I Giải thuật tìm kiếm trên mảng số 
1. Tìm kiếm tuyến tính (Linear Search) 

 Ý tưởng: 

-Thuật toán tiến hành so sánh x lần lượt với các phần tử thứ 1, thứ 2,… của mảng a cho đến khi gặp phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x.

 Ví dụ: Cho dãy số sau:

5 3 6 8 9 1 2

–>Tìm phần tử có giá trị x = 9, x= 10 ???
Minh họa ví dụ 

Xét dãy số A có 7 phần tử:

5 3 6 8 9 1 2
Tìm x = 9

Tìm x = 10.Tương tự (Các bạn tự làm thử nhé)

 Cài đặt 

Mã nguồn :
 int LinearSearch (int a[], int n, int x)
{
for(int i=0;i<n;i++)
if(a[i]==x)
return i;          // trả về vị trí của x trong a
return - 1; // trả về -1 báo là không có x trong a
}

2. Thuật toán tìm kiếm nhị phân (Binary Search)

 Ý tưởng

– Giả sử dãy số a đã có thứ tự tăng.

– Tại mỗi bước tiến hành so sánh x với phần tử nằm vị trí giữa của dãy tìm kiếm hiện hành, dựa vào kết quả so sánh này để quyết định giới hạn dãy tìm ở bước kế tiếp là nửa trên hay nửa duới của dãy tìm kiếm hiện hành.

 Ví dụ:

– Cho dãy a có 7 phần tử: 3 4 6 8 9 10 13

– Tìm x = 10 và x = 2 ???

 Minh họa ví dụ

– Cho dãy số a: 3 4 6 8 9 10 13

tìm x= 10.

Mã nguồn :
 Cài đặtint BinarySearch (int a[], int n, int x)
{
int left = 0, right = n- 1;
while(left<=right)
{
int mid = (left + right)/2;
if(a[mid] == x)
return mid;
else
if( a[mid]<x)               left = mid+1;
else                        right = mid- 1;
}
return – 1;

Bài Tập Làm Cho Quen:
*Bài tập lý thuyết

 Cho dãy số sau:
7 9 13 17 27 30 31 35 38 40
a. Tìm x= 17, x=35, x=40
b. Tìm x = 23, x=10, x=36
 Cho dãy ký tự
Z R L K H F E C A
a. Tìm x = R, x = C
b. Tìm x = D, x = Q

*Bài tập thực hành 

Cho mảng 1 chiều a chứa n số nguyên. Viết chương trình thực hiện các

yêu cầu sau:

1. Viết hàm nhập/xuất mảng a.

2. Tìm max/min của a.

3. Đếm số phần tử chẵn/lẻ trong a.

4. Tìm kiếm phần tử x trong a theo 2 dạng ( trả về vị trí/xuất câu thông

báo) với giải thuật tìm kiếm tuyến tính/ tìm kiếm nhị phân.

5. Tìm trên a có bao nhiêu phần tử x.
Đến đây cơ bản là xong 2 giải thuật tìm kiếm cơ bản.Chúng tar cùng nhau thảo luận nhé.Phần tiếp theo là các giải thuật sắp xếp,mình sẽ viết nó ở phần sau(Phần 2)
Phần 2:
II CÁC GIẢI THUẬT SẮP XẾP

(Các thuật toán minh họa sắp xếp dãy không tăng trên mảng 1 chiều chứa dữ liệu là các số nguyên)

– Sắp xếp là quá trình xử lý một danh sách các phần tử để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu trữ tại mỗi phần tử.
+Các phương pháp sắp xếp thông dụng

2.1. Sắp xếp đổi chỗ trực tiếp – Interchange Sort

2.2. Sắp xếp chọn trực tiếp – Selection Sort

2.3. Sắp xếp chèn trực tiếp – Insertion Sort

2.4. Sắp xếp Nổi bọt – Bubble Sort

Phần tiếp theo sẽ được viết trong thời gian sớm nhất. Hy vọng giúp ít cho các bạn.

Tác giả : Trần Thanh Nhã

Lập trình hướng đối tượng trong PHP 5 ( PHP OOP )

Lập trình hướng đối tượng:

– Lấy đối tượng là nền tảng
– Tìm những đối tượng có sẵn hoặc xây dựng những đối tượng
– Sau đó kết hợp với nhau để giải quyết vấn đề
– Xây dựng những đối tượng mã lệnh có liên hệ khắn khít với đối tượng của thế giới thực
Ví dụ 3: Game bóng đá:
– Game bóng đá là một chương trình rất lớn chắc chắn nếu bạn muốn làm nó bạn phải xây dựng nó trên mô hình hướng đối tượng. Vậy việc đầu tiên của trước khi xây dựng game này bạn cần xác định các đối tượng chính của game
– Những đối tượng chính của game mà bạn có thể dễ dàng nhìn thấy như:
o Câu lạc bộ
o Sân vận động
o Giải thi đấu
o Cầu thủ
o Huấn luyện viên
o Cổ động viên…
– Trong một ứng dụng lớn như game bóng đá các bạn sẽ thấy xuất hiện rất nhiều đối tượng. Chúng ta sẽ phân tích thử một đối tượng trong game đó là đối tượng con người.
– Con người là một lớp chính trong game từ đối tượng ‘con người’ chúng ta sẽ mở rộng ra các đối khác như cầu thủ, trọng tài, huấn luyện viên, cổ động viên…
– Đơn giản hóa việc phát triển các chương trình
– Giúp tạo ra những chương trình có tính mềm dẻo và linh động cao (Khi sửa chữa bảo trì, nâng cấp dể dàng)
1. Lớp (Class)
– Trong lập trình các bạn thường có các kiểu dữ liệu như INT (INT mô tả các số nguyên), STRING (mô tả cho chuỗi), FLOAT (mô tả cho số thực)… nhưng nếu 1 kiểu dữ liệu mới xuất hiện thì chúng phải làm sao? Lúc đó chúng ta sẽ phải tạo ra 1 định nghĩa cho kiểu dữ liệu mới đó thông qua class. Nên class là một kiểu dữ liệu được định nghĩa trong chương trình, là một sự nâng cao của structure.
– Ví dụ tôi muốn tạo ra một kiểu dữ liệu mới để mô tả một con mèo thì lúc này tôi phải tạo ra một class để định nghĩa cho kiểu dữ liệu con mèo
– Vậy một câu hỏi đặt ra muốn tạo một class để định nghĩa cho một đối tượng mới chúng ta cần phải làm như thế nào? Điều này rất đơn giản. Chúng ta chỉ cần xác định 2 vấn đề trước khi tạo một các class mô tả cho một đối tượng đó là:
o Những thuộc tính của đối tượng.
o Hành động của đối tượng
Ví dụ: Tạo class ConMeo
Để tạo class cho đối tượng ConMeo chúng ta cần xác định 2 phần:
– Thuộc tính (attribute)
o Tên
o tuổi
o màu lông
o …
– Hành động (phương thức – method)
o chạy
o kêu
o cắn
o cào
o …
Trong phần này chúng ta chỉ mô tả về một đối tượng chung chung không cụ thể là một đối tượng nào cả
Tập tin conmeo.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function run(){
        return 'It is runing';
    }
    public function shout(){
        return 'It is shoutting "meo meo"';
    }
    public function climb(){
        return 'It is climbing';
    }
}
?>
2. Đối tượng (Object)
– Thể hiện một lớp thành một thực thể nào đó
– Có thể tạo nhiều đối tượng từ một lớp
Ví dụ:
1
2
$conMeoA = new ConMeo();
$conMeoB = new ConMeo();
Ví dụ:
- Nhà tôi có một con mèo
- Nhà bạn tôi có nuôi một con mèo
– Các đối tượng sẽ có đặc tính khác nhau
Ví dụ:
- Con mèo của tôi có tên là Mimi có lông màu trắng
- Con mèo của bạn tôi có tên là Doremon có lông màu vàng
– Tuy 2 con mèo trên có những đặc điểm khác nhau nhưng nó cùng lớp là con mèo.
3. Lớp và đối tượng
– Lớp là một cái chung chung
– Đối tượng là một cái cụ thể
Ví dụ: 
– Công thức là một lớp – Cái bánh là một đối tượng
– Mô tả về con mèo là một lớp – Con mèo nhà tôi là một đối tượng
4. Xây dựng lớp
– Tạo class
1
2
3
Class ConMeo{
}
– Khởi tạo đối tượng từ class
1
2
$conMeoA = new ConMeo();
$conMeoB = new ConMeo();
5. Thuộc tính & phương thức (properties – method)
a. Thuộc tính
– Là các đặc tính, đặc điểm của một lớp. Thuộc tính bao gồm:
o Các biến: lưu trữ các giá trị
o Biểu thức get và set: cho phép lấy và gán giá trị
Ví dụ 1: 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
//ConMeo.class.php
class ConMeo{
    private $name;
    private $age;
    private $color;
    public function getName()
    {
        return $this->name;
    }
    public function setName($value)
    {
        $this->name = $value;
    }
    public function getAge()
    {
        return $this->age;
    }
    public function setAge($value)
    {
        $this->age = $value;
    }
    public function getColor()
    {
        return $this->color;
    }
    public function setColor($value)
    {
        $this->color = $value;
    }
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
    //index.php
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->setName('Mimi');
    $conMeoA->setAge(3);
    $conMeoA->setColor('Vàng');
    echo 'Tên: ' . $conMeoA->getName() . '<br>';
    echo 'Tuổi: ' . $conMeoA->getAge() . '<br>';
    echo 'Màu lông: ' . $conMeoA->getColor() . '<br>';
    echo '<hr>';
    $conMeoB = new ConMeo();
    $conMeoB->setName('Mimi');
    $conMeoB->setAge(3);
    $conMeoB->setColor('Vàng');
    echo 'Tên: ' . $conMeoB->getName() . '<br>';
    echo 'Tuổi: ' . $conMeoB->getAge() . '<br>';
    echo 'Màu lông: ' . $conMeoB->getColor() . '<br>';
?>
b. Phương thức 
– Là các hành động có thể được thực hiện từ lớp
– Phương thức cũng giống như hàm nhưng là hàm riêng của lớp
– Phương thức có thể nhận vào các tham số và trả về các giá trị
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//conmeo.class.php
Class ConMeo{
    .....
    public function showInfo(){
        /*echo '<br>Tên: ' . $this->getName();
        echo '<br>Tuổi: ' . $this->getAge();
        echo '<br>Color: ' . $this->getColor();
        echo '<hr>';*/
        echo '<br>Tên: ' . $this->name;
        echo '<br>Tuổi: ' . $this->age;
        echo '<br>Color: ' . $this->color;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
//index.php
<?php
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->setName('Mimi');
    $conMeoA->setAge(3);
    $conMeoA->setColor('Vàng');
    $conMeoA->showInfo();
?>
Ví dụ 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//conmeo.class.php
Class ConMeo{
    
    public function run(){
        return 'It is runing';
    }
    public function shout(){
        return 'It is shoutting "meo meo"';
    }
    public function climb(){
        return 'It is climbing';
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//index.php
<?php
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->setName('Mimi');
    $conMeoA->setAge(3);
    $conMeoA->setColor('Vàng');
    $conMeoA->showInfo();
    echo 'Nó đang làm gì? - ' . $conMeoA->run();
?>
6. Phương thức khởi tạo (__construct())
a. Phương thức __contruct()
Ví dụ 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ConMeo.class.php
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function __construct(){
        $this->name = 'Mimi';
        $this->age = 1;
        $this->color = 'Vàng';
    }
    ...
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
// index.php
<?php
class ConMeo{
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->showInfo();
}
?>
Output:
1
2
3
Tên: Mimi
Tuổi: 1
Color: Vàng
b. Phương thức __contruct() với tham số
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ConMeo.class.php
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function __construct($name,$age,$color){
        $this->name = $name;
        $this->age = $age;
        $this->color = $color;
    }
    ...
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
// index.php
<?php
class ConMeo{
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo('Doremon',1000,'Xanh');
    $conMeoA->showInfo();
}
?>
Output:
1
2
3
Tên: Doremon
Tuổi: 1000
Color: Xanh
c. Phương thức __contruct() với tham số mặc định
Ví dụ 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ConMeo.class.php
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function __construct($name = 'Mimi',$age = 1, $color = 'Vàng'){
        $this->name = $name;
        $this->age = $age;
        $this->color = $color;
    }
    ...
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
// index.php
<?php
class ConMeo{
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->showInfo();
}
?>
Output:
1
2
3
Tên: Mimi
Tuổi: 1
Color: Vàng
d.  Hàm __contruct() với cách đặt tên trùng với tên class
Ví dụ 4:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ConMeo.class.php
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function ConMeo($name = 'Mimi',$age = 1, $color = 'Vàng'){
        $this->name = $name;
        $this->age = $age;
        $this->color = $color;
    }
    ...
}
?>
1
2
3
4
5
6
7
// index.php
<?php
    require_once('ConMeo.class.php');
    $conMeoA = new ConMeo();
    $conMeoA->showInfo();
?>
Output:
1
2
3
Tên: Mimi
Tuổi: 1
Color: Vàng
e. Hàm __contruct() với tham số là mảng
Ví dụ 5:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ConMeo.class.php
<?php
class ConMeo{
    //Khai bao cac thuoc tinh
    private $name;
    private $age;
    private $color;
    public function __construct($arrParama){
        $this->name = $arrParama['name'];
        $this->age = $arrParama['age'];
        $this->color = $arrParama['color'];
    }
    ...
}
?>
1
2
3
4
5
6
7
8
9
10
11
// index.php
<?php
    require_once('ConMeo.class.php');
    $arrParama = array('name'=> 'Mimi',
                'age' => 2,
                'color' => 'Vàng');
    $conMeoA = new ConMeo($arrParama);
    $conMeoA->showInfo();
?>
Output:
1
2
3
Tên: Mimi
Tuổi: 2
Color: Vàng
7. Tính chất kế thừa
Tính kế thừa trong là một ưu điểm của OOP nó giúp chúng ta mở rộng và phát triển chương trình mà không làm ảnh hưởng đến những thành phần đã có sẵn.
Ví dụ: Tạo lớp ConBao kế thừa từ lớp ConMeo
Tập tin ConBao.class.php
1
2
3
4
5
6
7
8
<?php
require_once 'ConMeo.class.php';
class ConBao extends ConMeo{
    public function showInfo(){
        echo '<br>' . __METHOD__;
        echo 'Day la mot lop the hien con bao';
    }
}
Tập tin index.php
1
2
3
4
5
6
7
8
9
10
11
12
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
require_once 'ConBao.class.php';
$arrCatInfo = array();
$arrCatInfo['name']     = 'Mabu';
$arrCatInfo['age']      = 5;
$arrCatInfo['color']    = "Xám";
$arrCatInfo['weight']   = "50 kg";
$arrCatInfo['height']   = "70 cm";
$conBaoA = new ConBao($arrCatInfo);
$conBaoA->showInfo();
8. Hàm __destruct()
Hàm __destruct() là một hàm thực sự rất khó hiểu trong PHP và nhiều lập trình viên không biết sử dụng nó vào mục đích gì. Theo lý thuyết hàm này sẽ được tự động gọi sau khi một đối tượng được khởi tạo và nó thực hiện hủy một số giá trị nào nào.
Hàm __destruct() là phương thức tự động chạy khi đối tượng được khởi tạo. Nó chỉ thực thi những lệnh trong thân hàm ở cuối trang mà đối tượng được khởi tạo.
Phương thức này thường dùng để
– Hủy hoặc tạo một session.
– Giải phóng bộ nhớ
– Đóng kết nối của ứng dụng đến Database
– Đóng kết nối của khi chúng ta mở một tập tin
– …
Ví dụ 1: Vị trí hàm __destruct() thực thực thi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
//User.class.php
class User{
    private $name;
    private $permission;
    public function __construct($name,$permission)
    {
       echo '<br> Construct function';
       $this->name = $name;
       $this->permission = $permission;
    }
    function __destruct()
    {
        echo '<br> Destruct function';
    }
}
?>
1
2
3
4
5
6
7
8
<?php
    //index.php
    require_once('User.class.php');
    $obj = new User('zendvn','Administrator');
    echo '<br>This is a test 1';
    echo '<br>This is a test 2';
    echo '<br>This is a test 3';
?>
Ví dụ 2: Khởi tạo một session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
//User.class.php
class User{
    private $name;
    private $pass;
    private $lastName;
    private $firstName;
    private $website;
    public function __construct($name,$pass)
    {
       echo '<br> Construct function';
       if($name == 'KhanhPham' &&  $pass = '123456'){
           $this->name = $name;
           $this->pass = $pass;
           $this->getInfo();
       }
    }
    public function getInfo(){
        $this->lastName = 'Vũ Khánh';
        $this->firstName = 'Phạm';
        $this->website   = 'http://www.zend.vn';
    }
    function __destruct()
    {
        echo '<br> Destruct function';
        $_SESSION['user'] = serialize($this);
    }
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//index.php
session_start();
require_once 'User.class.php';
$user = new User('KhanhPham','123456');
<?php
session_start();
if(isset($_SESSION['user'])){
    $userInfo = unserialize($_SESSION['user']);
    echo "<pre>";
    print_r($userInfo);
    echo "</pre>";
}
unset($_SESSION['user']);
Ví dụ 3: Giải phóng bộ nhớ và đóng kết nối với Database
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
//Database.class.php
class Database {
    private $hostname   = 'localhost';
    private $username   = 'root';
    private $password   = '';
    private $db         = 'test';
    private $dbCon      = null;
    private $result;
    private $connection;
    private $flagConnect;
    public function __construct() {
        $connection = mysql_connect ( $this->hostname, $this->username, $this->password );
        if (! $connection) {
            die ( 'Could not connect: ' . mysql_error () );
        } else {
            $this->connection = $connection;
            $this->flagConnect = true;
            mysql_select_db($this->db, $connection);
        }
    }
    public function fetchAll($table_name){
        if ($this->flagConnect == true) {
            $sql = 'SELECT * FROM ' . $table_name;
            $this->result = mysql_query($sql);
            return $this->result;
        }
    }
    function __destruct() {
        if ($this->flagConnect == true) {
            mysql_free_result($this->result);
            mysql_close ( $this->connection );
        }
    }
}
?>
1
2
3
4
5
6
7
8
9
10
<?php
//index.php
require_once 'Database.class.php';
$db = new Database();
$result = $db->fetchAll('user_group');
while($row  = mysql_fetch_assoc($result)){
    echo '<br>' . $row['id'] . ' - ' . $row['group_name'];
}
9. Hàm clone
Hàm này dùng để sao chép  một đối tượng từ một đối tượng khác.
Ví dụ 1: Sao chép một đối tượng không sử dụng phương thức clone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
    require_once 'ConMeo.class.php';
    $conMeoA = new ConMeo();
    $conMeoA->setName("Tiger");
    $conMeoA->setAge(3);
    $conMeoA->setColor('Vàng');
    $conMeoB = $conMeoA;
    $conMeoB->setName("Doremon");
    $conMeoB->setAge(2);
    echo '<br>-------------------------<br>';
    echo 'In thong tin con meo A <br>';
    $conMeoA->showInfo();
    echo '<br>-------------------------<br>';
    echo 'In thong tin con meo B <br>';
    $conMeoB->showInfo();
?>
Ví dụ 2: Sao chép một đối tượng sử dụng phương thức clone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
    require_once 'ConMeo.class.php';
    $conMeoA = new ConMeo();
    $conMeoA->setName("Tiger");
    $conMeoA->setAge(3);
    $conMeoA->setColor('Đen');
    $conMeoB = clone $conMeoA;
    $conMeoB->setName("Doremon");
    $conMeoB->setAge(2);
    echo '<br>-------------------------<br>';
    echo 'In thong tin con meo A <br>';
    $conMeoA->showInfo();
    echo '<br>-------------------------<br>';
    echo 'In thong tin con meo B <br>';
    $conMeoB->showInfo();
?>
10. self & parent
a. self
Là đại diện cho cách khởi tạo lớp hiện thời và thường được sử dụng gọi đến biến số có khóa static hay hàm nào đó trong lớp đang hiện tại.
Ví dụ 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class ConMeo{
    private $name;
    private $age;
    private $color;
    public static $maxSpeed = '30km/h';
    // Code cũ ...
    public function showInfo(){
        echo '<br> Tên con mèo là: ' . $this->getName();
        echo '<br> Tuổi: ' . $this->getAge();
        echo '<br> Màu lông: ' . $this->getColor();
        echo '<br>Nó đang làm gì? - ' . self::run();
        echo '<br>Tốc độ tối đa của nó là:  - ' . self::$maxSpeed;
    }
    // Code cũ ...
}
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class ConMeo{
    private $name;
    private $age;
    private $color;
    public static $maxSpeed = '30km/h';
    // Code cũ ...
    public function showInfo(){
        echo '<br> Tên con mèo là: ' . $this->getName();
        echo '<br> Tuổi: ' . $this->getAge();
        echo '<br> Màu lông: ' . $this->getColor();
        echo '<br>Nó đang làm gì? - ' . ConMeo::run();
        echo '<br>Tốc độ tối đa của nó là:  - ' . ConMeo::$maxSpeed;
    }
    // Code cũ ...
}
b. parent
Đại diện cho class cha của lớp đang thừa kế và thường được sử dụng gọi đến biến số có khóa static hay hàm nào đó trong lớp cha của lớp hiện tại hiện tại.
1
2
3
4
5
6
7
8
9
10
11
12
<?php
require_once('ConMeo.class.php');
class ConBao extends ConMeo{
    public static $maxSpeed = '90km/h';
    public function showInfo(){
        parent::showInfo();
        echo '<br>Tốc độ tối đa của nó là:  - ' . self::$maxSpeed;
    }
}
?>
1
2
3
4
5
6
7
<?php
    require_once('ConBao.class.php');
    $conBaoA = new ConBao();
    $conBaoA->showInfo();
?>
11. PPP (public – protected – private)
Giống như mọi ngôn ngữ lập trình hướng đối tượng khác
public: Có thể truy cập từ mọi nơi
protected: chỉ sử dụng cho class đó và các class được mở rộng từ class đó
private: chỉ sử dụng ở trong chính class đó
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    class sample {
        public $a = 1;
        private $b = 2;
        protected $c = 3;
        function __construct() {
            echo $this->a . $this->b . $this->c;
        }
    }
    class miniSample extends sample {
        function __construct() {
            echo $this->a . $this->b . $this->c;
        }
    }
    $a = new sample();
    $b = new miniSample();
    echo $a->a . $a->b . $a->c;
?>

Là thành phần trung gian giữa ứng dụng và database, Entity Data Model (EDM) giúp tạo liên kết và mô tả giữa nguồn dữ liệu vật lý và các đối tượng bussiness (hay object layer) trong ứng dụng. Dựa vào sự lựa chọn thành phần nào sẽ được tạo ra trước, một ứng dụng Entity Framework (EF) có thể sử dụng 1 trong 3 cách tiếp cận: Database First, Model First và Code First.

 

Các sơ đồ dưới đây minh hoạt mối quan hệ và thứ tự tạo ra giữa các thành phần dữ liệu trong ứng dụng của Entity Framework. Phần Model tương ứng với tập tin .edmx, Code tương ứng với tập tin .cs (hoặc .vb nếu bạn dùng VB.NET).

Entity Framework design approaches

Note: Bạn có thể nhận thấy rằng phần Model luôn được theo sau bởi Code, điều này là nhờ công cụ Entity Data Model Designer trong Visual tự động tạo ra code tương ứng mỗi khi bạn thực hiện chỉnh sửa tập tin .edmx.

Database First:

Đây là cách thông thường và được hỗ trợ từ phiên bản EF 1 trong Visual Studio 2008.

EF sẽ tự động tạo ra data model và các class (object layer) cho bạn từ database có sẵn thông qua công cụ Entity Data Model Wizard. Bạn có thể thay đổi data model và cập nhật lại vào database. Đây là cách tiếp cận phổ biến vì cách thực hiện đơn giản, nhanh chóng

Model First:

Hướng tiếp cận này được bổ sung từ phiên bản EF 4 trong Visual 2010.

Bạn có thể tạo một data model rỗng bằng công cụ Entity Data Model Designer, khi đó object layer cũng tự động được sinh ra. Sau khi đã hoàn thành việc thiết kế, bạn có thể sử dụng chức năng Generate Database from Model để tạo ra các mã DDL (data definition language) dựa trên mã SSDL (Store Schema Definition Language). Các mã DDL này sẽ được thực thi và lưu thành tập tin .sql.

Code First:

Với phiên bản EF 4 bạn cần phải cài thêm thư viện EF Feature CTP (Community Technology Preview) để sử dụng. Tuy nhiên tính năng này đã được tích hợp vào trong phiên bản EF 4.1 và với phiên bản VS 2010 hiện tại thì bạn cần phải download để cài đặt thủ công.

Hướng tiếp cận này bỏ qua phần Model (.edmx), bạn có thể thiết kế các class tương ứng với các table của database mà bạn cần làm việc hoặc muốn tạo ra. Với hướng tiếp cận này, bạn sẽ sử dụng class DbContext thay vì ObjectContext để thao tác với database. Việc sử dụng Code First đòi hỏi bạn phải thực hiện các công việc một cách thủ công nhưng bù lại nó linh hoạt và được sử dụng rất phổ biến.

Tạo EDM theo hướng Database First (Step by Step)

Phần này bạn sẽ được hướng dẫn cách tạo một Entity Data Model từng bước dựa vào công cụ Entity Data Model Designer. Dữ liệu nguồn được sử dụng trong ví dụ là Northwind (download tại http://www.microsoft.com/download/en/details.aspx?id=23654).

Bước 1: Tạo dự án mới với kiểu là Console Application.

Bước 2: Nhấn Add New Item (Ctrl+Shift+A) trên thanh công cụ và chọn mục ADO.NET Entity Data Model trong hộp thoại hiện ra. Đặt tên mục sắp thêm vào là  NorthwindModel với phần mở rộng mặc định là .edmx. Nhấn Add.

Insert ADO,NET Entity Data Model

Bước 3: Cửa sổ Entity Data Model Wizard hiện ra. Bước này để xác định bạn sẽ tạo model từ database có sẵn hoặc một model rỗng. Bạn để lựa chọn mặc định là Generate from database và nhấn Next.

Entity Data Model Wizard - Step 1

Bước 4: Bước này bạn cần chọn database nào sẽ sử dụng. Chuỗi kết nối sẽ tự động được sinh trong phần Entity connection string. Với tùy chọn Save entity connection settings in App.Config, chuỗi kết nối này sẽ tự động được thêm vào tập tin App.Config, nhờ đó bạn không cần nhớ chuỗi kết nối mà chỉ cần nhớ tên của kết nối là NorthwindEntities.

Entity Data Model Wizard - Step 2

Trong trường hợp bạn chưa có sẵn kết nối với database nào, hãy nhấn nút New Connection… Các kết nối mà bạn đã tạo sẽ hiện ra trong cửa sổ Server Explorer. Nhấn Next.

Bước 5: Lựa chọn các table, view và stored procedure bạn muốn sử dụng. Trong ví dụ này, tôi chỉ sử dụng ba table là Orders, Order Details và Products.

Entity Data Model Wizard - Step 3

Sau khi nhấn Finish, tập tin NorthwindModel.edmx sẽ được thêm vào Solution Explorer. Đây là tập tin có dạng .xml và được mở với trình mặc định ADO.NET Entity Data Model Designer với giao diện trực quan như hình dưới. Nếu muốn coi nội dung của tập tin này dưới dạng văn bản .xml, bạn nhấn chuột phải vào tập tin trong Solution Explorer > Open With… và chọn XML Editor. Bạn có thể coi các thông tin đầy đủ của model trong cửa sổ Model Browser và Mapping Details.

Entity Data Model Designer

Ngoài tập tin .edmx trên, một tập tin khác cũng được tự động tạo ra làNorthwindModel.Designer.cs. Tập tin này chứa code C# được sinh ra cho các class bạn sẽ sử dụng trực tiếp khi lập trình. Các class này được gọi là Object Layer (là phần Object Services trong kiến trúc của Entity Framework).

Khảo sát tập tin này, bạn sẽ thấy nó bao gồm các class là: NorthwindEntities, Order, Order_Detail và Product. Trong đó, class  NorthwindEntities chính là class thừa kế từ ObjectContext mà bạn cần sử dụng để tạo kết nối và thao tác với database.

Kiểm tra kết quả với LINQ to Entities

Việc sử dụng LINQ to Entities rất đơn giản, tương tự như LINQ to SQL. Bạn chỉ cần làm việc với các class của object layer và property của chúng. Ví dụ sau in ra các sản phẩm có CategoryID là 1 trong bảng Products:

 

01 // ...
02 NorthwindEntities db = new NorthwindEntities();
03
04 var query = from p in db.Products
05             where p.CategoryID == 1
06             select p.ProductName;
07
08 foreach (var item in query)
09 {
10     Console.WriteLine(item);
11 }
12 // ...

 

Output:

Chai
Chang
Guaraná Fantástica
Sasquatch Ale
Steeleye Stout
Côte de Blaye
Chartreuse verte
Ipoh Coffee
Laughing Lumberjack Lager
Outback Lager
Rhönbräu Klosterbier
Lakkalikööri

————————————-

http://yinyangit.wordpress.com