Thứ Năm, 29 tháng 3, 2012
Thứ Bảy, 24 tháng 3, 2012
Sau này dạy con gái của Ba
♥ Mẹ bảo, lúc giận đừng có cãi nhau, có thể không nói gì, không giặt quần áo của chồng, nhưng không được cãi nhau với chồng.
♥ Mẹ bảo, cãi nhau với đàn ông thì đừng có chạy ra ngoài mà oang oang khắp nơi, anh ta tiến về phía con một bước thì con hãy bước về phía anh ta hai bước.
♥ Mẹ bảo, ngôi nhà chính là chỗ đóng quân của người phụ nữ, cho dù có xảy ra chuyện gì thì cũng đừng có bỏ đi. Bởi vì, đường trở về rất khó khăn.
♥ Mẹ bảo, hai người trong nhà đừng có lúc nào cũng chỉ nghĩ đến sĩ diện, hai người sống với nhau, sĩ diện quan trọng lắm sao? Nếu thế thì ra ngoài sống thế nào được?
Mẹ bảo, phụ nữ nhất định phải ra ngoài làm việc, cho dù là kiếm được nhiều hay ít. (Ảnh minh họa).
♥ Mẹ bảo, bất kể một người đàn ông giàu có, nhiều tiền như thế nào thì anh ta vẫn hi vọng có thể nhìn thấy con sạch sẽ thơm tho ở trong một ngôi nhà sạch sẽ tươm tất và đợi anh ta.
♥ Mẹ bảo, đàn ông tốt rất nhiều, anh ta sẽ không bao giờ đi ôm người phụ nữ khác. Nhưng trong cái xã hội như thế này, có rất nhiều phụ nữ xấu sẽ giang tay ra ôm lấy người đàn ông của con.
♥ Mẹ bảo, phụ nữ nhất định phải ra ngoài làm việc, cho dù là kiếm được nhiều hay ít, làm việc chính là sự thể hiện giá trị cuộc sống của bản thân. Nếu con cứ ở nhà mãi, anh ta sẽ có cơ hội nói trước mặt con rằng: “Tôi đang nuôi cô đấy.”
♥ Mẹ bảo, con đi làm bên ngoài, dù có bận lắm là bận thì vẫn phải làm việc nhà, nếu không thì dùng tiền của mình mà tìm một người giúp việc theo giờ. Việc trong nhà nhất định phải lo liệu tốt, con cái cũng phải nuôi dạy cho tốt.
♥ Mẹ bảo, anh ta vì con mà làm những việc mà con không bao giờ ngờ tới, con có thể cảm động, có thể khen ngợi, nhưng nhất quyết không được châm chọc kiểu “hôm nay mặt trời mọc đằng tây rồi hay sao”, vì nếu như vậy, sau này anh ta sẽ không bao giờ làm bất cứ việc gì vì con nữa.
♥ Mẹ bảo, chẳng có ai là một nửa của ai cả, ý nghĩ của con mà không nói ra thì ai mà biết được? Cần cảm nhận cái gì, ghét việc gì, con phải nói ra thì người ta mới hiểu được.
♥ Mẹ bảo, bố mẹ anh ta cũng là bố mẹ con, cho dù bố mẹ anh ta đối xử với con không được tốt cho lắm, thì con cũng phải đối tốt với họ. Bởi họ là bố mẹ của anh ta.
♥ Mẹ bảo, một khi đã quyết định sống cùng người đó rồi, thì đừng có oán thán cuộc sống khó khổ, nếu như con đã chọn anh ta, thì đừng có oán trách anh ta.
♥ Mẹ bảo, nhiều tiền như thế thì có tác dụng gì, anh ta đâu? Anh ta đang ở đâu?
♥ Mẹ bảo, cả đời này chúng ta có thể tiêu hết bao nhiêu tiền? Đừng mua những đồ xa xỉ mà làm gì, sống hạnh phúc là tốt rồi.
♥ Mẹ bảo, đừng có dọa con cái là “mẹ không cần con”, lúc cáu giận đừng có đuổi con cái ra khỏi nhà, chẳng may không thấy nó thật, con sẽ rất đau khổ.
♥ Mẹ bảo, đừng đánh con cái, lại càng không nên lôi ra ngoài mà đánh.
♥ Mẹ bảo, tình yêu mà cứ đánh đấm đâm giết nhau đúng là mãnh liệt thật, cũng rất lãng mạn. Nhưng không thực tế. Cứ bình thường thôi là được.
♥ Mẹ bảo, cái gì thì cũng đều là duyên phận cả.
♥ Mẹ bảo, cuộc sống luôn thay đổi, phải biết trân trọng từng ngày.
Thứ Bảy, 17 tháng 3, 2012
3-layers (2)
Lập trình với Mô hình 3 lớp (3 layers) 3 tiers part 2
Business Service Components
Bước tiếp theo chúng ta sẽ phân tích và thiết kế các Business Service Components. Các thành phần này sẽ làm nhiệm vụ chính cung cấp các dịch vụ cho lớp Presentation dùng để lấy và lưu trữ thông tin.
Lớp CategoryService
Chúng ta cần những thao tách chính trên đối tượng dữ liệu Category:
Tạo mới – CreateCategory(Category category)
Cập nhật – UpdateCategory(Category category)
Xóa – DeleteCategory(int categoryId)
Lấy thông tin chi tiết – GetCategory(int categoryId)
Lấy danh sách các category – GetCategories()
Kiểm tra một Key xem có trong database chưa – CheckKey(string keyName). Thao tác này dùng để kiểm tra xem khi tạo mới một category thì KeyName đã tồn tại trong hệ thống chưa. Thao tác này có thể dùng trên lớp Presentation để kiểm tra và thông báo lỗi cho người dùng khi họ nhập một tên khóa đã có trong hệ thống
Lưu ý: Chúng ta sẽ thực hiện các business logic của hệ thống trong lớp này.
Tương tự đối với lớp NewsService, dựa trên những gì yêu cầu chúng ta phân tích ở bài viết đầu tiên, chúng ta cần những thao tác chính sau đây trên đối tượng News:
Tạo mới – CreateNews(News news)
Cập nhật – UpdateNews(News news)
Xóa – DeleteNews(int newsId)
Lấy thông tin chi tiết – GetNews(int newsId)
Lấy danh sách các bản tin thuộc một chuyên mục nào đó, sắp xếp theo tin mới nhất – GetNewsOfCategory(int categoryId, int page, int pageSize, out int totalRecords)
Cập nhật số lần xem của một bản tin – UpdateTotalViews(int newsId)
Cập nhật đánh giá cho một bản tin – UpdateRate(int newsId, int rate)
Tìm bài viết dựa trên từ khóa – SearchNews(string keyWords, int page, int pageSize, out int totalRecords)
Trong các hàm trên, các bạn chú ý đến hàm GetNewsOfCategory. Trong hàm này có các tham số dùng để phân trang các bản tin. Chúng ta cần đến chức năng này vì khi trình bày trên trang tin, chúng ta chỉ trình bày một số lượng có hạn các bản tin của một chuyên mục nào đó chứ không thể trình bày tất cả trên màn hình được. Khi người dùng muốn xem thêm, họ có thể chọn trang tiếp theo hoặc nhấp vào link Xem tiếp, lúc đó ứng dụng sẽ trình bày các bản tin ở các trang tiếp theo. Tham số totalRecords cho chúng ta biết được tổng số bản tin thật sự có trong chuyên mục đó.
Lưu ý: Khi phân tích thiết kế ban đầu bạn không thể nào hình dung được hết các yêu cầu phát sinh để thiết kế trước các thao tác cần thiết. Bạn phải cập nhật bản thiết kế thường xuyên để phù hợp với yêu cầu. Bản thiết kế này vẫn còn thiếu một số chức năng cần thiết mà tôi sẽ trình bày cho các bạn trong bài viết tiếp theo, chúng ta sẽ chỉnh sửa bản thiết kế này trong quá trình phát triển ứng dụng để phù hợp với các yêu cầu phát sinh mà chúng ta chưa nhìn thấy hết khi thiết kế.
Data Access Components
Bây giờ chúng ta sẽ thiết kế các lớp dùng để truy xuất và cập nhật dữ liệu. Các hàm của các lớp DAO cũng khá đơn giản, chỉ làm nhiệm vụ cập nhật dữ liệu vào database và truy xuất dữ liệu từ database. Các bạn cũng thấy chức năng nó giống như trên lớp Business Logic, nhưng ở đây chúng ta không có bất kỳ ràng buộc logic gì, chỉ đơn giản thực hiện việc truy xuất dữ liệu mà thôi. Các business logic đã được kiểm tra trên lớp Business Logic.
Chúng ta tách biệt 2 lớp CategoryDAO (DAO – Data Access Object) và NewsDAO để dễ quản lý và thay đổi khi cần thiết. VD nếu bạn muốn thêm một thao tác truy xuất dữ liệu mới trên đối tượng News, bạn sẽ biết ngay mình phải thay đổi lớp NewsDAO. Nhưng có những thao tác bạn phải cân nhắc nên để nó lớp nào vì nó liên quan đến nhiều đối tượng, lúc đó bạn phải xét xem mục đích chính của thao tác đó là gì, thao tác trên đối tượng dữ liệu chính nào để đưa thao tác đó vào lớp phù hợp.
Thiết kế cơ sở dữ liệu
Do ứng dụng của chúng ta đơn giản nên chỉ có 2 bảng dữ liệu ánh xạ gần như 1-1 với các entities trên lớp Business Logic như sau:
Hiện thực lớp Business Logic & Data Access
Sau khi đã xong bước thiết kế, chúng ta sẽ tiến hành hiện thực 2 lớp Business và Data Access. Các bạn có thể xem source code đính kèm để biết chi tiết cách hiện thực 2 lớp này như thế nào. Lớp Presentation sẽ được thiết kế và hiện thực trong bài viết tiếp theo. Phần bên dưới tôi sẽ trình bày một số điểm chính trong cách hiện thực.
Hiện thực Data Access Components
Do ứng dụng của chúng ta đơn giản nên được giới hạn sẽ dùng với CSDL SQL Server 2000/2005 nên lớp này không được thiết kế để chạy cùng lúc với nhiều loại database khác nhau. Chúng ta sẽ dùng cái Stored Procedures để truy xuất dữ liệu an toàn và dễ thay đổi hơn, tránh bị các lỗi như SQL Injection(không thể tránh hoàn toàn nếu bạn không hiện thực đúng). Các bạn có thể xem qua một cách hiện thực một hàm cơ bản như thế nào:
public void CreateCategory(Category category)
{
using (SqlConnection connection = GetConnection())
{
SqlCommand command = new SqlCommand(“spCategoriesCreate”, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter(“@KeyName”, category.KeyName));
command.Parameters.Add(new SqlParameter(“@Name”, category.Name));
command.Parameters.Add(new SqlParameter(“@Description”, category.Description));
command.Parameters.Add(new SqlParameter(“@Picture”, category.Picture));
SqlParameter paramCategoryId = new SqlParameter(“@CategoryId”, SqlDbType.Int, 4);
paramCategoryId.Direction = ParameterDirection.Output;
command.Parameters.Add(paramCategoryId);
connection.Open();
command.ExecuteNonQuery();
if (paramCategoryId.Value != DBNull.Value)
category.CategoryId = (int)paramCategoryId.Value;
else
throw newDataAccessException(String.Format(Resources.String s.CreateEntityException,“Category”));
}
}
Stored Procedure spCategoriesCreate đơn giản được viết như sau:
CREATE PROCEDURE dbo.spCategoriesCreate
@Name nvarchar(50),
@KeyName varchar(30),
@Description ntext,
@Picture varchar(256),
@CategoryId int output
AS
INSERT INTO Categories
(
Name,
KeyName,
Description,
Picture
)
VALUES
(
@Name,
@KeyName,
@Description,
@Picture
)
SELECT @CategoryId = SCOPE_IDENTITY()
Hiện thực lớp Business Logic
Hiện thực lớp Business Logic đòi hỏi bạn phải nắm rõ các business logic của ứng dụng. Ví dụ đối với ứng dụng tin tức của chúng ta thì khi tạo một chuyên mục mới, bạn phải kiểm tra xem KeyName của chuyên mục đó đã có trong hệ thống chưa? Nếu có rồi thì phải báo lỗi, và nếu chưa có thì chúng ta kiểm tra KeyNameđó có hợp lệ hay không? (Chỉ chứa kí tự alphabet, chữ số, gạch dưới và gạch ngang…).
public static void CreateCategory(Category category)
{
// Has this key name existed?
if (!CheckKey(category.KeyName))
throw newBusinessException(String.Format(Resources.Strings. KeyNameExisted, category.KeyName));
// is this key name valid?
if (!ValidateKey(category.KeyName))
throw newBusinessException(String.Format(Resources.Strings. InvalidKeyName, category.KeyName));
// ok , now save it to database
CategoryDAO categoryDAO = new CategoryDAO();
categoryDAO.CreateCategory(category);
}
Theo: diendandaihoc.vn
Đăng ký:
Nhận xét (Atom)


