Mar 30, 2009

Effective C++ [ phan 2 ] - Làm quen hẹn hò

Chương 1. Làm quen với ngôn ngữ C++
Mục 1: Nhìn C++ như một liên ngôn ngữ
Từ bắt đầu C++ chỉ là C với một vài những đặc điểm hướng đối tượng. Thậm chí C++ còn được gọi là “C với những lớp”, mối liên hệ này chỉ là một sự kế thừa.
Là một ngôn ngữ sung mãn
Ngày nay C++ là một ngôn ngữ lập trình đa mô thức “multiparadigm programming language” vì thế để nắm bắt C++ bạn cần phải hiểu bạn đang làm việc với phần nào của C++ thật may nắm là nhưng phần này là 4 cây cột lớn trong C++. Tuỳ thuộc việc bạn đang làm gì thì bạn nên hiểu được tác dụng của nó. Trong C++ có 4 cây cột lớn chống đỡ. Đó là:

C. lý do chính là C++ là được phát triển từ C trong rất nhiều các trường hợp C++ tiếp cận vấn đề theo C. Nhưng bạn cũng nên nhớ những giới hạn của C đó là không template, không overload, không

Object Orriented C++: Hướng đối tượng C++ đây là một phần của C++ nó chính là cái được gọi là C với những lớp. Nó bao gồm đa hình, kế thừa,… Đây là phạm vi mà những khái niệm OOP có tác dụng

Template C++ : Mẫu trong C++ đây là phần generic programming một phần của C++. Mục 46 sẽ đề cầp đến nó Trên thực tế mẫu là một mô thức lập trình rất mạnh mẽ.

STL đây là bộ thư viện chuẩn của C++ sử dụng mẫu. trong này cung cấp rất nhiều những tiện ích cho lập trình của bạn.

Chú ý:
Bạn cần phải biết là bạn đang làm việc với phần nào trong 4 cây cột lớn của C++

Mục 2: consts, enums và inlines thay cho #defines
Mục này tốt nhất nên được gọi là chú ý vào việc định nghĩa tiền sử lý cho bộ biên dịch. Hãy chú ý khi sử dụng #define ví dụ

#define ASPECT_RATIO 1.653

Cái tên ASPECT_RATIO sẽ không bao giờ được trình biên dịch biết đến vì bộ tiền sử lý đã loại bỏ nó đi. Nó có thể gây ra lỗi khi trình biên dịch triệu gọi sử dụng rất có thể lỗi sẽ tham chiếu đến 1.653 chứ không phải là ASPECT_RATIO và thật không may nếu ASPECT_RATIO được viết trong một file header mà bạn không biết đến thì bạn chẳng thể biết được 1.653 ở đâu ra cả !
Giải pháp là bạn sẽ thay thế macro này với một hằng như sau

const double AspectRatio = 1.653; // uppercase names are usually for
// macros, hence the name change
Như là một hằng ngôn ngữ AspectRatio nó là một định nghĩa và được nhìn nhận bởi trình biên dịch. Một điểm lợi hại của const là bạn chỉ tạo ra một phiên bản duy nhất của AspectRatio chứ không giống như định nghĩa bằng #define mỗi lần nó sẽ thay thế giá trị của AspectRatio bằng một phiên bản của 1.653 hẳn nhiên code của bạn sẽ nhiều lên trông thấy.

Một vấn đề khác nữa là con trỏ kiểu hằng. tốt nhất bạn nên khai báo const 2 lần ví dụ
const char * const authorName = "Scott Meyers";
Để có một thảo luận đầy đủ với việc sử dụng const, đặc biệt là cách phù phép với con trỏ xem mục 3 tuy nhiên bạn sử dụng đối tượng string vì thế cách dưới đây là cách định nghĩa tốt hơn.

const std::string authorName("Scott Meyers");

Dưới đây là một trường hợp đặc biệt thứ 2 của lớp hằng. Giới hạn phạm vi hằng của một lớp bạn cần làm nó như một biến thành viên, và chắc chắn rằng chỉ có một bản sao duy nhất của hằng bạn đặt thêm từ khoá static để chắc về điều đó

class GamePlayer {
private:
static const int NumTurns = 5; // constant declaration
int scores[NumTurns]; // use of constant
...
};

Cái bạn nhìn thấy ở trên là một khai báo cho NumTurns nó không phải là một định nghĩa. Thông thường C++ yêu cầu một định nghĩa cho bất cứ cái thứ gì mà bạn sử dụng. Nhưng lớp hằng đặc biệt tĩnh và có kiểu int hoặc bool, hoặc char .. là những ngoại lệ. Miễn là bạn không cần tới địa chỉ của chúng thì bạn có thể khai báo chúng, sử dụng chúng mà không cần định nghĩa.
Để sử dụng hằng double
class CostEstimate {
private:
static const double FudgeFactor; // declaration of static class
... // constant; goes in header file
};

const double // definition of static class
CostEstimate::FudgeFactor = 1.35; // constant; goes in impl. file

Trong những trường hợp không muốn đao to búa lớn như static bạn có thể sử dụng enum để thay thế hoàn toàn có tác dụng tương tự nhưng sẽ không tốn kém như static
class GamePlayer {
private:
enum { NumTurns = 5 }; // "the enum hack" — makes
// NumTurns a symbolic name for 5
int scores[NumTurns]; // fine
...
};

Khi sử dụng
// call f with the maximum of a and b
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

Thì nên thay thế bằng
template<typename T >
inline void callWithMax(const T& a, const T& b) // know what T is, we
{ // pass by reference-to-
f(a > b ? a : b); // const — see Item 20
}

Chú ý :
Sự đơn giản của hằng. Nên dùng const hoặc enum thay vì #define
Chức năng giống macro thì nên sử dụng inline thay cho #define


Mục 3: Sử dụng consts bất cứ khi nào có thể !
Những điều tuyệt vời về const là cho phép bạn sử dụng một ngữ nghĩa đặc biêt là đối tượng không được sửa đổi và trình biên dịch sẽ đảm bảo điều này. Nó cho phép bạn kết nối 2 trình biên dịch khác nhau của những lập trình viên khác và giá trị cũng không thay đổi. Điều này luôn đúng.

Từ khoá const đặc biệt xuất sắc, bên ngoài lớp nó định nghĩa một phạm vi toàn cục hoặc phạm vi namespace. Cũng tương tự như một đối tượng khai báo static ở một file, một khối phạm vi, bên trong lớp. bạn có thể sử dụng cả static không static. Cho con trỏ, bản thân nó là const dữ liệu của con trỏ là cost cả hai hoặc tuỳ.

char *p = greeting; // non-const pointer,
// non-const data

const char *p = greeting; // non-const pointer,
// const data

char * const p = greeting; // const pointer,
// non-const data

const char * const p = greeting; // const pointer,
// const data

Cú pháp không bất thường như bạn nhìn thấy. Nếu từ const xuất hiện phía bên trái của dấu hoa thị (*) thì cái được chỏ tới là hằng (vùng nhớ con trỏ trỏ tới là hằng). Nếu từ const xuất hiện bên phải của đấu hoa thị (*) thì bản thân con trỏ là hằng, nếu xuất hiện cả 2 bên thì cả 2 đều là hằng. Tóm lại theo sau cost cái gì thì cái đó là hằng

Khi nào cái được chỏ tới là hằng một vài lập trình viên liệt kê cost trước kiểu, một số khác liệt kê nó trước kiểu nhưng sau dâu hoa thị (*) nói chung nó không có gì khác biệt. Ví dụ dưới đây mô tả các cách khác nhau của cùng một dạng tham số:

void f1(const Widget *pw); // f1 takes a pointer to a
// constant Widget object
void f2(Widget const *pw); // so does f2

thường thì cả 2 dạng này đều xuất hiện trong code nên bạn cũng nên quen với chúng.

STL iterator được mô hình dựa trên con trỏ vì thế cho nên một iterator hành động giống như một con tro T* cũng vì thế nên khi khai báo một const iterator cũng giống như khai báo một hằng con trỏ (ví như cost T*). iterator không cho phép chỏ tới một cái gì đó khác nhưng cái mà nó chỏ tới có thể được thay đổi. Nếu bạn muốn một iterator chỏ tới một cái gì đó cũng không thay đổi bạn muốn const_iterator

std::vector vec;
...
const std::vector::iterator iter = // iter acts like a T* const
vec.begin();

*iter = 10; // OK, changes what iter points to
++iter; // error! iter is const

std::vector::const_iterator cIter = //cIter acts like a const T*
vec.begin();

*cIter = 10; // error! *cIter is const
++cIter; // fine, changes cIter

Một vài sử dụng mạnh mẽ nhất của const phụ thuộc vào ứng dụng khai báo chức năng, trong một khai báo chức năng const có thể tham chiếu tới giá trị chả về, tới tham số riêng và những chức năng thành phần cho cái lệ thuộc. Một chức năng chả về kiểu hàng có thể làm giảm đi những tác động nguy hiểm từ phía client ví dụ

class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);

Rất nhiều lập trình viên có cái nhìn lệch lạc về nó khi lần đầu tiên nhìn thấy khai báo. Tại sao kết quả của một operator* lại là một đối tượng const, nếu không phải là như thế thì client se có thể tác động thế này

Rational a, b, c;
...
(a * b) = c; // invoke operator= on the
// result of a*b!

Tôi không hiểu sao rất nhiều lập trình viên muốn sử dung phép gán để làm thủ tục có 2 số, nhưng tôi biết rất nhiều người đã làm thế này mà không lo lắng đây là một sự ép kiểu mặc định (một kiểu có thể converted ngầm định thành kiểu bool)

if (a * b = c) ... // oops, meant to do a comparison!

Với một kiểu người dùng định nghĩa tốt, sẽ tránh được những sự không tương thích một cách vô lý. Khai báo toán tử operator* trả về một giá trị là const là một điều nên làm

Không có những gì đặc biệt mới về hằng tham số (const parameter) chúng hành sự như những đối tượng const cục bộ. và bạn có thể sử dụng cả 2 bất cứ khi nào bạn có thể. Chừ phi bạn cần phải cho phép một đối tượng hoặc một tham số cục bộ có thể bị sửa đổi. hãy chắc rằng bạn đã khai báo nó là const bạn chit mất thêm có 6 ký tự cho công việc này và nó có thể cứu bạn tránh khỏi những rắc rối khó chụi kiểu như

Hằng chức năng const
Mục đích của const trên chức năng thành phần là để nhận ra những chức năng nào có thể bị chiệu gọi trên một hằng đối tượng. có 2 lý do quan trọng để làm việc này, Đầu tiên là sự đơn giản trong việc hiểu giao diện của một lớp điều này khẳng định những chức năng nào có thể thay đổi đối tượng và những cái nào thì không. Thứ 2 chúng có thể làm việc với những đối tượng hằng. Đó là một bình phẩm về diện mạo của cách viết code hiệu xuất. vì lý do đó nó sẽ đc diễn giải trong trong mục 20 một trong những cách thức nhằm cải thiện hiệu quả cho việc các chương trình viết bằng C++ đó là việc chuyền đối tượng tham chiếu hằng. Kỹ thuật này chỉ có tác dụng nếu ở đó có hàm thành phần const. Cái sẽ thao tác những kết quả hằng đối tượng.
Có rất nhiều người không nhận thấy việc sử dụng const trong hàm thành viên cũng có thể tạo ra hiệu ứng overloaded và đây là một đặc điểm quan trọng của C++

class TextBlock {
public:
...
const char& operator[](std::size_t position) const // operator[] for
{ return text[position]; } // const objects

char& operator[](std::size_t position) // operator[] for
{ return text[position]; } // non-const objects

private:
std::string text;
};

Nhờ việc sử dụng như thế TextBlock có thể dc sử dụng như sau:

TextBlock tb("Hello");
std::cout << pc =" &cctb[0];" pc =" 'J';" textlength =" std::strlen(pText);" lengthisvalid =" true;" textlength =" std::strlen(pText);" lengthisvalid =" true;">( // cast away const on
// op[]'s return type;
static_cast(*this) // add const to *this's type;
[position] // call const version of op[]
);
}
...
};

Như các bạn thấy là hàm non-const của chúng ta sẽ gọi đến hàm const. Bạn không thể trực tiếp gọi đến const bởi vì cái bạn đang sử dụng là phiên bản non-const (đối tượng this) và như thế bạn không thể gọi đến một hàm const của một đối tượng non-const đây là lý do mà bạn phải chuyển kiểu như bạn đã thấy

Điều ghi nhớ
• Sử dụng const giúp cho trình biên dịch dễ dò tìm lỗi, const được sử dụng với một phạm vi áp dụng rộng rãi từ kiểu trả về, hàm, đối tượng…
• Tăng hiệu quả của trình biên dịch, nhưng trong trương trình của bạn buộc phải sử dụng thuộc tính hằng
• Khi tạo ra 2 phiên bản chức năng hằng và không hằng, những code trùng lặp được loại bỏ bằng viêc hàm không hằng gọi tới hàm hằng.

Mục 4: Chắc chắn rằng đối tượng được cài đặt trước khi sử dụng
Phần nảy trong nguyên bản có một vài điều những thiết nghĩ không quan trọng lắm nên không dịch bạn có thể tham khảo ở bản gốc của tác giả.

Trong C++ khi bạn khai báo một đối tựơng không hẳn nó đã được tạo ra. Và dữ liệu nó có thể dùng được, đảm bảo chắc nguyên tác bạn đang tạo ra cái gì, bạn sử dụng cái gì tốt nhất nên khởi gán giá trị của các biên, con trỏ khi bạn dùng.

Bạn thực hiện đúng điểu này sẽ giúp bản kiểm soát một cách chính sác mọi qua trình trong lớp, trong trương trình của bạn.


Mar 27, 2009

Downloads Softwares

Những tools mạnh mẽ trong việc hỗ chợ nhiều công đoạn khác nhau của việc làm phần mền. Quản trị dự án, phân tích thiết kế ...

Softwares:
So sánh nội dung 2 file
1. Trương trình WinMeger (opensource) dùng khá ngon lành. Có hỗ chợ so sánh nội dung 2 thư mục nhưng chưa thât ổn lắm download
2. Trương trình beyon phải đang ký so sanh ngon lành các khối text trong 2 file văn bản khác nhau... có rất nhiều lựa chọn so sánh cả thu mục cũng có nhiều dạng hỗ chợ download


Hiểu luồng logic của một ứng dụng


Xem mã nguồn của .NET


Chụp ảnh màn hình


Biên soạn tài liệu UML


Trình soạn thảo
codeblock
notepad++

Downloads Films

Đã từng xem thì không thể nào quên seri phim phưu lưu mạo hiểm với nhân vật Dr Indiana Jones.
phim DVD nguyên bản tiếng anh xem nét thôi rồi

I. Indiana Jones and the Raiders of the Lost Ark (1981)

Indiana Jones và chiếc rương thánh tích
Là phim đứng thứ 2 trong danh sách 300 phim hay nhất mọi thời đại

http://rapidshare.com/files/10790808...102.part01.rar
http://rapidshare.com/files/10791094...102.part02.rar
http://rapidshare.com/files/10791420...102.part03.rar
http://rapidshare.com/files/10791748...102.part04.rar
http://rapidshare.com/files/10792090...102.part05.rar
http://rapidshare.com/files/10792451...102.part06.rar
http://rapidshare.com/files/10792811...102.part07.rar
http://rapidshare.com/files/10793181...102.part08.rar
http://rapidshare.com/files/10793569...102.part09.rar
http://rapidshare.com/files/10793957...102.part10.rar
http://rapidshare.com/files/10794366...102.part11.rar
http://rapidshare.com/files/10794764...102.part12.rar
http://rapidshare.com/files/10795173...102.part13.rar
http://rapidshare.com/files/10795569...102.part14.rar
http://rapidshare.com/files/10795851...102.part15.rar

OR

http://www.megaupload.com/?d=ZS23M1G0
http://www.megaupload.com/?d=X419SFEB
http://www.megaupload.com/?d=DMI8VVLT
http://www.megaupload.com/?d=JVIV4YOI
http://www.megaupload.com/?d=Z4JIJK77
http://www.megaupload.com/?d=TC54PU0U
http://www.megaupload.com/?d=K9OIH0UP
http://www.megaupload.com/?d=W7NTEJI7
http://www.megaupload.com/?d=SYAUT8FQ
http://www.megaupload.com/?d=0PSCLF64
http://www.megaupload.com/?d=A9FMYTFO
http://www.megaupload.com/?d=HAO9CLI3
http://www.megaupload.com/?d=DSONBXBQ
http://www.megaupload.com/?d=KWHGVM8E
http://www.megaupload.com/?d=JNRC55Y5



II. Indiana Jones and the Temple of Doom (1984)
Indiana Jones và khu đền chết


http://rapidshare.com/files/11913426...115.part01.rar
http://rapidshare.com/files/11913428...115.part02.rar
http://rapidshare.com/files/11913436...115.part03.rar
http://rapidshare.com/files/11913428...115.part04.rar
http://rapidshare.com/files/11913432...115.part05.rar
http://rapidshare.com/files/11913431...115.part06.rar
http://rapidshare.com/files/11913436...115.part07.rar
http://rapidshare.com/files/11913434...115.part08.rar
http://rapidshare.com/files/11913453...115.part09.rar
http://rapidshare.com/files/11913429...115.part10.rar
http://rapidshare.com/files/11913447...115.part11.rar
http://rapidshare.com/files/11913466...115.part12.rar
http://rapidshare.com/files/11913442...115.part13.rar
http://rapidshare.com/files/11913449...115.part14.rar
http://rapidshare.com/files/11913418...115.part15.rar
OR
http://www.mediafire.com/?9ivuqysftu3
http://www.mediafire.com/?yxuzoim3dxc
http://www.mediafire.com/?thwkz2zlmny
http://www.mediafire.com/?wboqp1pwdtm
http://www.mediafire.com/?m2j1mpzqyij
http://www.mediafire.com/?dzd4uczxyey
http://www.mediafire.com/?ijvs9inmyst
http://www.mediafire.com/?y2tlydjmxkf
http://www.mediafire.com/?ymityezcvxn
http://www.mediafire.com/?j1idul2zjsy
http://www.mediafire.com/?mw0tczcyvjm
http://www.mediafire.com/?2kznjqf3dj2
http://www.mediafire.com/?uimfkt5ipkm
http://www.mediafire.com/?ztyezxtqxev
http://www.mediafire.com/?exyykz3htyj
OR
http://www.megaupload.com/?d=7ZY3M260
http://www.megaupload.com/?d=OTFLHJ89
http://www.megaupload.com/?d=C9OCR337
http://www.megaupload.com/?d=HP0UBK8Y
http://www.megaupload.com/?d=UV8XDHST
http://www.megaupload.com/?d=6RVAWE2J
http://www.megaupload.com/?d=HYJ4MSD8
http://www.megaupload.com/?d=7GZDIWGL
http://www.megaupload.com/?d=R6NPJF6K
http://www.megaupload.com/?d=33XG5O0Q
http://www.megaupload.com/?d=EU2V69OG
http://www.megaupload.com/?d=R509YC0W
http://www.megaupload.com/?d=LMSZM7BN
http://www.megaupload.com/?d=JMX23S2W
http://www.megaupload.com/?d=P211HY5C




III. Indiana Jones and the Last Crusade (1989)

Indiana Jones và chén thánh

http://rapidshare.com/files/11913457...114.part01.rar
http://rapidshare.com/files/11913365...114.part02.rar
http://rapidshare.com/files/11913384...114.part03.rar
http://rapidshare.com/files/11913377...114.part04.rar
http://rapidshare.com/files/11913444...114.part05.rar
http://rapidshare.com/files/11913365...114.part06.rar
http://rapidshare.com/files/11913377...114.part07.rar
http://rapidshare.com/files/11913364...114.part08.rar
http://rapidshare.com/files/11913376...114.part09.rar
http://rapidshare.com/files/11913375...114.part10.rar
http://rapidshare.com/files/11913467...114.part11.rar
http://rapidshare.com/files/11913443...114.part12.rar
http://rapidshare.com/files/11913451...114.part13.rar
http://rapidshare.com/files/11913367...114.part14.rar
http://rapidshare.com/files/11913407...114.part15.rar
OR
http://www.mediafire.com/?c50ln2ytgzz
http://www.mediafire.com/?l7xfnb3g6ie
http://www.mediafire.com/?yx19z3e8yzx
http://www.mediafire.com/?mmbezvjcml4
http://www.mediafire.com/?mcjrytekcr1
http://www.mediafire.com/?mt4yyvsxjjx
http://www.mediafire.com/?7myuzyzxign
http://www.mediafire.com/?zmnpmo1ykyt
http://www.mediafire.com/?cqtev1szjdx
http://www.mediafire.com/?r0addgxuzp0
http://www.mediafire.com/?zl1yxtjcy53
http://www.mediafire.com/?ykdodxxzixy
http://www.mediafire.com/?g9dxoiyn0kj
http://www.mediafire.com/?mm2sjokonxq
http://www.mediafire.com/?j3zhiaplksm
OR
http://www.megaupload.com/?d=OK528QJN
http://www.megaupload.com/?d=12DU70AZ
http://www.megaupload.com/?d=3VOIB2WJ
http://www.megaupload.com/?d=GYDBJ79A
http://www.megaupload.com/?d=ZL2WON2A
http://www.megaupload.com/?d=YQJTJLCF
http://www.megaupload.com/?d=GU589UZR
http://www.megaupload.com/?d=MFJV72C5
http://www.megaupload.com/?d=E8F0J3OX
http://www.megaupload.com/?d=WR4DNQBC
http://www.megaupload.com/?d=3AH3YSA5
http://www.megaupload.com/?d=WVY7MPJ2
http://www.megaupload.com/?d=0LRRF7GI
http://www.megaupload.com/?d=BITOYU7X
http://www.megaupload.com/?d=AYOQ1LTW



IV. Indiana Jones And The Kingdom Of The Crystal Skull (2008)
Indiana Jones và vương quốc sọ pha lê

phần này mới nên không có bản DVD mọi người xem tạm

CD1
http://rapidshare.com/files/13530683...it0n.part1.rar
http://rapidshare.com/files/13530532...it0n.part2.rar
http://rapidshare.com/files/13530540...it0n.part3.rar
http://rapidshare.com/files/13530534...it0n.part4.rar

CD2
http://rapidshare.com/files/13530715...it0n.part1.rar
http://rapidshare.com/files/13530611...it0n.part2.rar
http://rapidshare.com/files/13530722...it0n.part3.rar
http://rapidshare.com/files/13530539...it0n.part4.rar

Mar 24, 2009

Design Pattern [phan 2] - Tổng quan

III. Tổng quan chung
"Bất cứ một vấn đề nào bản thân nó cũng tồn tại 2 mặt - tích cực và tiêu cực". Tại sao tôi lại sử dụng một câu mà phát ngôn theo kiểu "chẳng nói ra thì ai cũng biết" và nó lại mang đầy hơi thở của triết học như vậy? Tôi xin trình bày với các bạn là tôi nói như thế vì có 2 lý do, một là bản thân công việc tìm hiểu, phân tích và thiết kế hệ thống đã là việc yêu cầu khả năng tư duy trừu tượng cao vì thế nó vô cùng gần gũi với triết học. Hai là nếu các bạn nhìn nhận thiết kế mẫu một cách thái quá khiên cưỡng cũng không tốt - vì sao ? xin thưa với các bạn là thiết kế mẫu chính là việc bạn đang tái sử dụng lại những ý tưởng sáng tạo của người khác. Vâng cái tôi muốn nói đến ở đây chính là 2 từ "sáng tạo". Bản thân các bạn khi sử dụng các mẫu thì mặc nhiên bạn không cần sáng tạo gì nhiều, tuy nhiên đây chỉ là một sự nhắc nhở nhẹ để các bạn có nhìn nhận vấn đề thật khách quan, nào giờ thì chúng ta bắt đầu !

iii.1. Thiết kế mẫu - Design pattern là gì

Cũng như ở phần đầu tôi đã giới thiệu với các bạn mẫu thiết kế là cách thức chung để giải quyết một họ các vấn đề mang tính khái quát giống như nhau. Giống như khi ta xem sét về phương tiện giao thông đây là một họ các vấn đề và có thể khái quát hoá. Một mẫu thiết kế nhằm giải quyết điều gì đó tương tự như thế, nó không phải là một ứng dụng để bạn có thể gép vào để chạy ngay, chúng không phải là cái mà cứ phang thẳng các mẫu ra là có thể giải quyết ngay vấn đề của bạn - mẫu là khái quát chỉ mang tính gợi ý về cách thức giải quyết vấn đề.

Mỗi mẫu thiết kế mô tả vấn đề khái quát suất hiện trong một hoàn cảnh cụ thể và đề xuất giải pháp cơ bản để giải quyết vấn đề đó. Theo đó mỗi một mẫu sẽ có những đặc điểm như sau :
  • Tên của mẫu
Tên rất quan trọng. Cái tên phải toát lên được vấn đề mà nó đề cập đến cách thức giải quyết vế đề và các hệ quả của nó. Thông qua cách thức đặt tên cho thực thể nào thì sẽ phải hướng đến chức năng nhiệm vụ cách thức giải quyết vấn đề của thực thể đó và chỉ ngắn gọn trong vài từ, đây là một công việc vất vả. Tuy vậy nó sẽ nhanh tróng là một chuẩn mực giúp dễ dàng hình dung cái nó chứa đựng bao hàm.

  • Vấn đề
Chính là cốt lõi của câu chuyện vấn đề là cái mà bạn, tôi ... đang đề cập đến trong ngữ cảnh cụ thể. Mỗi một vấn đề thảo luận cần giải quyết đều có những đặc thù riêng và những những điểm chung, cách thức hoạt động tương tác. Đôi khi trong vấn đề cũng nêu lên một danh sách những điều kiện cần khi áp dụng mẫu. Công việc của bạn là tìm hiểu kỹ vấn đề mà mẫu giải quyết sau đó liên hệ nó đế bài toán cụ thể của bạn. Có thể nói trong "vấn đề", trọng tâm mà bạn quan tâm tới chính là cái gì đang diễn ra ...?, nó diễn ra như thế nào?

  • Giải pháp
Là tập hợp có tổ chức các thực thể nhằm giải quyết vấn đề, chúng có quan hệ, chách nhiệm và cùng cộng tác. Giải pháp chỉ ra cho bạn thấy, giúp bạn hình dung đường lối giải quyết vấn đề. Nó không phải là những bài thực hành để bạn mang thằng vào để giải quyết bài toán của mình. Trên thực tế giải pháp chỉ là một mô thức mà bạn có thể áp dụng để giải quyết rất nhiều những tình huống khác nhau.

  • Hệ quả
Kết quả việc áp dụng mẫu. Nó trình bày những điểm tích cực khả năng mở rộng, nâng cấp, những thế mạnh cũng như đề cấp đến những điểm còn hạn chế. Thông qua việc tìm hiểu hệ quả của việc áp dụng mẫu bạn có thể tìm cho mình một giải pháp tốt hơn nhờ vào những gợi ý cho bạn qua việc chỉ ra những hạn chế.

Một quan điểm nhất quán trong cuốn sách "GoF" của bốn tác giả đã nhấn mạnh đến đó là "thiết kế mẫu là sự thảo luận về những đối tượng truyền thông và những lớp tuỳ biến nhằm giải quyết những vấn đề thiết kế trong một ngữ cảnh cụ thể". Xin bạn nhớ cho là đối tựơng truyền thông và những lớp tuỳ biến.

iii.2. Mô tả mẫu
Phần này miểu tả các đề mục dẫn trong việc mô tả cho một mẫu. Mỗi mục sẽ làm sáng tỏ đến mức tối đa cho một mẫu, kinh nghiệm cho các bạn mới tìm hiểu là cần nghiên cưu kỹ tình huống áp dụng sau đó thấu hiểu bài toán dẫn dắt của mẫu, tiếp đó liên hệ nó với các mẫu khác. Đừng vội vàng phân tích và cố hiểu cấu trúc mẫu - structure của nó cũng như ưu nhược điểm của nó làm gì vội. Có thể coi đây như những hướng dẫn bước đầu cho bạn trong việc tìm hiểu mẫu.
  • Tên mẫu và phân loại - Pattern name and classification
Phần loại của mẫu được chia thành 3 nhóm lớn theo mục đích sử dụng của mẫu đó là mẫu kiến tạo, mẫu cấu trúc và mẫu hành sự. Các thành phần chia này chỉ là tương đối, tuy nhiên chúng là phương tiên hữu hiệu giúp bạn hiểu hơn về pattern. Trong đó các mẫu kiến tạo có chức năng tạo ra các thực thể, mẫu cấu trúc chỉ ra các thức tổ chức hợp lý. mẫu hành sử hướng đến các mô hình giao tiếp chuyền giao thông điệp, phản hồi đáp chả của hệ thống.

  • Mục đích - Intent
Ngắn gọn chỉ ra nhiệm vụ mong muốn đặt được của mẫu. Mẫu này làm cái gì, mục đích và lý do mong muốn đạt được thông qua mẫu này là gì.

  • Bài toán dẫn - Motivation
Là một tình huống mẫu (có rất nhiều cái tương tự ) đưa ra để dẫn nhập cho mẫu. bạn nên tìm hiểu thật kỹ cái này

  • Tình huống áp dụng - Applicability
Một tham khảo rất tốt nó chỉ ra một số những ngữ cảnh cụ thể của vấn đề mà ở đó bạn đem mẫu vào áp dụng

  • Cấu trúc mẫu - Structure
là cấu trúc ở mức độ tổng quát của mục đích.

  • Các thành phần - Participants
Mô tả các thành có trong mẫu, nhiệm vụ, chức năng của chúng.

  • Cộng tác - Collaborations
Chỉ ra cách thức hoạt động của các thành phần và cách thức chúng làm việc với nhau

  • Các hệ quả - Consequences
Ưu nhược điểm của mẫu, tại sao nó lại hỗ chợ tốt cho mục đich của nó...

  • Thực thi - Implementation
Lý giải có minh hoạ code về cách sử dụng của mẫu

  • Minh hoạ - Sample code
Những code minh hoạ cho mẫu

  • Mẫu liên đới - Related parttern
Những mẫu khác có thể được sử dụng để cùng làm việc với mẫu này

iii.3. Danh mục và tổ chức các mẫu
Dưới đây là một danh sách bao gồm 23 mẫu kinh điển của 4 tác giả bạn có thể xem qua phần này để nắm được tổng quan của cuốn sách cũng như cách thức tổ chức của các mẫu. Thiết nghĩ việc dịch các tên mẫu là không cần thiết - chúng giống như tên riêng vậy nên tôi sẽ vấn giữ nguyên tên của chúng.
  1. Abstruct Factory Cung cấp một giao diện cho việc tạo một họ các đối tượng quan hệ hoặc phụ thuộc mà không cần quan tâm đến lớp tạo
  2. Adapter Tạo ra giao diện cho một lớp được sử dụng để client khai thác, Adapter sẽ tạo ra những giao diện giảm đi sự rắc rối của việc ghép nối những thực thể với nhau.
  3. Bridge Tách sự trừu tượng ra khỏi phần thực thi, chúng chở nên độc lập với nhau
  4. Builder Tách biệt tiến trình khởi tạo một đối tựơng phực tạp thành những chức năng khởi tạo đặc thù cung cấp cho luông khởi tạo ra các đối tượng chức năng khác nhau
  5. Chain of Responsibility
  6. Command
  7. Composite
  8. Decorator
  9. Facade
  10. Factory Method
  11. Flyweight
  12. Interpreter
  13. Iterator
  14. Mediator
  15. Memento
  16. Observer
  17. Prototype
  18. Proxy
  19. Singleton
  20. State
  21. Strategy
  22. Template Method
  23. Visitor

Tổ chức các mẫu

Mẫu kiến tạo
Creational
Mẫu cấu trúc
Structural
Mẫu hành sự
Behavioral
Class
Factory Method
Adapter
Interpreter
Template Method
Object
Abstract Factory
Prototype
Builder
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Proxy
Chain of Responsibility
Command
Iterator
Mediator
Memento
Flyweight
Observer
Sate
Strategy
Visitor

Quan hệ logic của tất cả các mẫu



iii.4. Cách sử dụng một mẫu
Nếu như bạn đang cần hiểu ngay và tìm kiếm một giải pháp cho vấn đề của bạn thì bạn nên tiếp cân như thế nào để áp dụng và sử dụng mẫu một cách hiệu quả nhất. Phần này sẽ giới thiệu cho bạn từng bước tiếp cận và áp dụng mẫu cho vấn đề của mình.
  1. Đọc qua toàn bộ mẫu, sau đó đọc kỹ các tình huống áp dụng của mẫu - Applicability, nghiên cưu các hệ quả trong phần Consequences của mẫu để chắc chắn rằng mẫu phù hợp với yêu cầu của bạn
  2. Tìm hiểu các phần cấu trúc mẫu - Structure, cộng tác - Colllaborations và các thành phần - Participants. Hiểu kỹ từng lớp, đối tượng trong mẫu và những mối quan hệ giữa chúng trong mẫu
  3. Xem phần code minh hoạ - Sample code nếu bạn thấy chưa đủ để hiểu.
  4. Chọn lựa cho mẫu của bạn một cái tên sao cho đầy đủ ngữ nghĩa trong ứng dụng của bạn, lúc này bạn nên đặt tên theo mẫu mà bạn áp dụng làm hậu tố ví như --Factory, --Proxy... với phần đầu là tên lớp hoặc chức năng nghiệp vụ đặc tả trong hệ thống của bạn
  5. Cuối cùng bạn hoàn thành các thủ tục của mình tạo dựng bộ khung ứng dụng (các lớp, giao diện... )

Tốt nhất bạn nên làm việc với một tool hỗ chợ UML khi đã hoàn tất mọi việc bạn sẽ lợi cả nhiều đương vừa hiểu thêm về UML, vừa có bộ khung code, vừa có tài liệu ... bạn có thể tìm hiểu thêm về UML tại đây

Mar 20, 2009

Lên đồng - Truyền thuyết, tín ngưỡng và sự thật


Nếu vị nào đã từng đi xem "lên đông" sẽ không còn lạ gì với hình ảnh một "cô đồng - cậu đồng" trang phục loè loẹt nhẩy múa trong tiếng nhạc í a í ới... thi thoảng hứng chí lên thì ngài cầm một mắn tiền ngài tung ra cho bà con và các đệ tử của ngài. Tiền đó là lộc thánh đó, lần đầu tiên nhận tiền cho từ tay thánh mẹ tôi nói với tôi là "đừng có tiêu đi để trong ví lấy may, một miếng lộc thánh bằng một gánh lộc trấn." (sự thật là tôi tiêu béng mất lúc nào cũng chẳng thể nhớ được.).

Thủ tục diễn ra một buổi hầu cũng khá vòng vèo. Đầu tiên là cô đông phải đọc kinh (kinh phật thì phải) sau đó thì sác định danh sách các giá hầu sẽ hầu, tiếp theo đó thay quần áo của giá hầu đó vào rui phủ tấm khăn đỏ lên đầu và teng teng tèng nhạc "hát văn" nổi lên và phải hát đúng bài của giá hầu đó vì mỗi giá có một bài riêng biệt. Kết thúc giá hầu là khi ngài thăng thường đánh dấu bằng câu hát "xe loan thánh giá hồi cung" ấy ngài thăng rồi đấy. OK lại thay quần áo hầu giá tiếp theo cứ thế cho đến hết danh sách định hầu. Tất nhiên phải hầu theo thứ tự từ lớn đến bé.


Cũng giống như mọi loại tư tưởng khác "Lên đồng" cũng có thế giới quan của nó. Đại khái theo tôi hiểu thì triết lý nhà phật giảng rằng thế giới gồm ba giới là trời, nhân gian và địa phủ. Vị giáo chủ tối cao của ba giới này là sir "Thích Ca Mầu Ni" tức là đức ngài phật tổ. Người chia cho các vị khác thay ngài điều hành các giới, trên trời thì có Ngọc Hoàng, địa phủ thì có Diêm Đế. Còn nhân gian thì chẳng thấy nói là chia cho ai cai trị. Chính vì thế con người ở nhân gian mới nảy sinh ra lắm chuyện. Đây cũng là cái cớ để có thể đặt vị trí của lên đồng vào chỗ còn thiếu này, có lời rằng: "Nhân gian chụi sự chi phối của trời của đất và các thánh thần... !"


Theo lời các tiền bối nói lại thì xuất phát điểm của "Lên Đông" là tín ngưỡng thờ mẫu của người Việt cổ sau đó trong sự dung hoà với đạo phật mà hình thành nên sự lý giải khá hợp lý và tất nhiên có gắn liền với cả những truyền thuyết lưu truyền trong dân gian mà hình thành nên một hệ thống ban bệ đồ sộ lên đến 36 giá hầu. Ở đây mỗi giá là tương ứng một vị thánh nhân được dân gian tôn kính như Đức ông - Trần Hưng Đạo, ông Hoàng Mười, ông Hoàng Bẩy, Cô Bơ, Cô Chín...


Trong tất cả các giá hầu thì to nhất uy quyền nhất là "Đức ông". Đây cũng là giá hầu mà ngài ít về nhất cũng như là nhân vật duy nhất mà chính sử ghi nhận là có tồn tại. Trần Hưng Đạo hiệu là Quốc công tiết chế hưng đạo đại vương. Ngài là con trai của Trần Liễu (Trần Liễu là anh trai của Trần Cảnh - vị vua đầu tiên của triều Trần và là chồng của Lý Chiêu Hoàng). Theo sử chép thì ngài là người làu thông kinh sử hiểu biết lý số. Nói cách khác ngài là người "Trên thông thiên văn dưới tường địa lý". Còn theo truyền thuyết thì Ngài là thánh nhân - tu đạo và có phép thuật.


Phần lớn những giá còn lại đều là những gia tướng hay môn khách trong phủ của Trần Hưng Đạo. Tương truyền ông là người rất rộng rãi biết trọng người tài nên trong nhà lúc nào cũng có vài trăm môn khách theo trợ giúp. Vì thế hẳn nhiên "Đức ông" chính là giá hầu tối cao của giới hầu đồng.

Theo đó các giá hầu theo sau có những chức năng chuyên biệt khác nhau và mỗi vị đều có những đặc điểm tính cách riêng. Chẳng hạn giá "Ông Hoàng Mười " theo truyền thuyết thì ông vốn dĩ xuất thận từ một nhà nho nên gương mặt gầy, gò má cao, ông coi sóc việc học hành thi cử đèn sách nên là con cái vị nào đi thi thì đi lễ ông, ông độ cho. Còn ông Hoàng Bẩy thì xuất thân là địa chủ nên cũng nhiễm cái thói sấu của địa chủ là mê con hát (hát ả đào) và nghiện thuốc phiện ông chăm lo ghi chép việc tâm đức của nhân gian, Cô Bơ hình như cô là gái dân tộc thì phải nói chung là cuộc đời cô nhiều oan trái nhưng vẫn gác việc riêng giúp dân giúp nước chống giặc... Phần lớn cách giá này được tôn kinh vì họ là những anh hùng có công trong các cuộc kháng chiến chống quân Nguyên của nhà Trần và được nhân dân ghi nhận và lập đền thờ.


Theo thói thường mỗi một bà đồng hay cậu đồng tựu trung là những người "nặng căn nặng quả" họ là những người hợp với tính cách của các giá trong đó có một căn nặng nhất là căn chính ngoài ra còn những căn khác. Một người năng căn mà phải hầu đồng cũng có nhiều loại. Có người bình thường thì chỉ khi lên đông thì ngài mới về, có những người hợp quá (có thể hiểu là ngài đó rất thích người này) thì ngài về thường xuyên không cần hương khói đền đuốc ngài về nhập như thường - lúc nào ngài cũng ngự trong người. Nói chuyện nghe thì thấy cũng thường thường vô hại những mà cái gì cũng thế hay giở lẫn lộn. Giả sử tôi là BOY rõ rằng 100% tôi phải căn của ông Hoàng Mười, Hoàng Bẩy.. thì không sao nhưng mà vô phúc tôi mà dính vào căn của mấy bà cô như là cô Bơ, cô Chín.. thì lúc đó chỉ có 30-60% tôi còn là tôi nữa thôi :(.


Cũng nhiều chuyện oái oăn trong cái nghề hầu thánh này. Là thánh thì ngài hay chấp, hay tự ái, hay hành hay hạ ... thôi thì đủ chuyện. Rồi cô đồng nhưng lại nặng căn cậu, cậu đông nhưng lại nặng căn cô thế là đành chấp nhận sống cả cuộc đời dở dở ương ương chẳng đâu vào đâu chỉ vì chót mang cái nghiệp hầu thánh vào mình... Những người này được tôn làm "thầy" vì diễn giải ra sẽ là "thầy đồng" vừa dài dòng lại có vẻ bất kính nên gọi là "thầy". Một thầy thì không phải đơn giản đi hầu đồng nhẩy múa theo nhạc và mén tiền cho thiên hạ thì sẽ là thầy. Muốn làm thấy thì phải có đệ tử, muốn thế thì phải tư vấn chỉ bào cúng bái lễ lạp đủ thứ chuyện trên đời. Nào là ma chay, cưới xin.., thi cử, chức tước.., ngày tốt, giờ tốt.., mộ phần... Con người có bao nhiêu cái tham vọng tốt đẹp thì thầy phải thoả mẵn hết thảy mọi cái đó và cái khó nhất cho thầy chính là chuyện đệ tử xin thầy hỏi thánh về tương lai của đệ tử. Chính vì thế thầy cũng được chia làm năm bẩy loại thầy. Thầy "xịn" thì thầy nhất thiết phải có kiến thức về chuyên môn (giá hầu) cái chuyên môn này phải sâu để hiểu và lý giải các sự việc sao cho thật logic với lý thuyết đã có và cái sự thể của đệ tử. Ngoài ra thầy còn phải hiều nho nhe đọc thông viết thạo chữ hán, hiều biết dịch lý, tướng số tử vi, phong thuỷ, bùa chú, bói toán ... tóm lại để đạt đc chình độ là thầy xịn thì cơ bản đó phải là người lao động trí óc và có những năng lực hơn người thực sự. Nếu đem kiến thức mà một thầy xịn tích luỹ được ra biên soạn thành một giáo trình cũng có thể nó lên đên 5 năm đại học :D.


Con đường chở thành thầy hầu đồng cũng lắm gian chuân nhưng theo thiên hạ đồn thổi thì phần lớn những người năng căn mà phải ra hầu thì nhất thiết phải hầu thì làm ăn mới khá được. Đầu tiên là cái lễ khai đền mở phủ - ấy là cái lần đầu tiên hầu đồng. Phải chọn một thầy cao tay hơn mình tức là có thâm niên hơn đưng ra chủ chì phủ một tấm khăn đỏ lên rồi tung khăn mở phủ để người kia bắt đầu nhẩy múa như vậy coi như chính thức mở phủ - đông nghĩa với việc từ này về sau hầu mà chẳng cần ai tung khăn ra mà tự mình tung lấy chứ không phải là có chỗ thờ tự thì mới là mở phủ. Thủ tục là thế nhưng mà kinh phí thì sao ? Cái vụ kinh phí mới kinh khủng phải mua sắm quần áo hầu, sắm lễ, thêu người hát... mèng mèng cũng vài trục triệu. Gặp phải người nhiều tiền thì cũng vài trăm triệu... Mỗi năm tết đến xuân về thì cũng là vào vụ hầu của các thầy. Nổi tiếng nhât là hội "Phủ Dầy" ở Nam Định chỉ tính riêng mỗi vụ hầu việc thêu chỗ, thêu ban nhạc tiên hầu... thì Phủ Dầy cũng thu hằng tỉ đồng (theo tôi biết cách đây đã vài năm còn gần đây chắc phải hơn).


Thật ra tôi là người vô thần - không hoàn toàn. Tin tưởng một cách có lý trí chứ không tin một cách mù quáng, đôi khi có những hiện tượng mà ta không thể giải thích được thì nên nhìn nhần một cách tôn trọng. Những cũng lắm thầy lợi dụng tới mức quá thể đáng chẳng thể chấp nhận mà vẫn có người tin. Tôi đi xem bói không nhiều nhưng cũng chẳng đâu vào đâu cả 90% các thầy thấy tôi thì tắt điện tôi cũng chẳng chê thầy, 10% còn lại thì chỉ nhìn tôi cười... ???.


PS: Chút hiểu biết nông cạn.

Mar 19, 2009

Design Pattern [ phần1 ] - Giới thiệu chung

Thiết kế mẫu là một vấn đề hay ho của những người làm kỹ thuật nói chung và dân IT nói riêng. Hôm nay làm một tua về chủ đề này, do bài viết được hình thành từ kinh nghiệm cũng như sự tham khảo nhiều nguồn khác nhau của người viết, nên cũng chẳng biết ghi nguồn tham chiếu nào cho rõ ràng. Các bạn đọc thấy có chỗ nào đó quen thuộc xin lượng thứ vì có thể đấy chỉ là "sự trích dẫn mượn ý chứ không mượn lời" nên không còn đúng nguyên văn của tác giả. Còn những nguồn tham khảo chính thức sẽ có link trực tiếp cho các bạn.

Phần lớn những code áp dụng đều là code C++ mong các bạn có một kiến thức khá về C++ bạn có thể tham khảo thêm tại đây
Cuốn sách tham khảo chính cho bài viết là cuốn "Design Pattern - Elements of Reusable Object - oriented Software" các bạn có thể down tại đây

Thuật ngữ
Trong này có một vài thuật ngữ hay sử dụng. Tôi cũng chỉ kế thừa lại từ các tiền bối đi trước, ghi chú vào đây cho những bạn chưa biết tiện theo dõi.
Client : những thành phần khác (có thể trương trình khác, đoạn code khác...) chỗ mà sẽ sử dụng đến các dịch vụ
Server: phần (code) chụi trách nhiệm trưng ra các dịch vụ và sử lý các yêu câu và trả về

I. Ngồn gốc và lịch sử hình thành
i.1. Nguồn gốc

Xuất phát điểm của tư tưởng thiết kế mẫu chính là ý tưởng của một kiến trúc sư nổi tiếng tên ông ta thì tôi đã quên mất rồi. Với ý tưởng tập hợp những cách thức, giải pháp để giải quyết các vấn đề hay gặp trong kiến trúc ông cho ra đời một cuốn sách nói về ngôn ngữ mẫu của kiến trúc. Trong quyển sách đó với mỗi một mẫu sẽ giải quyết một vấn đề cụ thể trong một ngữ cảnh hoàn toàn cụ thể. Việc áp dụng mẫu nào trong hoàn cảnh nào phục thuộc vào những điều kiện đó. Sau một quá trình khái quát hoá (dân coder gọi là sự trùi tượng hoá) thì nó chở thành những mẫu kinh điển để áp dụng cho một số nhiều những vấn đề hay gặp mang tính tổng quát. Chúng ta biết ơn các vị tiền bối đi trước nhờ trí tuệ của họ.

i.2. Lịch sử hình thành
Theo những thông tin mà tôi được biết thì cuốn sách đầu tiên về Design Pattern là của bốn tác giả Erich Gamma, Richard Helm, Ralph Johnson và John Vlisside tựa đề Design Pattern - Elements of Reusable Object - oriented Software tạm dịch là Thiết kế mẫu : Thực thể phần mền hướng đối tượng tái sử dụng. Trong này các tác giả gọi các mẫu của mình là GOF - Gang of four công cụ của 4 người. Trong đó bao gồm 23 mẫu nói về các vấn đề trong kỹ thuật phần mền theo các chủ đề mẫu kiến tạo nói về các vấn đề khởi tạo đối tượng, mẫu cấu trúc bàn về các cấu trúc, tổ chức các thành phần và mẫu hành xử nói về các mô hình giao tiếp, tương tác giữa các thành phần trong một hệ thống. Một điều rất thú vị trong cuốn sách của các vị này là việc họ không chú trọng vào bất kỳ một mẫu nào mà điều họ nhấn mạnh chính là sự tương tác giữa các mẫu với nhau và cách thức chúng cùng nhau làm việc. Hi vọng với chút kiến thức hiểu biết của mình tôi có thể trình bày được vấn đề này.

II. Những nguyên lý trong thiết kế hướng đối tượng
Bàn về việc thiết kế hướng đối tượng thì rất mênh mông. Trong giới hạn của chủ đề chỉ giới thiệu những nguyên lý cơ bản của việc thiết kế hướng đối tượng. Để tìm hiểu về chủ đề này hi vọng sẽ có đủ tài liệu cần thiết và kinh nghiệm để chia sẻ cùng các bạn trong một tương lai không xa. Dưới đây xin trình bày những nguyên lý cơ bản giúp các bạn hiểu được tư tưởng áp dụng của OOD vào việc phân tích các mẫu trong Design pattern

ii.1. Nguyên lý đóng và mở ( open-close )
Đây là nguyên lý cơ bản nhất của viêc thiết kế hướng đối tượng. Nó hình thành dựa trên tính biến động không thể đoán trước được trong vòng đời phát triển của phần mền - điều này đã được Jacobson nói về việc thiết kế phần mền. Sau được Meyer cụ thể hoá và chở thành nguyên lý - nguyên lý open-close.

Nội dung
:
Các thực thể của phần mền (class, module, function..) phải mở với việc mở rộng và đóng với việc sửa đổi.

Nội dung của nguyên lý chỉ ra rằng để đáp ứng được với những biến đổi không dự đoán trong tương lai thì ứng dụng nên được thiết kế sao cho hạn chế việc sửa lại code nhưng lại dễ dàng cho việc thêm mới mở rộng các code khác vào. Tức là nếu có bất kỳ những thay đổi gì trong quá trình phát triển thì nên hạn chế việc sửa code đã có mà thay vào đó là thêm vào những code mới để đáp ứng yêu cầu.

ii.2. Nguyên lý về sự kế thừa và thay thế ( liskov - subsitution )
Nguyên lý bàn về một trong những tính chất quan trọng nhất của OO đó là tính kế thừa - inheritance. Để giảm và tránh tình trạng kế thừa vô tội vạ dẫn đến những thiết kế tồi và áp dụng chiệt để tư tưởng đóng và mở nguyên lý này là kim chỉ nam cho việc bạn quyết định mở rộng ứng dụng như thế nào.

Nội dung
:
Một lớp chỉ kế thừa từ lớp cha khi thay thế các tham chiếu của lớp cha bằng lớp con mà không làm ảnh hưởng đến trương trình

Việc thay thế hay kế thừa phải bảo đảm rằng những hanh vi giao tiếp của lớp con kế thừa từ cha hoạt động đúng nghĩa. Khi nào một thực thể hành động giông như cha của nó thì đối sử với thực thể đó giống đổi sử với cha nó. Trong ngôn ngữ Ruby có khái niệm là dog mà kêu như duck thì cứ coi như dog là duck (duck typing). Đó là khi bạn nên kế thừa và thay thế.

ii.3. Nguyên lý sự nghịch đảo phụ thuộc ( dependency - inversion )
Đây là nguyên lý được xây dưng trên việc áp dụng chiệt để nguyên lý đóng - mở và nguyên lý kế thừa - thay thế ở mức độ khái quát hoá cao hơn. Nguyên lý gồm 2 mệnh để được phát biểu như sau.

Nội dung:
- Module ở mức độ cao không phụ thuộc những module ở mức độ thấp, Cả hai nên phụ thuộc vào mức độ chùi tượng
- Mức độ chùi tượng không phụ thuộc vào mức độ chi tiết, mà sự chi tiết nên phụ thuộc vào mức độ chùi tượng

Nguyên lý nhấn mạnh đến tính trùi tượng hoá vấn đề từ đó đi đến việc quyết định tạo nên các lớp cơ sở trùi tượng, các giao diện mà lớp chức năng cam kết thực thi.

ii.4. Nguyên lý phân tách giao diện ( interface - segregation )
Hẳn nhiên khi client sử dụng một dịch vụ nào đó được cung cấp bởi server thì client sẽ gọi các phương thức này thông qua giao diện (đây là một thiết kế tốt).

Nội dung:
Client chỉ nên biết đến và sử dụng những gì mà chúng cần

Điều này có nghĩa bạn nên tác các nhóm dịch vụ ra thành những giao diện. khi đó client sử dụng dịch vụ nào sẽ thực hiện gọi chức năng đó, chánh việc dư thừa những chức năng chẳng bao giờ được sử dụng đến bởi client này. Điều này rất có ý nghĩa rất lớn về tính toàn vẹn logic cũng như vật lý của thiết kế hương đối tượng.

ii.5. Nguyên lý sự đơn trách ( single - reponsibility )
Trong những trường hợp thông thường về nghiệp vụ, một lớp chỉ nên chụi một trách nhiệm hoàn toạn cụ thể và rõ ràng, chánh sự kiêm nhiệm chức năng trong một lớp điều nãy sẽ dẫn đến những hậu quả của việc bảo trì code về sau này, cũng như làm ảnh hưởng đến việc mở rộng của phần mền trong tương lai. Nói một cách khác nó đã vi phạm nguyên lý số 1.

Nội dung:
Sự thay đổi diễn ra ở một lớp cụ thể chỉ phát sinh khi chức năng mà lớp đảm nhiệm có thay đổi

Nói cách khác đây là môt trong những khía cảnh mở rộng của nguyên lý số 1. Nó làm sáng tỏ việc chia tách lớp. Luôn bảo đảm rằng mỗi lớp chỉ được sinh ra để đảm bảo một chức năng cụ thể và nó chỉ tồn tại, phục vụ cho mục đích đó.

ii.6. Vài chú ý
  • Tuy nhưng nguyên lý này mang tính kinh điển nhưng tất cả chỉ là những điều trong sách vở. Điều bạn cần làm là hiểu những gì bạn nên làm và làm những gì phù hợp với ngữ cảnh cụ thể của bạn. Bởi đây chỉ là những lý thuyết mang lại cho bạn thêm kiến thức, vấn để chủ yêu vẫn là tính hợp lý trong thiết kế.
  • Một kinh nghiệm quan trọng là bạn nên tạo phong cách chuyên nghiệp cho mình ngay từ việc đặt tên, các thức quy ước các biên toàn cục, cục bộ các phương thức, comment code rõ ràng và mạch lạc, thống nhất tất cả trong phong cách code của bạn. Nếu bạn bí về tên hãy sử dụng các cụm từ như Info cho thực thể, Controller, Handle, Engine, Entity, Manger... cho các lớp của mình. Khi bạn có một lượng kiến thức khá khá về Design Pattern thì bạn có thể sử dụng các tên trong design pattern cho code của mình. Cố gắng đặt tên sáng sủa rõ ràng

Để bàn về nguyên lý trong thiết kế OO thì có rất nhiều, thôi xin không lan man nữa và sẽ tập chung vào vấn đề chính của chúng ta đó là các mẫu.

tiếp >>

Mar 18, 2009

Downloads Ebooks

Tôi có khá nhiều ebooks và softwares nhưng chưa có thời gian để up lên được.
Vì thế tôi sẽ liên tục cập nhật các mục trong này.
Ai có nhu cầu cần gì cứ post mình có sẽ chia sẻ cho mọi người.

Chúc vui vẻ !

Ebooks:

lập trình C++
lập trình C++ trên window [tiếng việt ]

.NET


Database


OS

Other
Tài liệu về registry [tiếng việt]
lược sử thời gian [sách nới về vật lý học hiện đại]
Các phím tắt trong ứng dụng [tiếng việt]

Mar 12, 2009

Diệt virus phimnguoilon.exe bằng tay

Không ít các bạn đã từng bị dính loại virus này. Thông thường con đường lây nhiễm chủ yêu của chú này thông qua usb. Chúng giả mạo icon file exe dạng folder để đánh lừa những khổ chủ tò mò. Trong danh sách của các phần mềm diệt virus thì chú này bị ngoẻ từ lâu rồi. Tôi viết bài mang tính chất tham khảo, trọng tâm của bài viết là chỉ ra cách thức hoạt động của loại này thế nào. còn với code demo thì các bạn có thể hỏi chị "Google" chị sẽ cho những đoạn code cụ thể để thực hiện

1. Lây nhiêm
Con đường thông thường để nhiễm virus này là qua chế độ autorun của các thiệt bị ngoại vi - cụ thể là usb khi kết nối với window. Nó nằm phục sẵn trong usb của nạn nhân. Sau khi được kích hoạt nó sẽ chạy file system.exe và như thế là máy của bạn đã được xác nhận là bị nhiễm.
Trong trường hợp nếu bạn đã tắt chế độ autorun của win đi rồi thì nó vẫn chờ đợi bạn vô tình kích hoạt file phimnguoilon.exe ( icon của exe này dạng folder ) lên và thịt luộc máy của bạn ....
Các trường hợp còn lại dẫn đến bị lây nhiêm là rất it, hoặc bạn bị cắm usb nhưng có antivirus nó diệt thay bạn hoặc giả bạn là người có kinh nghiệm hoặc giả bạn là người cẩn thận thì tôi giám chác bạn chỉ đọc bài này cho vui thôi ! ~_^


2. Hoạt động
Khi nó được kích hoạt lên trong máy của bạn đầu tiên nó sẽ làm thịt thằng userinit.exe bằng việc chuyển thằng exe này đến một thư mục nào đó trong hệ thống và thay thế file này trên hdd của bạn bằng một thằng userinit.exe của nó. Xin nói thêm là khi win startup thì lão bill chỉ định win phải thực hiện file này để load config của user lên. Bạn có thể xoá file này đi để kiểm tra ở C:\WINDOWS\system32\userinit.exe. Nhưng nhớ là phải sao lưu nó vào chỗ nào đó để trả lại nhé.
Ok như thế file userinit sịn của bạn đã bị thay thế bằng một thằng userinit giả mạo. Tiếp theo nó tiếp tục chép tiếp một chú system.exe nữa vào trong thư mục \windows hoăc \window\system32 và nhiệm vụ mà thằng userinit.exe của virus làm là gọi file userinit.exe của lão bill để hệ thống hoạt động bình thường và gọi thêm thằng system.exe của nó để duy trì tình trạng bị nhiễm virus của máy tính.

Từ thời điểm này chở đi trong processes của bạn lúc nào cũng suất hiện 2 process là userinit và system. 2 thằng này luôn kiểm tra sự tồn tại của thằng còn lại nếu một trong 2 bị kill thì thằng còn lại sẽ có nhiệm vụ tự động khôi phục lại thằng kia khiến cho bạn không thể kill dc 2 thằng này.

Một điều chú ý về sự hoạt động của nó là bất cứ khi nào bạn chuy xuất vào usb, phần vùng logic của hdd (các ổ) thì nó sẽ tự động tạo ra một file autorun và system.exe (hoặc bất cứ cái tên gì...) vì thế mà nó đi theo các usb đên các máy tính khác và trong trường hợp khi victim cài lại win thì nó vẫn để lại mầm mống trên các ổ khác và đợi chờ !

3. Diệt by hands
OK khi bạn đã xác định cách thức hoạt động và lây nhiễm của nó bạn có thể tiều diệt nó dễ dàng.
Công cụ : procexp.exe một công cụ để dò tìm các process và phần mền winrar.
Trước tiên bạn cần phải xem nó đã dấu userinit.exe của bạn đi đằng nào rồi, bạn vào procexp.exe để kill thử thằng userinit của nó đi và bạn sẽ thấy system gọi tới nó và nó call thằng userinit sịn của bạn ở chỗ nào ra. Ok bạn dùng winrar mở C:\windows\ sau đó tìm đến file userinit của virus và xoá nó đi, copy file userinit sịn của bạn về lại đúng thư mục đó. sau đó khởi động lại máy tính.
Cuối cùng là bạn sử dụng winrar đi tìm thằng system.exe và các tàn dư của nó trên hdd của nó xoá nốt nó đi (trên ổ cứng không bao giờ có các file autorun)

Như vậy là kết thúc. ở đây cần sử dụng một số tools là đo đồ của ms không cung cấp chi tiết đến mức cần thiết những thông tin cho bạn giả sử nếu bạn dùng taskmanager thì bạn sẽ không thể nhìn thấy cái company của thằng system.exe là F U C K Y O U ặc ặc khi mà tôi nhìn thấy cái company kỳ cục này thì tui điên hết cả tiết lên quyết diệt cho nó chít luôn.

//====================
post 1 bản bên congdongcviet.com

Mar 11, 2009

Effective C++ [phần 1] - Giới thiệu

Giới thiệu
cuốn Effective C++ của tác giả Scott Meyers. Sứng đáng là một cuốn sách gối đầu giường của những người lập trình C++. Về tác giả sách này theo người viết được biết ông còn viết 1 quyển khác cũng rất có giá trị với người yêu thích làm việc với C++ đó là cuốn More effectve C++ như là phần 2 của cuốn sách này. Ngoài ra còn một cuốn sách tham khảo khác về STL cũng rất có giá trị trong thế giới sách về C++ là cuốn Effective STL.

Thuật ngữ
Đây là một phần nhỏ trong từ vựng mà tất cả những lập trình viên đều phải hiểu. Dưới đây là những nhóm khá quan trọng mà chúng ta phải hiểu ngữ nghĩa của chúng.
Một khai báo thông báo cho trình biên dịch biết tên và kiểu của một cái gì đó, đây là những khai báo

extern int x; // object declaration

std::size_t numDigits(int number); // function declaration

class Widget; // class declaration

template<typename ...> // template declaration
class GraphNode; // (see Item 42 for info on
// the use of "typename")

Hãy chú ý là biến x kiểu interger là một đối tượng, mặc dù nó là kiểu build-in (xây dựng sẵn). Một vài người vẫn dè dặt với từ “Đối tượng” cho những biến của kiểu người dùng định nghĩa (user-define type). Ngoài ra cũng cần chú ý thêm rằng chức năng numDigits trả về một kiểu std::size_t kiểu size_t trong namespace std, Đây là một namespace chứa đựng tất cả những thư viện chuẩn của C++ cục bộ. Tuy nhiên vì chuẩn C (thường gọi là C89) cũng có thể sử dụng trong C++ vì thế cái được kế thừa từ C (kiểu như size_t) cũng tồn tại ở phạm vi toàn cục hoặc trong std hoặc cả hai. Điều này phụ thuộc vào file header trong #include mà bạn gọi. Về mặt sử dụng nói chung thì tuỳ bạn nhưng tôi khuyến cáo các bạn nên sử dụng chuẩn std cho các thành phân trong namesapce này.
Size_t theo cách này chỉ là một typedef cho một kiểu không dấu mà C++ sử dụng khi đếm một cái gì đó (ví dụ như số ký tự trong một char* của một string hoặc những thực thể của một STL container). Nó cũng có thể là kiểu được quy chiếu bởi hàm operator[] trong vectorm, deque string. Một thoả thuận là chúng ta sẽ định nghĩa lại trong mục 3.

Mỗi một chức năng khai báo sẽ biểu lộ một chữ ký, một chữ ký được đánh dấu bởi tham số và kiểu trả về, đối với hàm numDigits chữ ký là cần một tham số kiểu int và chả về kiểu std::size_t trong chuẩn C++ ngăn chặn kiểu trả về nhưng với cuốn sách này kiểu chả về là một tiện ích của chữ ký.

Một definetion – định nghĩa cung cấp cho trình biên dịch những chi tiết của một khai báo. Với một đối tượng định nghĩa là nơi để trình biên dịch dành bộ nhớ cho đối tượng. Với một hàm hoặc một hàm mẫu, định nghĩa cung cấp thân của mã lệnh. Với một lớp hoặc một lớp mẫu định nghĩa cung cấp một danh sách các thành phần của lớp hoặc của mẫu.

int x; // object definition

std::size_t numDigits(int number) // function definition.
{ // (This function returns
std::size_t digitsSoFar = 1; // the number of digits
// in its parameter.)
while ((number /= 10) != 0) ++digitsSoFar;
return digitsSoFar;
}

class Widget { // class definition
public:
Widget();
~Widget();
...
};

template<> // template definition
class GraphNode {

public:

GraphNode();

~GraphNode();

...

};

Initialization – cài đặt là một tiến trình đưa vào những giá trị đầu tiên cho đối tượng, Với đối tượng là một kiểu dữ liệu người dùng định nghĩa. Cài đặt được sử lý bởi hàm tạo. Một hàm tạo mặc định defualt-contructor là một hàm tạo không tham số hoặc hàm khởi tạo với giá trị mặc định cho những tham số.

class A {
public:
A(); // default constructor
};

class B {
public:
explicit B(int x = 0, bool b = true); // default constructor; see below
}; // for info on "explicit"

class C {
public:
explicit C(int x); // not a default constructor
};

Hàm khởi tạo cho lớp B và C ở đây được khai báo là explicit, nó sẽ ngăn chặn việc sử dụng chuyển kiểu ngầm định, mặc dù chúng vẫn có thể được sử dụng cho việc chuyển kiểu tường minh.

void doSomething(B bObject); // a function taking an object of
// type B

B bObj1; // an object of type B

doSomething(bObj1); // fine, passes a B to doSomething

B bObj2(28); // fine, creates a B from the int 28
// (the bool defaults to true)

doSomething(28); // error! doSomething takes a B,
// not an int, and there is no
// implicit conversion from int to B

doSomething(B(28)); // fine, uses the B constructor to
// explicitly convert (i.e., cast) the
// int to a B for this call. (See
// Item 27 for info on casting.)

Hàm khởi tạo với khai báo explicit thông thường thích hợp với những trương hợp không rõ ràng về kiểu, bởi vì chúng ngăn không cho trình biên dịch sử lý những tình huống bất ngờ, không nhắm tơi trong việc chuyển đổi kiểu. Trừ phi bạn có một lý do sách đáng cho việc chuyển đổi kiểu mặc định. Khuyến cáo nên sử dụng !

Copy – contructor Một hàm tạo sao chép dùng để cài đặt một đối tượng với một đối tượng khác cùng kiểu. còn toán tử gán và sao chép được sử dụng để sao chép từ một đối tượng khác có cùng kiểu.

class Widget {
public:
Widget(); // default constructor
Widget(const Widget& rhs); // copy constructor
Widget& operator=(const Widget& rhs); // copy assignment operator
...
};
Widget w1; // invoke default constructor

Widget w2(w1); // invoke copy constructor

w1 = w2; // invoke copy
// assignment operator

Hãy đọc cẩn thận khi bạn đọc thấy sự xuất hiện của một phép gán. Bởi vì cú pháp của “=” có thể gọi tới một hàm khởi tạo sao chép.

Widget w3 = w2; // invoke copy constructor!

Thật may nắm vì hàm tạo sao chép thật dễ dàng để phân biệt với sao chép gán. Nếu một đối tượng mới được định nghĩa thì nó sẽ gọi đến hàm tạo sao chép (giống như w3 ở trên) chính vì thế một hàm khởi tạo sẽ được gọi. Nếu không có một đối tượng mới nào được tạo thì nó chỉ đơn thuần là một phép gán (giống như w1 & w2)

Hàm khởi tạo sao chép là một chức năng đặc biệt quan trọng bởi vì nó sẽ định nghĩa như thế nào một đối tượng được chuyền bởi giá trị ví dụ:

bool hasAcceptableQuality(Widget w);
...
Widget aWidget;
if (hasAcceptableQuality(aWidget)) ...

Tham số w được chuyền cho hàm hasAcceptableQuality là một giá trị (tham chị) vì thế khi được gọi như ở trên thì aWidget sẽ được sao chép cho w sự sao chép được làm bởi hàm khởi tạo sao chép của Widget. Như thế chuyền bởi giá trị có nghĩa là “gọi hàm khởi tạo sao chép” (Tuy nhiên đây là một ý tưởng tồi tệ không nên dùng tốt nhất nên chuyền theo kiểu hằng tham số mục 20)

STL - Standard Template Library là thư viện mẫu chuẩn. Một phần trong thư viện chuẩn đó cung cấp cho bạn những containers (vector,list…) iterators (vector::iterator, set::iterator… ) algorithms (for_each, find, sort…) và sự liên kết một lô những chức năng.
Có nhiều những chức năng thực hiện với đối tượng chức năng – một đối tượng hành động giống như một chức năng. Giống như những đối tượng từ lớp nạp chồng operator(), phương thức gọi toán tử. Nếu bạn không thân thiện với STL một cách tham chiếu nhanh nhất chính là đọc cuốn sách này. Bởi vì STL quá tiện ích đối với tôi (tác giả)

Lập trình đến với C++ từ Java hoặc C# sẽ hơi bị ngạc nhiên một chút bởi chú ý hành vi không định nghĩa. Cho một vài lý do hành động của hàm khởi tạo trong C++ rõ ràng là không định nghĩa. Bạn không thể chắc chắn được cái gì sẽ sảy ra vào lúc chạy ví dụ

int *p = 0; // p is a null pointer

std::cout << *p; // dereferencing a null pointer
// yields undefined behavior

char name[] = "Darla"; // name is an array of size 6 (don't
// forget the trailing null!)

char c = name[10]; // referring to an invalid array index
// yields undefined behavior

Để nhấn mạnh hành vi không định nghĩa không thể dự đoán và có rất nhiều những khó chụi. Những lập trình viên C++ nhiều kinh nghiệm thường nói rằng chương trình không định nghĩa dễ dàng điều khiển. Sự thật là chương trình không định nghĩa nó sẽ dễ dàng điều khiển, nhưng cũng không hẳn là vậy ! ??? (ứ hủi). Có nhiều khả năng hơn là chương trình sẽ sử lý một cách chập chờn…., “Effective C++ programmer” làm hết sức mình để hướng dẫn rõ ràng trong việc không định nghĩa. Một nhóm khác trong những ngôn ngữ lập trình đề cập đến là giao diện interface. Thông thường interfaces là một thực thể của ngôn ngữ lập trình, nhưng điều này không giống trong C++. Mục 33 sẽ thảo luận như thế nào để đánh giá được nó. Một client là một ai đó hoặc một điều gì đó sử dụng code của bạn viết.





Mar 3, 2009

Projects

There are some project that I have pursued
all of them in there are my idea. I don't have enough time to do. But it is not the means that I did not do anything :). That I do it in my free time.

1. U++ project [C++ cross platform]
This project was establish when i use startUML to design for my projects and i found it is open source but it was wrote by delphi language. So i think if have the other one is the same it but that must write by C++ is the better. and i begin do it.
For more information click here
Xem thông tin chi tiết ở đây

2. The New World [C# - aspx .NET Platform]
Project is a web portal application
State : Not public


3. Viet Nam calendar (Lịch vạn niên) [Visual C++]
Changing from date to Viet Nam date...
Chuyển đổi ngày âm lịch, dương lịch, tinh toán tam tai...
State : Not public


4. FF3D Flash & Flex [Action Script - flashplayer platform]
Tham gia với cộng động làm Flash 3D
State : Join with googlegroup


5. Downloader [C# .NET platform]
This is an open source and it very nice.
State: Opensource


6. DatabaseEngines [C# .NET platform]
This is my private project. It can connect to Sql database and get all structure of tables, stored, function ... You can use it to generate the entities, BLL and DAL for three layers application
State: In Progress


.../...
 
Bạn có thể dùng bài viết của tôi tùy ý bạn nhưng vui lòng ghi lại rõ nguồn cung cấp
The world in a click_
Copyright © 2008 linhdkl