Thứ Tư, 31 tháng 10, 2012


Recursion

Note:
(*) Means that students are required to understand essential features only (the problem explaination, definitions, the outline of algorithms…), not in details.

5.1. Recursive definition


1) A base case (anchor or the ground case) that does not contain a reference to its own type.
2) An inductive case that does contain a reference to its own type.
For example: Define the set of natural numbers

5.2. Recursive program/algorithm

A recursive program/algorithm is one that calls itself again.
There are three basic rules for developing recursive algorithms.
• Know how to take one step.
• Break each problem down into one step plus a smaller problem.
• Know how and when to stop.

public static void convertToBin(int decimalNum)
int quotient = decimalNum / 2;        // One step
     int remainder = decimalNum % 2;   // One step
     if (quotient > 0)
{convertToBin(quotient); // smaller problem
}
System.out.print(remainder); // after all recursive calls have been
// made last remainder printed first
}

5.3. Recursion application

  • Recursive definitions are used in defining functions or sequences of elements
  • Purpose of recursive definition:
    • Generating a new elements
    • Testing whether an element belongs to a set (*)
  • (*) The problem is solved by reducing it to a simpler problem
Example – factorial calculation

5.4. Method calls and recursion implementation

How does recursion actually work?
  • Each time a method is called, an activation record (AR) is allocated for it. This record usually contains the following information:
    • Parameters and local variables used in the called method.
    • A dynamic link, which is a pointer to the caller's activation record.
    • Return address to resume control by the caller, the address of the caller’s instruction immediately following the call.
    • Return value  for a method not declared as void. Because the size of the activation record may vary from one call to another, the returned value is placed right above the activation record of the caller.
  • Each new activation record is placed on the top of the run-time stack
  • When a method terminates, its activation record is removed from the top of the run-time stack
  • Thus, the first AR placed onto the stack is the last one removed

5.5. Direct recursion

5.5.1. Tail recursion

There is only one recursive call at the very end of a method implementation
class Main
{static void tail(int n)
{if(n >0)
{ System.out.print(n + "  ");          
tail(n-1);
}
}
public static void main(String [] args)
{tail(10);
System.out.println();
}
}
Output: 10  9  8  7  6  5  4  3  2  1

5.5.2. Non-Tail recursion

The recursive call is not at the very end of  a method implementation

public class Main
{public static void reverse() throws Exception
{char ch = (char) System.in.read();
if(ch != '\n')
{reverse();
System.out.print(ch);
}
}
public static void main(String [] args) throws Exception
{System.out.println("\nEnter a string to be reversed:");
reverse();
System.out.println("\n");
}
}

Running of the program:

5.6. Convert recursion implementation to iterative implementation using stack

public static void nonRecursiveReverse() throws Exception
{MyStack t = new MyStack();
char ch;
while(true)
{ch = (char) System.in.read();
if(ch == '\n') break;
t.push(ch);
}
while(!t.isEmpty())
System.out.print(t.pop());
}

5.7. Indirect recursion

  • If f() calls itself, it is direct recursive
  • If f() calls g(), and g() calls f(). It is indirect recursion. The chain of intermediate calls can be of an arbitrary length, as in:
                        f() -> f1() -> f2() -> ... -> fn() -> f()
  • Example: sin(x) calculation

5.8. Nested recursion

         

5.9. Excessive recursion


The tree of calls for fibo

5.10. More Examples

The Tower of Hanoi
  • Rules:
    • Only one disk may be moved at a time.
    • Each move consists of taking the upper disk from one of the rods and sliding it onto another rod, on top of the other disks that may already be present on that rod.
    • No disk may be placed on top of a smaller disk.
Source: http://en.wikipedia.org/wiki/Hanoi_tower


void moveDisks(int n, char fromTower, char toTower, char auxTower)
{if (n == 1) // Stopping condition
Move disk 1 from the fromTower to the toTower;
else
{moveDisks(n - 1, fromTower, auxTower, toTower);
move disk n from the fromTower to the toTower;
moveDisks(n - 1, auxTower, toTower, fromTower);
}
}

Drawing fractals

von Knoch snowflakes

  1. Divide an interval side into three even parts
  2. Move one-third of side in the direction specified by angle
    • Turn to the right 60° (i.e., turn –60°) and go forward one-third of side
    • Turn to the left 120° and proceed forward one-third of side
    • Turn right 60° and again draw a line one-third of side long


private void drawFourLines(double side, int level, Graphics g) {
if (level == 0) {
// arguments to sin() and cos() must be angles given in radians,
// thus, the angles given in degrees must be multiplied by PI/180;
pt.x = ((int)(Math.cos(angle*Math.PI/180)*side)) + currPt.x;
pt.y = ((int)(Math.sin(angle*Math.PI/180)*side)) + currPt.y;
g.drawLine(currPt.x, currPt.y, pt.x, pt.y);
currPt.x = pt.x;
currPt.y = pt.y;
}
else {                                  
drawFourLines(side/3.0,level-1,g);
left (60);
drawFourLines(side/3.0,level-1,g);
right(120);
drawFourLines(side/3.0,level-1,g);
left (60);
drawFourLines(side/3.0,level-1,g);
}
}

5.11. Recursion vs. Iteration

  • Some recursive algorithms can also be easily implemented with loops
    • When possible, it is usually better to use iteration, since we don’t have the overhead of the run-time stack (that we just saw on the previous slide)
  • Other recursive algorithms are very difficult to do any other way

5.12. Back tracking


In solving some problems, a situation arises where there are different ways leading from a given position, none of them known to lead to a solution. After trying one path unsuccessfully, we return to this crossroad and try to find a solution using another path. However, we must ensure that such a return is possible and that all paths can be tried. This technique is called backtracking. This technique is used in artificial intelligence, and one of the problems in which backtracking is very useful is the n-queens problem

Each choice leads to another set of choices. Make one choice and continue. If you reach a dead end, go back to previous choice and try next alternative.
putQueen(row)
for every position col on the same row
if position col is available
                                                place the next queen in position col;
if (row < n)
putQueen(row+1);
else success;
                                                remove the queen from position col;
source -

CF Department

Chủ Nhật, 28 tháng 10, 2012

Snowflake (Snowdrop)


Snowflake (Snowdrop)

Snowdrop là tên tiếng Anh của hoa Giọt Tuyết , lọai hoa màu trắng sữa dịu dàng này được truyền thuyết cho là đã được sinh ra trong vườn Địa Đàng . Một thiên thần , người đã an ủi Eva và sự cằn cỗi của thiên đàng vào mùa đông, đã bắt được 1 bông tuyết đang rơi, thổi nhẹ vào nó và bảo nó hãy hóa thành một bông hoa tươi tốt mãi mãi. Ngày nay, hoa Giọt tuyết luôn là bông hoa đầu tiên của mùa Xuân và báo hiệu cho chúng ta biết chẳng mấy chốc mùa Đông sẽ kết thúc. Điều này giải thích tại sao nó tương trưng cho "Niềm hi vọng -Sự an ủi"

Hoa Giọt tuyết





Hoa giọt tuyết dành tặng cô gái tháng 1

Em- nhỏ nhắn và mỏnh manh đến mức ...như những bông hoa giọt tuyết vậy ... tan chảy dần khi chạm vào .

Em- trắng muốt và thanh khiết ...Tôi sợ mình đến gần ,em sẽ biến mất trong sự trong lành đó ... Tội lỗi luôn khiến tôi cảm thấy mình và em như những bông hoa giọt tuyết đang tan dần trong sự nóng ráp thô bạo của ngọn lửa vậy ...

Hoa giọt tuyết ...một tình yêu trong lành và dễ vỡ như tuyết .

Tôi khao khát những gì không có thật ...những gì mãi mãi không thuộc về tôi ...

Tôi gặp em trong màu trắng của nắng và hoa .Em mơ hồ đến mức tôi cứ nghĩ em là thiên thần của hoa giọt tuyết-vật em tặng tôi cho lần đầu gặp gỡ .

Tôi vẽ em bằng sự khao khát và nỗi nhớ về một thứ không có thật ...Tôi như điên dại ...em là mộng hay là hư vô ? Tôi mãi mãi không hiểu .

Rồi tình cờ ,tôi được gặp lại em ...có thể đây là mơ ...giấc mơ về thiên thần hoa giọt tuyết...Nhưng tôi đâu hề biết đó là ảo ảnh cuối cùng về em ...Hoa giọt tuyết dịu dàng và mỏng manh ...Đến độ tan chảy khi chạm vào sự nóng ráp thô bạo của ngọn lửa ...

Tôi đang làm gì thế ?

Nhớ một người không tồn tại

Tôi đang làm gì thế ?

Chờ một người mãi mãi ra đi

Tôi đang làm gì thế ?

Quay nhìn dĩ vãng đau thương

Tôi đang làm gì thế ?

Xem thường cả thực tại

Một người không có dĩ vãng ,không có hiện tại ,không có cả tương lai ...Tôi... mãi mãi ôm giấc mơ không có thật...

Em không đến từ đây .Em không thuộc về nơi này .Em thuộc về tự do và cánh đồng tuyết trắng bất tận-nơi có nắng , gió , hoa giọt tuyết trong trắng và...không có tôi ....


Em không đến từ đây .Em không thuộc về nơi này .Em...không thuộc về tôi ... theo blog Dương Thái Khôi.

Thứ Năm, 27 tháng 9, 2012

TÌnh Khúc Vàng




Tình Khúc Vàng


Anh nghe mùi hương trên tóc quen nồng nàn 
Anh nghe tình em nghe tình em chứa chan 
Anh nghe bàn tay trong bàn tay nhẹ nhàng, 
với người đời hé môi cười.... 

Anh nghe niềm vui trên phố đông rộn ràng, 
Anh nghe tình yêu bên tình yêu hát vang 
Anh nghe bờ vai bên bờ vai dịu dàng, 
ngỡ ngàng cùng ánh chiều sang. 

ĐK : 

Oh, oh.....Ngồi bên em cung đàn hát lên tình khúc vàng 
Bao nhiêu âu lo đời vụt tan 
Ngày mai xa nhau rồi, phút giây còn muôn lời 
Em ơi, bao nhiêu điều chưa nói?! 
Nhớ từng hàng cây, nhớ từng con phố 
bước theo em bâng khuâng hỡi tình say. 

Nhớ về dòng sông, ấm lòng màu đông 
Nụ hôn ta chơi vơi theo con sóng.... 
Gửi tình vào mây, gửi tình vào gió 
Có xa nhau xin đừng là tàn tro 
Muốn là dòng sông, lững lờ mùa đông 
Ôm em trong giấc mơ tình khúc vàng...

Thứ Hai, 24 tháng 9, 2012

Miền Trung Yêu Dấu

http://mp3.zing.vn/bai-hat/Mien-Trung-Yeu-Dau-Dan-Truong/IWZ9BIEI.html

Lâu lắm chưa về, thăm lại miền trung miền yêu dấu xưa, tìm lại nụ hôn năm nào đánh mất trong một chiều mưa, không biết bây chừ ai có còn nhớ đến tên nhau nhớ câu thề xưa hẹn hò trong mưa, ai đã quên rồi câu chuyện thần tiên ngày thơ rất xa, bỏ lại hàng dương xanh xao rủ bóng bên bờ phù sa, mây thắp mưa về dâng nỗi sầu, nơi chốn xa xôi cuối trời chân trời đó dấu yêu thuở nào, nhớ ai...ai đứng bên cầu, những khi tan trường bóng ngả hoang hôn ngâng ngơ chờ nhau, nhớ ai.. .hoa phượng rơi đầy lối xưa bây giờ chỉ riêng mình anh phượng ơi có hay, tiếng ve xao xuyến đêm hè lấn trong sương mờ trăng về nghiêng khắp nẻo đường quê, chốn xưa sương lạnh vai mềm, bởi em xa rồi chỉ riêng mình anh , lặng yên bóng đêm
hò...ơi...đêm nay gió về se lòng,có ai còn chúc duyên nồng cho nhau
hò...ơi....đêm nay anh về qua cầu bóng dương còn đó, nhưng người xưa ở đâu.

Thứ Sáu, 14 tháng 9, 2012

Những khái niệm cơ bản của lập trình hướng đối tượng – Phần 3

Những khái niệm cơ bản của lập trình hướng đối tượng – Phần 3

Về mục đích, Lớp và Cấu trúc đều có chung một mục đích ban đầu, đó là nhóm một tập hợp các dữ liệu lại với nhau để xử lí đồng bộ và thống nhất: Cấu trúc nhóm các dữ liệu hay phải đi kèm với nhau lại thành một nhóm cho dễ xử lí. Tương tự, Lớp là tập hợp một số thuộc tính chung của đối tượng để xử lí.
2/- So sánh lớp và cấu trúc Trong phần này, chúng ta sẽ tiến hành so sánh Class (Lớp) và Structure (Cấu trúc) trên nhiều khía cạnh khác nhau:
♦ Mức khái niệm
♦ Mục đích và chức năng
♦ Về ưu và nhược điểm
So sánh ở mức khái niệm
Ở mức khái niệm, Lớp và cấu trúc hoàn toàn khác nhau:
♦ Lớp là khái niệm chỉ có trong lập trình hướng đối tượng; nó được dùng để biểu diễn một tập các đối tượng tương tự nhau.
♦ Trong khi đó, Cấu trúc là khái niệm chỉ tồn tại trong lập trình cấu trúc, không phải là một khái niệm của lập trình hướng đối tượng. Vì trong lập trình hướng đối tượng, tất cả các thực thể đều được coi là một đối tượng, nghĩa là nó phải là một thể hiện cụ thể của một lớp nào đó. Do đó, trong lập trình hướng đối tượng, không có khái niệm Cấu trúc.
So sánh về mục đích và chức năng
Về mục đích, Lớp và Cấu trúc đều có chung một mục đích ban đầu, đó là nhóm một tập hợp các dữ liệu lại với nhau để xử lí đồng bộ và thống nhất: Cấu trúc nhóm các dữ liệu hay phải đi kèm với nhau lại thành một nhóm cho dễ xử lí. Tương tự, Lớp là tập hợp một số thuộc tính chung của đối tượng để xử lí.
Tuy nhiên, Lớp và Cấu trúc cũng có một số khác biệt trên khía cạnh này:
♦ Lớp ngoài mục đích nhóm các thuộc tính dữ liệu của đối tượng, còn nhóm các hoạt động của đối tượng thành các phương thức của Lớp.
♦ Trong khi đó, mặc dù cũng có thể cung cấp các hàm trong Cấu trúc, nhưng mục đích chính của Cấu trúc chỉ là nhóm dữ liệu thành cấu trúc cho dễ xử lí.
So sánh về ưu nhược điểm
Vì có cùng mục đích là nhóm các dữ liệu lại với nhau để xử lí, cho nên Lớp cà Cấu trúc có cùng ưu điểm là làm chương trình gọn gàng, xử lí đồng bộ và thống nhất.
Tuy nhiên, Lớp còn có một số ưu điểm mà Cấu trúc không có:
♦ Lớp có khả năng bảo vệ dữ liệu tránh bị truy nhập tự do từ bên ngoài. Các chương trình bên ngoài chỉ có thể truy nhập vào dữ liệu của đối tượng thông qua các phương thức do Lớp cung cấp, không thể tự do truy nhập. Trong khi đó, Cấu trúc mặc dầu đã nhóm dữ liệu với nhau nhưng không có khả năng bảo vệ dữ liệu: Các chương trình bên ngoài vẫn có thể truy nhập tự do vào các thành phần của Cấu trúc.
♦ Lớp có khả năng đóng gói để hạn chế tối đa thay đổi khi phải sửa lại mã chương trình. Khi có sự thay đổi, chỉ cần thay đổi mã của một phương thức, các chương trình bên ngoài sử dụng phương thức đó đều không phải thay đổi. Trong khi đó, nếu thay đổi một thành phần của Cấu trúc, ta phải thay đổi mã của tất cả các chương trình sử dụng thành phần đó của Cấu trúc.
♦ Lớp có thể được kế thừa bởi một Lớp khác, điều này làm tăng khả năng sử dụng lại mã nguồn của chương trình. Trong khi đó, Cấu trúc hoàn toàn không có cơ chế kế thừa, cho nên nhiều khi phải viết lại những đoạn mã giống nhau nhiều lần. Điều này vừa tốn công sức, vừa không an toàn khi có sự thay đổi một trong những đoạn mã giống nhau đó.
3/- Thành phần Private và Public của lớp Để bảo vệ dữ liệu tránh bị truy nhập tự do từ bên ngoài, lập trình hướng đối tượng sử dụng các từ khoá quy định phạm vi truy nhập các thuộc tính và phương thức của lớp. Một cách tổng quát, lập trình hướng đối tượng chia ra hai mức truy nhập các thành phần lớp:
Private: Truy nhập trong nội bộ lớp.
Protected: Thành phần được bảo vệ, được hạn chế truy nhập như thành phần private (sẽ được trình bày sau).
Public: Truy nhập tự do từ bên ngoài.
Thành phần private
Thành phần private là khu vực dành riêng cho lớp, không chia sẻ với bất kì lớp khác từ bên ngoài. Thành phần private chỉ cho phép truy nhập trong phạm vi nội bộ lớp: Từ phương thức vào các thuộc tính hoặc giữa các phương thức của lớp với nhau. Các thành phần private không thể truy nhập từ bên ngoài lớp, cũng như từ đối tượng khác.
Trong một lớp, thông thường các thành phần sau sẽ được đặt vào khu vực private của lớp:
♦ Tất cả các thuộc tính dữ liệu của lớp. Các thuộc tính dữ liệu của lớp được đặt vào vùng private nhằm bảo vệ chúng, tránh sự truy nhập tự do từ bên ngoài.
♦ Các phương thức trung gian, được sử dụng như các bước tính toán đệm cho các phương thức khác. Các phương thức trung gian được đặt vào vùng private để thực hiện việc đóng gói trong lập trình hướng đối tượng: Các đối tượng, chương trình bên ngoài không cần, và không thể biết cách tính toán cụ thể bên trong của lớp.
Thành phần public
Thành phần public là khu vực mà Lớp có thể chia sẻ với tất cả các chương trình và đối tượng bên ngoài. Thành phần public có thể được truy nhập từ bên trong lẫn bên ngoài lớp:
Bên trong lớp: từ phương thức lớp vào các thuộc tính dữ liệu của lớp, hoặc giữa các phương thức của lớp với nhau.
Bên ngoài lớp: Từ chương trình bên ngoài hoặc các đối tượng khác vào các phương thức của lớp.
Trong một lớp, thông thường các thành phần sau sẽ được đặt vào vùng chia sẻ public của lớp:
♦ Các phương thức để nhập/xem (set/get) các thuộc tính dữ liệu của lớp. Các phương thức này sẽ cho phép các đối tượng bên ngoài truy nhập vào các thuộc tính dữ liệu của lớp một cách gián tiếp.
♦ Các phương thức cung cấp chức năng hoạt động, cách cư xử của đối tượng đối với môi trường bên ngoài. Các phương thức này thể hiện chức năng của các đối tượng lớp.
4/- Một số ngôn ngữ lập trình hướng đối tượng Nội dung phần này sẽ trình bày một số ngôn ngữ lập trình hướng đối tượng thông dụng hiện nay:
♦ Ngôn ngữ lập trình C++
♦ Ngôn ngữ lập trình ASP.NET và C#.NET
♦ Ngôn ngữ lập trình Java
4.1/- C++
C++, ra đời vào giữa những năm 1980, là một ngôn ngữ lập trình hướng đối tượng được mở rộng từ ngôn ngữ lập trình cấu trúc C. Cho nên, C++ là ngôn ngữ lập trình nửa hướng đối tượng, nửa hướng cấu trúc.
Những đặc trưng hướng đối tượng của C++
♦ Cho phép định nghĩa lớp đối tượng.
♦ Cho phép đóng gói dữ liệu vào các lớp đối tượng. Cho phép định nghĩa phạm vi truy nhập dữ liệu của lớp bằng các từ khoá phạm vi.
♦ Cho phép kế thừa lớp với các kiểu kế thừa khác nhau tuỳ vào từ khoá dẫn xuất.
♦ Cho phép lớp kế thừa sử dụng các phương thức của lớp bị kế thừa (trong phạm vi quy định).
♦ Cho phép định nghĩa chồng phương thức trong lớp kế thừa.
Những vi phạm hướng đối tượng của C++
Những vi phạm này là do kết quả kế thừa từ ngôn ngữ C, một ngôn ngữ lập trình thuần cấu trúc.
♦ Cho phép định nghĩa và sử dụng các biến dữ liệu tự do.
♦ Cho phép định nghĩa và sử dụng các hàm tự do.
♦ Ngay cả khi dữ liệu được đóng gói vào lớp, dữ liệu vẫn có thể truy nhập trực tiếp như dữ liệu tự do bởi các hàm bạn, lớp bạn (friend) trong C++.
4.2/- ASP.NET và C++.NET
Các ngôn ngữ lập trình .NET (còn được gọi là .NET Frameworks) của MicroSoft ra đời vào cuối những năm 1990 để cạnh tranh với ngôn ngữ lập trình Java. .NET là một ngôn ngữ hoàn toàn hướng đối tượng, hơn nữa, nó còn cung cấp một giao diện lập trình đồ hoạ thân thiện và đẹp mắt với truyền thống lập trình kéo thả của MicroSoft.
Một số đặc điểm của ngôn ngữ .NET:
♦ Là một ngôn ngữ hoàn toàn hướng đối tượng: Tất cả các thành phần, các thực thể trong chương trình đều được mô hình dưới dạng một lớp nhất định. Không có dữ liệu tự do và hàm tự do trong chương trình.
♦ Cung cấp giao diện lập trình đồ hoạ: lập trình viên chỉ cần kéo và thả các đối tượng đồ hoạ cho ứng dụng của mình.
♦ Cho phép lập trình viên tự tạo ra các thư viện UserControl của mình. Đây là một thư viện bao gồm các thành phần được người dùng tự thiết kế giao diện, viết mã nguồn, đóng gói và có thể sử dụng lại trong nhiều ứng dụng khác nhau, tuỳ theo chức năng của các thành phần.
4.3/- Java
Java là một ngôn ngữ lập trình được Sun Microsystems giới thiệu vào tháng 6 năm 1995. Java được xây dựng trên nền tảng của C và C++: Java sử dụng cú pháp của C và đặc trưng hướng đối tượng của C++.
Một số đặc điểm của Java:
♦ Java là một ngôn ngữ lập trình hoàn toàn hướng đối tượng: Tất cả các thực thể đều được coi là một đối tượng, là một thể hiện cụ thể của một lớp xác định. Không có dữ liệu tự do và hàm tự do trong Java, tất cả đều được đóng gói vào các lớp xác định.
♦ Java là ngôn ngữ vừa biên dịch vừa thông dịch. Đầu tiên mã nguồn được biên dịch thành dạng bytecode; sau đó được thực thi trên từng loại máy nhờ trình thông dịch. Điều này tạo ra khả năng hoạt động độc lập với nền tảng phần cứng của các ứng dụng Java.
♦ Java cho phép người dùng tự tạo các đối tượng thư viện JavaBeans của mình (tương tự như các thành phần UserControl của .NET). Các đối tượng Bean sẽ được sử dụng lại như các thành phần có sẵn trong các ứng dụng khác. Điều này mở ra khả năng to lớn để tiết kiệm công sức viết mã nguồn và khả năng xây dựng các kỹ thuật cho một nền công nghiệp lắp ráp phần mềm.
Ngôn ngữ lập trình hướng đối tượng Java sẽ được trình bày chi tiết trong toàn bộ phần 2 của giáo trình này.
Hết 
nguồn :http://www.thuvien-it.net

Những khái niệm cơ bản của lập trình hướng đối tượng – Phần 2

Những khái niệm cơ bản của lập trình hướng đối tượng – Phần 2

Trừu tượng hoá đối tượng theo dữ liệu chính là quá trình mô hình hoá các thuộc tính của lớp dựa trên các thuộc tính của các đối tượng tương ứng. Quá trình này được tiến hành như sau:
1.4/- Trừu tượng hóa đối tượng theo dữ liệu
♦ Tập hợp tất cả các thuộc tính có thể có của các đối tượng.
♦ Nhóm các đối tượng có các thuộc tính tương tự nhau, loại bỏ bớt các thuộc tính cá biệt, tạo thành một nhóm chung.
♦ Mỗi nhóm đối tượng đề xuất một lớp tương ứng.
♦ Các thuộc tính chung của nhóm đối tượng sẽ cấu thành các thuộc tính tương ứng của lớp được đề xuất.
Ví dụ, trong bài toán quản lí cửa hàng bán ô tô. Mỗi ô tô có mặt trong của hàng là một đối tượng. Mặc dù mỗi chiếc xe có một số đặc điểm khác nhau về nhãn hiệu, giá xe, màu sắc… nhưng có chung các thuộc tính của một chiếc xe ô tô là:
♦ Các xe đều có nhãn hiệu.
♦ Các xe đều có màu sắc.
♦ Các xe đều có giá bán.
♦ Các xe đều có công suất động cơ.
Ngoài ra, một số ít xe có thể có thêm các thuộc tính:
♦ Có xe có thể có dàn nghe nhạc.
♦ Có xe có thể có màn hình xem ti vi.
♦ Có xe có lắp kính chống nắng, chống đạn…
Tuy nhiên, đây là các thuộc tính cá biệt của một số đối tượng xe, nên không được đề xuất thành thuộc tính của lớp ô tô. Do đó, ta mô hình lớp ô tô với các thuộc tính chung nhất của các ô tô.

Ưu điểm của việc trừu tượng hóa
Những ưu điểm của việc trừu tượng hóa là:
♦ Tập trung vào vấn đề cần quan tâm.
♦ Xác định những đặc tính thiết yếu và những hành động cần thiết.
♦ Giảm thiểu những chi tiết không cần thiết.
Việc trừu tượng hóa dữ liệu là cần thiết, bởi vì không thể mô tả tất cả các hành động và các thuộc tính của một thực thể. Vấn đề mấu chốt là tập trung đến những hành vi cốt yếu và áp dụng chúng trong ứng dụng.
1.5/- Khái niệm kế thừa
Xét trường hợp bài toán quản lí nhân sự và sinh viên của một trường đại học. Khi đó, ta có hai lớp đối tượng chính là lớp Nhân viên và lớp Sinh viên:

Ta nhận thấy rằng hai lớp này có một số thuộc tính và phương thức chung: tên, ngày sinh, giới tính. Tuy nhiên, không thể loại bỏ các thuộc tính cá biệt để gộp chúng thành một lớp duy nhất, vì các thuộc tính lương nhân viên và lớp của sinh viên là cần thiết cho việc quản lí. Vấn đề nảy sinh như sau:
♦ Ta phải viết mã trùng nhau đến hai lần cho các phương thức: nhập/xem tên, nhập/xem ngày sinh, nhập/xem giới tính. Rõ rang điều này rất tốn công sức.
♦ Nếu khi có sự thay đổi về kiểu dữ liệu, chẳng hạn kiểu ngày sinh được quản lí trong hệ thống, ta phải sửa lại chương trình hai lần.
Để tránh rắc rối do các vấn đề nảy sinh như vậy, lập trình hướng đối tượng sử dụng kỹ thuật kế thừa nhằm nhóm các phần giống nhau của các lớp thành một lớp mới, sau đó cho các lớp ban đầu kế thừa lại lớp được tạo ra. Như vậy, mỗi lớp thừa kế (lớp dẫn xuất, lớp con) đều có các thuộc tính và phương thức của lớp bị thừa kế (lớp cơ sở, lớp cha).
Quay lại với bài toán quản lí trường đại học, các thuộc tính và phương thức chung giứa lớp Nhân viên và lớp Sinh viên là:
♦ Tên,
♦ Ngày sinh,
♦ Giới tính,
♦ Nhập/xem tên,
♦ Nhập/xem ngày sinh
♦ Nhập/xem giới tính.
Ta tách phần chung này thành một lớp ở mức trừu tượng cao hơn, lớp Người. Lớp Người sẽ làm lớp cha của lớp Nhân viên và lớp Sinh viên. Khi đó, các lớp trở thành:

Như vậy, sự kế thừa trong lập trình hướng đối tượng:
♦ Cho phép lớp dẫn xuất có thể sử dụng các thuộc tính và phương thức của lớp cơ sở tương tự như sử dụng các thuộc tính và phương thức của mình.
♦Cho phép việc chỉ cần cài đặt phương thức ở một lớp cơ sở, mà có thể sử dụng được ở tất cả các lớp dẫn xuất.
♦ Cho phép tránh sự cài đặt trùng lặp mã nguồn của chương trình.
♦ Cho phép chỉ phải thay đổi một lần khi cần phải thay đổi dữ liệu của các lớp.
1.5/- Khái niệnm đóg gói
Xét ví dụ bài toán quản lí nhân viên văn phòng với lớp Nhân viên như sau:

Khi đó, cách tính lương cho nhân viên là khác nhau đối với mỗi người:
= * *
Trong đó, tỉ lệ phần trăm là khác nhau cho mỗi phòng ban, ví dụ:
♦ Phòng kế hoạch là 105%
♦ Phòng hành chính là 100%
♦ Phòng nhân sự là 110%
Khi đó, tuỳ vào thuộc tính phòng ban khác nhau mà ta phải dùng công thức tỉ lệ khác nhau để tính lương cho mỗi nhân viên.
Tuy nhiên, cách tính cụ thể này là công việc bên trong của phương thức tính tiền lương của lớp Nhân viên. Với mỗi ứng dụng, khi tạo một đối tượng cụ thể của lớp nhân viên, ta chỉ cần truyền các tham số thuộc tính cho đối tượng, sau đó gọi phương thức tính tiền lương cho đối tượng nhân viên đó, ta sẽ biết được tiền lương của nhân viên. Cách gọi phương thức tính tiền lương là hoàn toàn giống nhau cho tất cả các đối tượng nhân viên của văn phòng.
Sự giống nhau về cách sử dụng phương thức cho các đối tượng của cùng một lớp, mặc dù bên trong phương thức có các cách tính toán khác nhau với các đối tương khác nhau, được gọi là tính đóng gói dữ liệu của lập trình hướng đối tượng. Như vậy, tính đóng gói dữ liệu của lập trình hướng đối tượng:
♦ Cho phép che dấu sự cài đặt chi tiết bên trong của phương thức. Khi sử dụng chỉ cần gọi các phương thức theo một cách thống nhất, mặc dù các phương thức có thể được cài đặt khác nhau cho các trường hợp khác nhau.
♦ Cho phép che dấu dữ liệu bên trong của đối tượng. Khi sử dụng, ta không biết được thực sự bên trong đối tượng có những gì, ta chỉ thấy được những gì đối tượng cho phép truy nhập vào.
♦ Cho phép hạn chế tối đa việc sửa lại mã chương trình. Khi phải thay đổi công thức tính toán của một phương thức, ta chỉ cần thay đổi mã bên trong của phương thức, mà không phải thay đổi các chương trình gọi đến phương thức bị thay đổi.
1.7/- Khái niệm đa hình
Trở lại với ví dụ về quản lí trường đại học, với hai lớp Nhân viên và lớp Sinh viên, đều kế thừa từ lớp Người. Khi đó, ta thêm vào mỗi lớp một phương thức show():
♦ Phương thức show của lớp Người sẽ giới thiệu tên và tuổi của người đó.
♦ Phương thức show của lớp Nhân viên sẽ giới thiệu nhân viên đó có tiền lương là bao nhiêu.
♦ Phương thức show của lớp Sinh viên sẽ giới thiệu là sinh viên đó đang học ở lớp nào.

Khi đó, nếu trong hệ thống có các đối tượng cụ thể tương ứng với ba lớp, thì:
♦ Khi ta gọi hàm show từ đối tượng của lớp Người, sẽ nhận được tên và tuổi của người đó.
♦ Khi ta gọi phương thức show từ đối tượng của lớp Nhân viên, sẽ nhận được số tiền lương của nhân viên đó.
♦ Khi ta gọi phương thức show từ đối tượng của lớp Sinh viên, ta sẽ biết được lớp học của sinh viên đó.
Việc chỉ cần gọi cùng một phương thức, nhưng từ các đối tượng khác nhau, sẽ cho kế quả khác nhau được gọi là tính đa hình trong lập trình hướng đối tượng. Như vậy, tính đa hình trong lập trình hướng đối tượng:
♦ Cho phép các lớp được định nghĩa các phương thức trùng nhau: cùng tên, cùng số lượng và kiểu tham số, cùng kiểu trả về. Việc định nghĩa phương thức trùng nhau của các lớp kế thừa nhau còn được gọi là sự nạp chồng phương thức.
♦ Khi gọi các phương thức trùng tên, dựa vào đối tượng đang gọi mà chương trình sẽ thực hiện phương thức của lớp tương ứng, và do đó, sẽ cho các kết quả khác nhau.
Hết phần 2
Nguồn : 
 http://www.thuvien-it.net

Lập trình hướng đối tượng - Phần 1

Lập trình hướng đối tượng - Phần 1

Lớp kế thừa
Tư tưởng chính của lập trình hướng đối tượng là xây dựng một chương trình dựa trên sự phối hợp hoạt động của các đối tượng. Một đối tượng bao gồm hai thành phần chính là thông tin lưu trữ và các thao tác xử lý.
Trong thế giới thực, đối tượng là thực thể tồn tại như con người, xe, máy tính, … Trong ngôn ngữ lập trình, đối tượng có thể là màn hình, điều khiển, …
Lập trình hướng đối tượng là kỹ thuật lập trình nhằm vào sự tương tác giữa các đối tượng. Mỗi đối tượng có những thuộc tính (thông tin lưu trữ), những phương thức xác định các chức năng của đối tượng. Bên cạnh đó, đối tượng cũng có khả năng phát sinh các sự kiện khi thay đổi thông tin, thực hiện một chức năng hay khi đối tượng khác tác động vào. Tất cả những thuộc tính, phương thức và sự kiện tạo nên cấu trúc của đối tượng. Có 4 ý niệm trong lập trình hướng đối tượng :
- Abstraction : tính trừu tượng.
- Encapsulation : tính đóng gói.
- Inheritance : tính kế thừa.
- Polymorphism : tính đa hình.
Mỗi ý niệm đều có vai trò quan trọng trong lập trình hình đối tượng.

1/- Tính trừu tượng

Bạn thường lẫn lộn giữa lớp (Class) và đối tượng (Object). Cần phân biệt lớp là một ý niệm trừu tượng, còn đối tượng là một thể hiện cụ thể của lớp.
Ví dụ : bản thiết kế nhà là lớp, ngôi nhà được xây dựng dựa trên bản thiết kế là đối tượng.
Từ những đối tượng giống nhau, bạn có thể trừu tượng hóa thành một lớp.
Tính trừu tượng cho phép bạn loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.

2/- Tính đóng gói

Mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng riêng của lớp, trong trường hợp một đối tượng thuộc lớp cần thực hiện một chức năng không nằm trong khả năng vì chức năng đó thuộc về một đối tượng thuộc lớp khác, thì nó sẽ yêu cầu đối tượng đó đảm nhận thực hiện công việc. Một điểm quan trọng trong cách gia tiếp giữa các đối tượng là một đối tượng sẽ không được truy xuất trực tiếp vào thành phần dữ liệu của đối tượng khác cũng như không đưa thành phần dữ liệu của mình cho đối tượng khác một cách trực tiếp. Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ đối tượng này qua đối tượng khác phải được thực hiện bởi các phương thức (method) của chính đối tượng chứa dữ liệu. Đây cũng chính là một tính chất quan trọng trong lập trình hướng đối tượng gọi là tính đóng gói (encapsulation<) dữ liệu.
Tính đóng gói cho phép dấu thông tin của đối tượng bằng cách kết hợp thông tin và các phương thức liên quan đến thông tin trong đối tượng.
Ví dụ :
Xe hơi có các chức năng (phương thức phô diễn bên ngoài) như Ngừng, Chạy tới, Chạy lùi. Đây là những gì cần thiết cho Tài xế tương tác với Xe hơi. Xe hơi có thể có một đối tượng Động cơ nhưng Tài xế không cần phải quan tâm. Tất cả những gì cần quan tâm là những chức năng để có thể vận hành xe. Do đó, khi thay một Động cơ khác, Tài xế vẫn sử dụng các chức năng cũ để vận hành Xe hơi bao lâu các chức năng (phương thức) đưa ra bên ngoài (Interface) không bị thay đổi.

3/- Tính kế thừa

Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con và đương nhiên kế thừa tất cả các thành phần của lớp Cha, có thể mở rộng công năng các thành phần kế thừa cũng như bổ sung thêm các thành phần mới.
Bạn phân biệt hai loại quan hệ :
Là – một
Biểu thị tính kế thừa. Trong quan hệ "là – một", một đối tượng của lớp Con được xem như là một đối tượng của lớp Cha.

Lớp kế thừa
Ví dụ :
Từ lớp Xe bạn tạo nên lớp Xe hơi mở rộng, lớp này mặc nhiên kế thừa tất cả các thành phần của lớp xe. Bạn có thể nói một xe hơi là một chiếc xe.
Có – một
Quan hệ này mang ý nghĩa gồm có. Trong quan hệ "có – một", một đối tượng có thể có một hoặc nhiều thành phần tham chiếu đến các đối tượng khác.
Ví dụ :
Trong mô hình xe hơi, bạn muốn diễn tả ý tưởng chiếc xe "có – một" tay lái. Bạn không thể phát sinh lớp Xe hơi từ một Tay lái hay ngược lại (một Xe hơi là một Tay lái). Thay vì vậy, bạn phải có hai lớp độc lập làm việc với nhau trong đó, lớp phía ngoài (lớp Xe hơi) sẽ tạo và đưa ra công năng của lớp phía trong (lớp Tay lái).

4/- Tính đa hình

Tính đa hình là khả năng một ngôn ngữ xử lý các đối tượng hữu quan theo cùng một cách.
Tính đa hình thể hiện dưới nhiều hình thức :
Kết nối trễ - Late Binding
Là khả năng cho phép người lập trình gọi trước một phương thức của đối tượng, tuy chưa xác định đối tượng có phương thức muốn gọi hay không. Đến khi thực hiện, chương trình mới xác định được đối tượng và gọi phương thức tương ứng của đối tượng đó. Kết nối trễ giúp chương trình được uyển chuyển hơn, chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.
Ví dụ :
Bạn có lớp Xe với phương thức Chạy và các lớp Xe đạp, Xe hơi, Xe đẩy cùng phát sinh từ lớp Xe. Bạn chưa biết sẽ sử dụng xe gì đề di chuyển vù tùy thuộc tình hình có sẵn xe nào nên gọi trước phương thức Chạy. Khi chương trình thực thi, tùy theo đối tượng của lớp nào được đưa ra mà phương thức Chạy của đối tượng đó được gọi.
Nạp chồng – Overloading Đây là khả năng cho phép một lớp có nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, phương thức tương ứng sẽ được thực hiện.
Ghi chồng – Overriding
Hình thức này áp dụng cho lớp Con đối với lớp Cha. Lớp Con được phép có một phương thức cùng tên, cùng số tham số có kiểu dữ liệu như phương thức của lớp Cha hoặc những lớp trước đó nữa (lớp phát sinh ra lớp Cha …) với cài đặt khác đi. Lúc thực thi, nếu lớp Con không có phương thức riêng, phương thức của lớp Cha sẽ được gọi, ngược lại nếu có, phương thức của lớp Con được gọi.
Còn tiếp
nguồn : http://www.thuvien-it.net.