Các phong cách lập trình

thongdoanvan

Moderator
21/1/10
247
7
16
Các phong cách lập trình
Với một bài toán, nhưng chúng ta có thể có nhiều cách để giải quyết. Mỗi cách giải quyết đều có cái hay riêng, và tùy từng trường hợp thì ta nên chọn cách nào cho phù hợp nhất.
Sau đây mình sẽ đưa ra một ví dụ, với những cách giải quyết khác nhau.(4cách)
Yêu cầu
-IDE: Netbean 6.1
-Cơ sở dữ liệu: SqlServer
-Gói Jdbc driver.
Trước tiên: Ta cần tạo một cơ sở dữ liệu có tên là Opp
PHP:
create database opp
go
use opp
go
create table UserName
(
	id int  primary key identity(1,1),
	uname nvarchar(100)
)
go
Cơ sở dữ liệu là opp, và trong cơ sở dữ liệu này, chỉ có một bảng là UserName. Bảng này quản lý tên của sinh viên.
Vấn đề đặt ra, là chúng ta tiến hành thêm tên của sinh viên vào cơ sở dữ liệu.
Cách số1:
Bước 1: Tạo project có tên là MVC
Bước 2:Tạo một package là “cach1”
Bước 3:Tiến hành tạo một Jframe, Trong Jframe có một trường để thêm dữ liệu, và một button (Tên của button là thêm)
Bước 4:Kích chuột phải vào nút them, tiến hành chọn sự kiện ActionPerformed
Trong sự kiện này ta tiến hành code như sau
PHP:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1552;databaseName=opp", "sa", "123456");
            pre=con.prepareStatement("insert into UserName(uname) values(?)");
            pre.setString(1, user.getText());
            pre.executeUpdate();
            JOptionPane.showMessageDialog(rootPane, "Thêm thành công");
        } catch (Exception ex) {
           ex.toString();
        }

Nội dung đầy đủ của Jfame như sau
PHP:
package cach1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.swing.JOptionPane;
public class Jframe extends javax.swing.JFrame {
    Connection con;
    PreparedStatement pre;
    public Jframe() {
        initComponents();
    }
@SuppressWarnings("unchecked")
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1552;databaseName=opp", "sa", "123456");
            pre=con.prepareStatement("insert into UserName(uname) values(?)");
            pre.setString(1, user.getText());
            pre.executeUpdate();
            JOptionPane.showMessageDialog(rootPane, "Thêm thành công");
        } catch (Exception ex) {
           ex.toString();
        } 
}                                        
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jframe().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField user;
    // End of variables declaration                   
}
Với cách số 1, chỉ cần như vậy là ta có thể thêm dữ liệu vào cơ sở dữ liệu rồi.
Đặc điểm: Tiến hành kết nối tới cơ sở dữ liệu ngay trong sự kiện ActionPerformed
Ưu điểm: Viết code ngắn, với những trường hợp làm vidu demo
Nhược điểm: Trong một project, thì có rất nhiều các Jframe, vì thế nếu mỗi sự kiện lại viết như trên thì lượng code tăng lên đột biến. Vì thế cách này tỏ ra không hiệu nghiệm.
Cách số 2: Đang tiếp tục.
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Các phong cách lập trình

Cách số 2.
Giới thiệu: So với cách 1 thì cách này có cải tiến hơn, là đã phân chia ra một lớp đóng vai trò tương tác với cơ sở dữ liệu. Đó là lớp connectdb.java.
PHP:
Bước 1: Tạo package có tên là cach2
Bước 2: Tạo file connectdb.java
[php]
package cach2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class connectdb {
    private Connection con;
    public Connection getCon() {
        return con;
    }
    public void setCon(Connection con) {
        this.con = con;
    }
    public connectdb() throws ClassNotFoundException
    {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        try {
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1552;databaseName=opp", "sa", "123456");
            System.out.println("Connect thanh cong");
        } catch (SQLException ex) {
            Logger.getLogger(connectdb.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public int themSinhVien(String User) throws SQLException
    {
        int result=-1;
        PreparedStatement pre=null;
        pre=con.prepareStatement("insert into UserName(uname) values(?)");
        pre.setString(1, User);
        result=pre.executeUpdate();
        return result;
    }
}
Cũng như cách số 1:Ta tiến hành tạo một Jframe với một trường thêm dữ liệu, Một button có tên là them.
Nhấn phải vào them, chọn method ActionPerformed. Trong sự kiện trên tiến hành code như sau
PHP:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            connectdb con = new connectdb();
            con.themSinhVien(user.getText());
            JOptionPane.showMessageDialog(rootPane, "Bạn thêm thành công");
        } catch (SQLException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        }
    
}
Code đầy đủ của Jframe như sau
package cach2;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
public class Jframe extends javax.swing.JFrame {
public Jframe() {
initComponents();
}
@SuppressWarnings("unchecked")
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
connectdb con = new connectdb();
con.themSinhVien(user.getText());
JOptionPane.showMessageDialog(rootPane, "Bạn thêm thành công");
} catch (SQLException ex) {
Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Jframe().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JTextField user;
// End of variables declaration
}
Như ở cách thứ 1:Ta tiến hành việc kết nối , thao tác với cơ sở dữ liệu ngay trong method ActionPerformed. Tuy nhiên làm như vậy là không chuyên nghiệp.
Ở cách này ta đã phân ra một lớp có chức năng sử lý. Đó là connectdb.java. Có thể gọi lớp này là lớp Process. Trong lớp này, thì có một method, thêm sinh viên. Method này đóng vai trò thao tác với cơ sở dữ liệu, cụ thể ở đây là thêm một sinh viên mới.
Vì thế ta chỉ cần tạo một đối tượng thuộc lớp connectdb.java, rồi sau đó gọi method themsinhvien(truyền vào nội dung ta nhập)

Nhận xét: So với cách thứ 1 thì trong cách này ta đã đưa việc sử lý ra một lớp khác. Cách làm như vậy tuân theo mô hình MVC: model, controller, view.
Lúc này: Jframe, đóng vai trò là view, trình diễn dữ liệu
Sự kiện ActionPerformed đóng vai trò là controll, điều khiển, gọi các model thao tác với cơ sở dữ liệu
Và lớp connectdb.java đóng vai trò là Model, thao tác, tương tác với cơ sở dữ liệu

Cách số 3: Hồi sau sẽ dõ.
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Các phong cách lập trình

Cách số 3: Trong cách số 2, chúng ta mới chỉ lập trình theo mô hình Mvc, như vậy cũng chưa đúng là lập trình hướng đối tượng chuẩn.
Cách này sẽ giúp ta giải quyết vấn đề đó.
Bước 1: Tạo một project có tên là opp
Bước 2:Tạo một package có tên là connect
Bước 3:Tiến hành tạo các file
3.1. Đầu tiên ta tạo file
PHP:
connectdb.java
Nhiệm vụ của file này là chứa phương thức connect tới cơ sở dữ liệu. Nội dung đầy đủ như sau
PHP:
package connect;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class connectdb {
    private Connection con;
    public Connection getCon() {
        return con;
    }
    public void setCon(Connection con) {
        this.con = con;
    }
    public connectdb() throws ClassNotFoundException
    {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        try {
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1552;databaseName=opp", "sa", "123456");
            System.out.println("Connect thanh cong");
        } catch (SQLException ex) {
            Logger.getLogger(connectdb.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
3.2. Tạo entity, bean.java. Entity là các thực thể, nói cách khác nó chính là mapping của các bảng trong cơ sở dữ liệu. Tức là nếu trong cơ sở dữ liệu của bạn có bao nhiêu bảng, thì bạn cần phải tạo bấy nhiêu entity. Như ví dụ tôi nêu, thì trong cơ sở dữ liệu, chỉ có duy nhất một bảng UserName, vì vậy ta chỉ cần tạo một entity. Tên của entity nên đặt trùng với tên của bảng trong cơ sở dữ liệu, tuy nhiên ta cũng có thể đặt tên không trùng cũng ok.
PHP:
create table UserName 
( 
    id int  primary key identity(1,1), 
    uname nvarchar(100) 
)
Và entity được tạo như sau
PHP:
package connect;
public class bean {
    private String userName;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public bean()
    {
        
    }
    public bean(String userName)
    {
        this.userName=userName;
    }
}
Ta nhận thấy rằng, các biến trong Entity tương ứng với các trường trong bảng cơ sở dữ liệu.
Vậy vấn đề đặt ra là. Ta tạo entity làm gì?
Theo chuẩn của lập trình huớng đối tượng trong java, thì mọi thứ đều qui về đối tượng, để lấy được thuộc tính của đối tượng, thì chúng ta cần phải sử dụng set, get.
Ỏ đây, khi chúng ta thao tác với các bảng trong cơ sở dữ liệu, cũng chính là thao tác với các đối tượng trong bảng. Mà để thao tác với đối tượng thì ta cần phải tạo ra các entity.
3.3. Tạo các lớp model sử lý
Trong bài này, tôi tạo thêm một lớp Thêmsinhvien.java, lớp này đóng vai trò, thao tác với cơ sở dữ liệu. Để thêm, sửa sóa, thì ta chỉ cần viết các method tương ứng.
PHP:
package connect;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class themsinhvien {
   public int themdulieu(bean userName) throws ClassNotFoundException, SQLException
   {
       int result=-1;
       PreparedStatement pre=null;
       Connection con=null;
       connectdb a=new connectdb();
       con=a.getCon();
       pre=con.prepareStatement("insert into UserName(uname) values(?)");
       pre.setString(1, userName.getUserName());
       result=pre.executeUpdate();
       return result;
   }
}
Tóm lại đến đây chúng ta đã có
-Một file đóng vai trò connect tới cơ sở dữ liệu
-Một entity là mapping của bảng trong cơ sở dữ liệu
-Một lớp model, đóng vai trò sử lý, thao tác với cơ sở dữ liệu
-Công việc của ta là cần tạo Gui, tức là tạo jframe.
3.3. Tạo jframe.java
->Hoàn toàn như ví dụ trước, trong ví dụ này Jframe ta tạo ra, cũng chỉ bao gồm
+Một trường, để nhập dữ liệu
+Một button có tên là them
Tiến hành kích chuột phải vào button them, chon event ActionPerformed
Một method được tạo ra, công việc của ta là cần code cho method đó.
Nội dung của method đó như sau
PHP:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    bean a=new bean();
    a.setUserName(txtUserName.getText()); //set gia tri cho bean.
    themsinhvien them=new themsinhvien();
        try {
            them.themdulieu(a);                                        
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        }
}
Nhận xét,
PHP:
 bean a=new bean();
Ta tiến hành tạo một con bean, con bean này sẽ chui vào cơ sở dữ liệu để thao tác
PHP:
    a.setUserName(txtUserName.getText()); //set gia tri cho bean
PHP:
 themsinhvien them=new themsinhvien();
// Tạo một đối tượng thuộc lớp model. Trong lớp themsinhvien, có chứa method thao tác với cơ sở dữ liệu
PHP:
 them.themdulieu(a);
. Tiến hành gọi method đó và truyền cho nó một con bean, tức là ta truyền một đối tượng. Đây là điểm khác so với cách làm thông thường của chúng ta.
Khi đó ở trong file themsinhvien.java ta để ý method themsinhvien

PHP:
    public int themdulieu(bean userName) throws ClassNotFoundException, SQLException
   {
       int result=-1;
       PreparedStatement pre=null;
       Connection con=null;
       connectdb a=new connectdb();
       con=a.getCon();
       pre=con.prepareStatement("insert into UserName(uname) values(?)");
       pre.setString(1, userName.getUserName());
       result=pre.executeUpdate();
       return result;
   }
Trong method trên ta nhận thấy, đầu vào của method, là một đối tượng thuộc kiểu bean. Tức là khi nhận ở đây là nhận đối tượng.
PHP:
       pre=con.prepareStatement("insert into UserName(uname) values(?)");
       pre.setString(1, userName.getUserName());
Đồng thời ta nhận thấy, khi ta muốn lấy giá trị userName, ta bắt buộc phải sử dụng getter.
Tóm lại:
--Cũng như cách 2, cách 3 tuân theo mô hình: MVC, đồng thời nó chuẩn hơn cách 2 là tuân theo mô hình huớng đối tượng chuẩn.
Đặc điểm của cách này, là ta cần tạo các entity, là mapping của các bảng trong cơ sở dữ liệu.
Chúc các bạn vui vẻ
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Các phong cách lập trình

Phần cuối: Tiếp tục loạt bài về các phong cách lập trình
Bước 1:Tiến hành tạo thủ tục
Bật SQL server 2005, tiến hành thực thi câu lệnh sau
PHP:
use opp
go
create proc thutuc
@uname nvarchar (50)
as
insert into UserName values (@uname)
go
Ví dụ này có nhiều điểm giống ví dụ 3. Do đó các bạn tham khảo thêm ví dụ 3
http://congdongjava.com/showthread.php?t=475
Bước 1:Tạo một project là opp
Bước 2: Tạo một packeag là cach4
Bước 3: Tạo class connectdb.java
PHP:
package connect;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class connectdb {
    private Connection con;
    public Connection getCon() {
        return con;
    }
    public void setCon(Connection con) {
        this.con = con;
    }
    public connectdb() throws ClassNotFoundException
    {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        try {
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1552;databaseName=opp", "sa", "123456");
            System.out.println("Connect thanh cong");
        } catch (SQLException ex) {
            Logger.getLogger(connectdb.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
Bước 4: Tạo con bean là mapping từ cơ sở dữ liệu

PHP:
package connect;
public class bean {
    private String userName;
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    public bean()
    {
        
    }
    public bean(String userName)
    {
        this.userName=userName;
    }
}
Bước 5: Tạo một Jframe, cũng như ví dụ trước, nó gồm một textfield và một button
Nội dung của Jframe như sau
PHP:
package connect;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Jframe extends javax.swing.JFrame {
    public Jframe() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    bean a=new bean();
    a.setUserName(txtUserName.getText()); //set gia tri cho bean.
    themsinhvien them=new themsinhvien();
        try {
            them.themdulieu(a);                                        
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        }
}
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jframe().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField txtUserName;
    // End of variables declaration
Điều quan trọng nhất cần chú ý, đó là sự kiện
PHP:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    bean a=new bean();
    a.setUserName(txtUserName.getText()); //set gia tri cho bean.
    themsinhvien them=new themsinhvien();
        try {
            them.themdulieu(a);                                        
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Jframe.class.getName()).log(Level.SEVERE, null, ex);
Trong sự kiện này nó sẽ gọi đến một lớp model đóng vai trò là sử lý, đó là lớp themsinhvien
Bước 6: Tiến hành tạo lớp sử lý, thêm sinh viên
PHP:
package cach4;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
public class themsinhvien {
   public int themdulieu(bean userName) throws ClassNotFoundException, SQLException
   {
       int result=-1;
       Connection con=null;
       CallableStatement cal;
       connectdb a=new connectdb();
       con=a.getCon();
       cal=con.prepareCall("{call thutuc(?)}");
       cal.setString("uname", userName.getUserName());
       result=cal.executeUpdate();
       return result;
   }
}
Thay vì như cách làm bình thường như các cách 1,2,3.Chúng ta thường viét câu lệnh sql rồi gửi lên server sử lý.
Thì cách này, ta chỉ cần gọi một thủ tục, và truyền vào đó cái getUserName. Việc sử dụng thủ tục, đảm bảo khi truyền câu lệnh nhanh gọn. Mặt khác đảm bảo về vấn đề bảo mật.
Tóm lại:
Cách số 3 đã đảm bảo về việc lập trình theo mô hình hướng đối tượng chuẩn, tuy nhiên trong thực tế chúng ta thường sử dụng các thủ tục để lập trình. Vì vậy cách thứ 4 này sẽ giải quyết vấn đề trên.

Nhận xét: Từ cách số 1->Cách số 4 thì việc viết code của ta càng ngày càng nhiều. Nhưng thực tế, khi chúng ta làm một project, thì việc viết code nhiều sẽ đi theo chiều ngược lại. Tức là cách 4 viết ít nhất, và cách số 1 viết nhiều nhất.
Ngày nay, với việc sử dụng Annonation trong java, thì cách số 4 có thể cải tiến để đạt hiệu quả cao hơn. Tức là sẽ có cách số 5.

SourceCode của tất cả các cách trên
http://www.mediafire.com/?ozb2nuynmge
 

hung04501

New Member
6/4/10
8
0
0
Ðề: Các phong cách lập trình

Rất hay!!Thanks bạn.Hy vọng còn học hỏi ở bạn nhiều nữa...
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Các phong cách lập trình

còn 1 phong cách nữa là cóp dán :)) , bài bạn hay lắm,thanks