Các hàm trong C

19 820 1
Các hàm trong C

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các hàm trong C

//chúng ta xây dựng mô hinh ba lop co so du liệu using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.Text; using DTO; namespace DAO { public class BookDao { // Hàm lấy danh sách Book public IList GetBookList() { // Khởi tạo đối tượng kết nối OleDbConnection oledbCon = DataProvider.ConnectionData(); // Khởi tạo gán giá trị cho chuỗi truy vấn sở liệu string strSQL = "Select * From Book"; // Khởi tạo đối tượng OleDBCommand thực thi câu truy vấn OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon); // Khởi tạo đối tượng OleDBDataReader OleDbDataReader oledbDtr = oledbCmd.ExecuteReader(); // Khởi tạo đối tượng ArrayList ArrayList Arl = new ArrayList(); // Khởi tạo đối tượng BookDto BookDto BokDto = null; // Trong OleDBDataReader cịn đọc while(oledbDtr.Read()) { // Khởi tạo lại đối tượng BookDto BokDto = new BookDto(); // Gán giá trị cho trường BookDto // Gán giá trị cho BookID BokDto.ID = (string)oledbDtr["BookID"]; // Gán giá trị cho BookName BokDto.Name = (string)oledbDtr["BookName"]; // Gán giá trị cho BookDateOfPuslish BokDto.DateOfPuslish = (string)oledbDtr["BookDateOfPuslish"]; // Gán giá trị cho BookPrice BokDto.Price = (string)oledbDtr["BookPrice"]; // Gán giá trị cho BookStatus BokDto.Status = (string)oledbDtr["BookStatus"]; // Gán giá trị cho BookAmount BokDto.Amount = (string)oledbDtr["BookAmount"]; // Gán giá trị cho BookRemain BokDto.Remain = (string)oledbDtr["BookRemain"]; // Gán giá trị cho BookDecription BokDto.Decription = (string)oledbDtr["BookDecription"]; // Gán giá trị cho BookAuthorID BokDto.AuthorID = (string)oledbDtr["BookAuthorID"]; // Gán giá trị cho BookCategoryID BokDto.CategoryID = (string)oledbDtr["BookCategoryID"]; // Thêm đối tượng BookDto vừa tạo vào ArrayList Arl.Add(BokDto); } // Đóng kết nối OleDBConnection oledbCon.Close(); // Đóng kết nối OleDBDataReader oledbDtr.Close(); // Trả đối tượng ArrayList return Arl; } // Hàm lấy đối tượng BookDto từ sở liệu biết BookID public BookDto GetBook(string stringBookID) { // Khởi tạo đối tượng kết nối OleDbConnection oledbCon = DataProvider.ConnectionData(); // Khởi tạo gán giá trị cho chuỗi truy vấn sở liệu string strSQL = "Select * From Book Where BookID = ?"; // Khởi tạo đối tượng OleDBCommand thực thi với tham số chuỗi truy vấn đối tượng kết nối OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon); // Gán tham số cho trường // Gán tham số cho AuthorID oledbCmd.Parameters.Add("@BookID", OleDbType.WChar); oledbCmd.Parameters["@BookID"].Value = stringBookID; lệnh // Khởi tạo đối tượng OleDBDataReader thực thi có truy vấn câu OleDbDataReader oledbDtr = oledbCmd.ExecuteReader(); // Khởi tạo đối tượng AuthorDto BookDto bookDto = new BookDto(); // Trong đối tượng OleDBDataReader cịn đọc while (oledbDtr.Read()) { // Gán giá trị cho đối tượng BookDto // Gán giá trị cho BookID bookDto.ID = (string)oledbDtr["BookID"]; // Gán giá trị cho BookName bookDto.Name = (string)oledbDtr["BookName"]; // Gán giá trị cho BookDateOfPuslish bookDto.DateOfPuslish = (string)oledbDtr["BookDateOfPuslish"]; // Gán giá trị cho BookPrice bookDto.Price = (string)oledbDtr["BookPrice"]; // Gán giá trị cho BookStatus bookDto.Status = (string)oledbDtr["BookStatus"]; // Gán giá trị cho BookAmount bookDto.Amount = (string)oledbDtr["BookAmount"]; // Gán giá trị cho BookRemain bookDto.Remain = (string)oledbDtr["BookRemain"]; // Gán giá trị cho BookDecription bookDto.Decription = (string)oledbDtr["BookDecription"]; // Gán giá trị cho BookAuthorID bookDto.AuthorID = (string)oledbDtr["BookAuthorID"]; // Gán giá trị cho BookCategoryID bookDto.CategoryID = (string)oledbDtr["BookCategoryID"]; } // Đóng kết nối oledbCon.Close(); // Trả đối tượng AuthorDto return bookDto; } // Hàm thêm Book với tham số BookDto public void AddBook(BookDto bookDto) { // Khởi tạo đối tượng kết nối OleDbConnection oledbCon = DataProvider.ConnectionData(); // Khởi tạo gán giá trị cho chuỗi truy vấn sở liệu string strSQL = "Insert Into Book( BookID, BookName, BookDateOfPuslish, BookPrice, BookStatus, BookAmount, BookRemain, BookDecription, BookAuthorID, BookCategoryID) Values( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; // Khởi tạo đối tượng OleDBCommand với tham số chuỗi truy vấn đối tượng kết nối OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon); // Gán tham số cho trường // Gán tham số cho BookID oledbCmd.Parameters.Add("@BookID", OleDbType.WChar); oledbCmd.Parameters["@BookID"].Value = bookDto.ID; // Gán tham số cho BookName oledbCmd.Parameters.Add("@BookName", OleDbType.WChar); oledbCmd.Parameters["@BookName"].Value = bookDto.Name; // Gán tham số cho BookDateOfPuslish oledbCmd.Parameters.Add("@BookDateOfPuslish", OleDbType.WChar); oledbCmd.Parameters["@BookDateOfPuslish"].Value = bookDto.DateOfPuslish; // Gán tham số cho BookPrice oledbCmd.Parameters.Add("@BookPrice", OleDbType.WChar); oledbCmd.Parameters["@BookPrice"].Value = bookDto.Price; // Gán tham số cho BookStatus oledbCmd.Parameters.Add("@BookStatus", OleDbType.WChar); oledbCmd.Parameters["@BookStatus"].Value = bookDto.Status; // Gán tham số cho BookAmount oledbCmd.Parameters.Add("@BookAmount", OleDbType.WChar); oledbCmd.Parameters["@BookAmount"].Value = bookDto.Amount; // Gán tham số cho BookRemain oledbCmd.Parameters.Add("@BookRemain", OleDbType.WChar); oledbCmd.Parameters["@BookRemain"].Value = bookDto.Remain; // Gán tham số cho BookDecription oledbCmd.Parameters.Add("@BookDecription", OleDbType.WChar); oledbCmd.Parameters["@BookDecription"].Value = bookDto.Decription; // Gán tham số cho BookAuthorID oledbCmd.Parameters.Add("@BookAuthorID", OleDbType.WChar); oledbCmd.Parameters["@BookAuthorID"].Value = bookDto.AuthorID; // Gán tham số cho BookCategoryID oledbCmd.Parameters.Add("@BookCategoryID", OleDbType.WChar); oledbCmd.Parameters["@BookCategoryID"].Value = bookDto.CategoryID; // Thực thi không truy vấn sở liệu đối tượng OleDBCommand oledbCmd.ExecuteNonQuery(); // Đóng kết nối oledbCon.Close(); } // Hàm xóa Book biết BookID public void DeleteBook(string stringBookID) { // Khởi tạo đối tượng kết nối OleDbConnection oledbConnection = DataProvider.ConnectionData(); // Khởi tạo gán giá trị cho chuỗi truy vấn sở liệu string stringSql = "Delete * From Book Where BookID = ?"; // Khởi tạo đối tượng OleDBCommand OleDbCommand oledbCommand = new OleDbCommand(stringSql, oledbConnection); // Gán tham sô cho trường oledbCommand.Parameters.Add("@BookID", OleDbType.WChar); oledbCommand.Parameters["@BookID"].Value = stringBookID; // Thực thi không truy vấn sở liệu oledbCommand.ExecuteNonQuery(); // Đóng kết nối oledbConnection.Close(); } // Hàm cập nhật thông tin Book public void UpdateBook(BookDto bookDto) { // Khởi tạo đối tượng kết nối sở liệu OleDbConnection oledbConnection = DataProvider.ConnectionData(); // Khởi tạo gán giá trị cho chuỗi truy vấn sở liệu string stringSql = "Update Book Set BookName = ?, BookDateOfPuslish = ?, BookPrice = ?, BookStatus = ?, BookAmount = ?, BookRemain = ?, BookDecription = ?, BookAuthorID = ?, BookCategoryID = ? Where BookID = ?"; // Khởi tạo đối tượng OleDBCommand OleDbCommand oledbCommand = new OleDbCommand(stringSql, oledbConnection); // Gán tham số cho giá trị // Gán tham số cho BookName oledbCommand.Parameters.Add("@BookName", OleDbType.WChar); oledbCommand.Parameters["@BookName"].Value = bookDto.Name; // Gán tham số cho BookDateOfPuslish oledbCommand.Parameters.Add("@BookDateOfPuslish", OleDbType.WChar); oledbCommand.Parameters["@BookDateOfPuslish"].Value = bookDto.DateOfPuslish; // Gán tham số cho BookPrice oledbCommand.Parameters.Add("@BookPrice", OleDbType.WChar); oledbCommand.Parameters["@BookPrice"].Value = bookDto.Price; // Gán tham số cho BookStatus oledbCommand.Parameters.Add("@BookStatus", OleDbType.WChar); oledbCommand.Parameters["@BookStatus"].Value = bookDto.Status; // Gán tham số cho BookAmount oledbCommand.Parameters.Add("@BookAmount", OleDbType.WChar); oledbCommand.Parameters["@BookAmount"].Value = bookDto.Amount; // Gán tham số cho BookRemain oledbCommand.Parameters.Add("@BookRemain", OleDbType.WChar); oledbCommand.Parameters["@BookRemain"].Value = bookDto.Remain; // Gán tham số cho BookDecription oledbCommand.Parameters.Add("@BookDecription", OleDbType.WChar); oledbCommand.Parameters["@BookDecription"].Value = bookDto.Decription; // Gán tham số cho BookAuthorID oledbCommand.Parameters.Add("@BookAuthorID", OleDbType.WChar); oledbCommand.Parameters["@BookAuthorID"].Value = bookDto.AuthorID; // Gán tham số cho BookCategoryID oledbCommand.Parameters.Add("@BookCategoryID", OleDbType.WChar); oledbCommand.Parameters["@BookCategoryID"].Value = bookDto.CategoryID; // Gán tham số cho BookID oledbCommand.Parameters.Add("@BookID", OleDbType.WChar); oledbCommand.Parameters["@BookID"].Value = bookDto.ID; // Thực thi chuỗi truy vấn sở liệu oledbCommand.ExecuteNonQuery(); // Đóng kết nối oledbConnection.Close(); sqlconnection.Open()//mo chuoi ket noi } } } Kỹ thuật lập trình 3.0 với C# Người lập trình dễ dàng tiếp cận với lập trình FP nhiều kỹ thuật C# 3.0 có điểm chung với FP Đối với người lập trình OOP, cảm nhận làm việc với C# 3.0 thay đổi cú pháp lập trình với kỹ thuật Anonymous type, Lambda Expression hay Lazy evaluation Kết hợp kỹ thuật lại với giảm thiểu số lượng công việc áp lực cơng việc cho người lập trình, đồng thời làm tăng tính hiệu sản phẩm code nhỏ, gọn, Type Inference – Anonymous type: Type Inference: Được dùng để khai báo biến với từ khóa “var” mà khơng cần định nghĩa kiểu liệu Trình biên dịch tự động suy luận kiểu cách tham chiếu đến giá trị gán cho biến Tuy nhiên kiểu khai báo sử dụng phạm vi local var Name =”An”; var Age = “1/1/1980”; var Numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Anonymous type: xây dựng khái niệm “Tuple” - tập dãy liệu Thí dụ có Tuple Name:An salary:300 City: Ho Chi Minh Anonymous type dùng để định nghĩa kiểu liệu không cần rõ tên cấu trúc liệu var myInfo = new {Name =”An”, Age=”1/1/1980”, Salary=300}; var mySalary = myInfo.Salary * 2; Biến myInfo khởi tạo với kiểu liệu hoàn toàn không định nghĩa cấu trúc rõ ràng Phép tốn “var mySalary = myInfo.Salary*2” khơng gây lỗi trình biên dịch hiểu rõ cấu trúc kiểu liệu myInfo Một ưu điểm Anonymous type kết hợp với Type Inference việc tham chiếu liệu Ứng dụng Type Inference – Anonymous type việc tham chiếu liệu: dự án hay nhiều liên quan đến tương tác với liệu người lập trình phải viết đoạn mã để lọc tập liệu từ tập liệu ban đầu Tập liệu field hay kết hợp với tập liệu khác nhiều field Công việc gọi tham chiếu hay “Projection” Trước công việc thường tốn nhiều thời gian phải định nghĩa cấu trúc liệu, viết mã lưu liệu vào cấu trúc mà cấu trúc liệu sử dụng hàm Amonumous type trở nên hiệu yêu cầu Với tập liệu thí dụ 4, yêu cầu tạo danh sách người tên “Huy” danh sách với lấy hai field Name Salary thêm field Allowance xử lý sau: Thí dụ 8: var searchList = from r in people where r.Name == “Huy” select new { r.Name, r.Salary, Allowance = r.Salary * 0.7 }; Kiểu liệu “searchList” với field “Name, Salary, Allowance” tạo mà khơng cần địi hỏi q nhiều thời gian cho việc định nghĩa cấu trúc, viết code hay phát lỗi Tuy nhiên “Anonymous type” sử dụng pham vi local Lambda Expression: Anonymous method hỗ trợ cách viết inline code chưa có thay đổi đáng kể cú pháp câu lệnh Lambda Expression phát triển Anonymous method, giúp giải gánh nặng người lập trình việc viết đoạn mã Có thể hiểu Lambda Expression hàm mang biến số Cú pháp “x => x+1” giống hàm có biến “x” giá trị trả hàm “x+1” Lambda Expression xây dựng lý thuyết “Lambda calculus” phát minh thập niên 1930 Kí tự Lambda (?) người Hy Lạp dùng đặt phía trước biến số hàm Thí dụ biểu diễn hàm biến hàm hai biến Lambda Expression cú pháp ngôn ngữ C# 3.0 f(x) = x f(x,y) = x + y Lambda Expression x ? x (x,y) ? x + y C# 3.0 x => x (x,y) => x + y Nhờ vào cú pháp đơn giản, nên dòng lệnh đơn giản Thí du 9: Func Add = (x, y) => x + y; Lambda Expression khơng có tham số (parameter) có nhiều parameter parameter khai báo kiểu không cần khai báo kiểu n => (n-1)*(n-2) x => (x % 2) == (int x) => (x % 2) == p => p.Name == “Huy” && p.Age > 25 Các kỹ thuật Closure hay Currying sử dụng Lambda Expression Closure Lambda Expression khả hiểu kiểm soát biến khơng nằm phạm vi biểu thức Thí dụ 10: int x = 99; Func add = y => y + x; int firstResult = add(1); // 99 + = 100 int secondResult = add(2); // 99 + = 101 Tuy “y” không biến local khơng parameter method chương trình khơng báo lỗi xem biến “tự do” Kết biểu thức firstResult 100 trường hợp Closure có vai trị lưu trạng thái giá trị biến để sử dụng lại sau Currying Lambda Expression cho hàm f(x,y): static Func f(int x) { Func add = (y, z) => y + z; return y => add(x, y); } var Currying = f(1); int three = Currying(2); // = + int four = Currying(3); // = + Thật khó để thấy ứng dụng Currying vào thực tế Tuy nhiên thích hợp khoa học máy tính cho việc chia nhỏ hàm tốn học có n biến chứa phép toán phức tạp thành n-1 hàm đơn giản Query Expression: Đây hỗ trợ ngôn ngữ LINQ cho C# 3.0 việc xây dựng câu truy vấn inline Ngồi câu lệnh trơng giống ngơn ngữ SQL “Select”, “From”, “Where” (thí dụ 8) việc ứng dụng “Lambda Expression” vào “Query Expression” làm đơn giản công việc truy vấn liệu Các câu lệnh truy vấn trở nên ngắn gọn dễ hiểu Thí dụ viết lại “Lambda Expression”: Thí dụ 11: var searchList = people .Where(p => p.Name == “Huy”) Select(p => new { p.Name, p.Salary, allowance = p.Salary * 0.7 }); Một thí dụ tìm tuổi lớn danh sách, trước người lập trình phải viết stored procedure hay đoạn mã so sánh phần tử danh sách với C# 3.0 cần lệnh: int maxAge = people.Max(p => p.Age); Một kỹ thuật hữu ích Query Expression Extension Method Trước đây, class thuộc hãng thứ ba hay class lý khai báo đóng kín, người lập trình thường gặp nhiều khó khăn khơng phép thay đổi hay thêm method cho phù hợp với yêu cầu Thí dụ class Integer C#, người lập trình thêm method Square lệnh gọi đây: Thí dụ 12: int myValue = 2; myValue.Square(); Class Integer C# hồn tồn khơng có method Square Nhờ kỹ thuật Extention Method, người lập trình làm việc với yêu cầu Giả sử class ListPerson cung cấp hàm tìm kiếm theo tên thừa kế hay thêm vào class Nếu có u cầu tìm kiếm theo tuổi người lập trình khơng thể tự giải vấn đề Dùng kỹ thuật Extention Method định nghĩa class dạng static bên class định nghĩa static method với từ khóa this cho biến số method Method Square định nghĩa: public static int Square(this int myNumber) { return myNumber * myNumber; } Trở lại yêu cầu tìm kiếm theo tuổi danh sách, tạo method tên MyQuery: namespace MyExtentionMethod { delegate R Func(T t); static class PersonExtensions { public static IEnumerable MyQuery(this IEnumerable sequence, Func predicate) { foreach (T item in sequence) if (predicate(item)) yield return item; } } } Tìm nhân viên có tuổi lớn 29 hay có lương lớn 400: ListPerson person = new ListPerson(people); var myListAge = person.MyQuery(p => p.Age > 29); var myListSalary = person.MyQuery(p => p.Salary > 400 ); Trơng method MyQuery thuộc vào class ListPerson (person.MyQuery) class định nghĩa PersonExtensions Lazy evaluation: Đây kỹ thuật ngơn ngữ lập trình quan tâm, Lazy evaluation C# 3.0 tự nhiên đơn giản Giả sử f(x,y) = x+y xảy thỏa điều kiện x >= y >= 0: Thí dụ 13: static Func Add = (x, y) => x + y; static int MyLazyEvaluation(int x, int y, int function) { if (x p.Name.Equals(“An”)); Như “Filter” C# 2.0 tương đồng với “Where” C# 3.0 Map: Dùng để tạo dãy từ dãy ban đầu theo phép toán tương ứng Hàm ConvertAll() “Map” Parameter hàm hàm ảnh hưởng lên phần tử dãy Câu lệnh tạo danh sách với mức lương nhân với hệ số “0.7”: var allowanceSalary = people.ConvertAll(delegate(Person p) { return p.Salary *= 0.7; }); viết lại với C# 3.0: var allowanceSalary = people.ConvertAll(p => p.Salary * 0.7); hay var allowanceSalary = people.Select(p => p.Salary * 0.7); Như “Map” C# 2.0 tương đồng với “Select” C# 3.0 Reduce: Còn hiểu “Fold” lập trình FP Đây khả tính tốn giá trị dãy cách lướt qua tất phần tử dãy Tính tổng tiền lương danh sách: int total = people.Aggregate(0, delegate(int currentSum, Person p) { return currentSum + p.Salary; }); C# 3.0: var total = people.Select(p => p.Salary).Aggregate(0, (x, y) => x + y); NET Framework 3.5 cung cấp số hàm tính tốn cho dãy Sum, Average, Count, Min, Max Do thấy Filter hay Map C# 2.0 khơng cịn thích hợp cho C# 3.0 Lambda Expression hồn tồn thay LINQ ngày phổ biến Thí dụ tính tổng số lương người có tuổi lớn 29: var total = people.Where(p => p.Age>29).Select(p => p.Salary).Sum(); hay var total = (from p in people where (p.Age > 29) select p.Salary).Sum(); KẾT LUẬN Lập trình FP Net cịn hạn chế, tiếp cận với kỹ thuật giúp người lập trình tiết kiệm nhiều thời gian việc viết quản lý code phát lỗi, đồng nghĩa với tiết kiệm chi phí nhân cho dự án Và nữa, FP cho phép khai thác sức mạnh xử lý đa nhân ... kh? ?c nhiều field C? ?ng vi? ?c gọi tham chiếu hay “Projection” Trư? ?c công vi? ?c thường tốn nhiều thời gian phải định nghĩa c? ??u tr? ?c liệu, viết mã lưu liệu vào c? ??u tr? ?c mà c? ??u tr? ?c liệu sử dụng hàm. .. dụng Currying vào th? ?c tế Tuy nhiên thích hợp khoa h? ?c máy tính cho vi? ?c chia nhỏ hàm tốn h? ?c có n biến chứa phép toán ph? ?c tạp thành n-1 hàm đơn giản Query Expression: Đây hỗ trợ ngôn ngữ LINQ cho... OleDbType.WChar); oledbCommand.Parameters["@BookID"].Value = bookDto.ID; // Th? ?c thi chuỗi truy vấn sở liệu oledbCommand.ExecuteNonQuery(); // Đóng kết nối oledbConnection.Close(); sqlconnection.Open()//mo

Ngày đăng: 16/08/2012, 10:40

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan