1. Trang chủ
  2. » Công Nghệ Thông Tin

Kinh nghiệm áp dụng Object Oriented trong lập trình Java docx

12 400 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 12
Dung lượng 147 KB

Nội dung

Kinh nghiệm áp dụng Object Oriented lập trình Java Tác giả muốn phổ biến kinh nghiệm thân việc áp dụng Object Oriented (OO) với lập trình sử dụng Java Vấn đề đặt là:“làm dựa phân tích yêu cầu ứng dụng, để tạo lớp (class) hay object cần thiết ?” Hai danh từ class object dùng để chung khái niệm viết “Sử dụng nguyên tắc OO việc phân tích, giúp cho bạn tìm class object cần thiết cách có hệ thống Giúp bạn làm quen hiểu OO mục đích viết này.” “ Đầu tiên nên tìm hiểu OO hình thành hồn cảnh việc lập trình“ Trở thời gian trước OO hình thành, ngơn ngữ C, Pascal dựa function procedure Toàn ứng dụng chuỗi function procedure, gọi program chấm dứt Ví dụ : Yêu cầu ứng dụng tìm kiếm kiện thí sinh đưa vào số báo danh, cách phân tích là: Tạo function để nhập số báo danh Tạo function để truy tìm kiện dựa kiện nhập Tao function để display kết tìm Cách suy nghĩ hay phân tích gọi procedural, gồm nhiều kiện xảy nối tiếp Cái ưu điểm cách phân tích intuitive (trực quan) Nó dễ hiểu gần gũi với suy luận tự nhiên người Chỉ cần khéo léo chia vấn đề thành operation nhỏ để giải Mọi chuyện giải dễ dàng với cách phân tích Lấy ví dụ khác phức tạp “Bạn yêu cầu viết ứng dụng simulate hoat động xe đạp Làm để chia nhỏ thành function hay procedure ?” Tất nhiên khó Vấn đề trở nên khó nói đến hệ thống phức tạp xe gắn máy, máy bay… v.v Nếu bạn nhìn hoạt động xe đạp theo khía cạnh khí máy móc hịan tồn đơn giản dễ hiểu Nó gồm có pedal gắn liền với đĩa, dây xích, líp, bánh xe Nó cỗ máy khí tạo thành nhiều phận khí nhỏ đơn giản Nếu bạn có hể lập trình giống vậy, cách lắp ráp nhiều phận nhỏ đơn giản lại với nhau, toán trở nên đơn giản hơn, OO suy nghĩ • Đọc tới bạn đặt câu hỏi: “chẳng phải phương pháp procedural chia toán thành function nhỏ hay ? Như OO có khác biệt ?” Tất nhiên có Function hay procedure khái niệm trừu tượng dùng để mô tả hoạt động vật cụ thể thực tế, OO cho phép tạo object dựa hay bắt chước theo vật cụ thể Do object OO “cụ thể hố hơn” “dễ hiểu hơn” Bạn chưa tin vào khái niệm OO ! Khơng hết, nhìn vào hoạt động xe đạp kỹ lưỡng Đĩa quay kéo dây xích, dây xích lại kéo lip Khái niệm OO đưa đến object sau: đĩa, dây xích, lip Nhưng làm bắt chước hoạt động chúng ? Sự tiếp xúc truyền động thực tế, mô phần mềm cách: object gọi method object khác Nhìn vào ví dụ class DayXich { // method mơ tả kéo dây xích public void keo(){ } } class Dia { // method mô tả quay đĩa public void xoay(DayXich dx) { // đĩa truyền động cho dây xích cách // gọi method keo() dx.keo(); } } Method xoay() Đĩa gọi method keo() DayXich Bản thân method xoay() bị gọi method đó, tạo thành hoạt động cổ máy Trong OO, object A gọi method object B, gọi cách văn vẻ “A send a message to B”, thực tế đơn giản mô cách thức phận tiếp xúc hay truyền động để làm việc với Như khái niệm OO đưa phần mềm phản ánh gần gủi trung thực hoạt động thực tế Người lập trình giống kỹ sư khí, thiết kế, chế tạo lắp ráp phận cho cỗ máy lớn Cách suy nghĩ theo OO đòi hỏi người lập trình phải nhìn ứng dụng giống cỗ máy vận hành, tìm hiểu hoạt động phận, làm cho chúng làm việc với Điều quan trọng cần phải nhấn mạnh lần nữa: Trước tìm class hay object cần thiết cho ứng dụng, bạn cố gắng hình dung tồn ứng dụng hoạt động giống hệ thống gồm nhiều chi tiết, phận nhỏ hoạt động ăn khớp với Đến bạn biết OO đời Cũng giống Newton phát sức hút trái đất, OO đời quan sát mô theo làm việc hệ thống có sẵn Mục đích tìm object cần thiết cho ứng dụng Trong giới phần mềm object ứng dụng loại: Control, Boundary, Entity Nếu bạn chưa hiểu rõ ý nghĩa chúng ? Cũng khơng Thơng thường khơng phải lúc dễ dàng xác định loại object Xác định object thuộc loại nào, yếu tố quan trọng việc tìm kiếm object cần thiết cho ứng dụng Thu hẹp cho ứng dụng web hay Swing người ta đưa khái niệm MVC = Model-View-Controller Như ta so sánh sau: • Control = Controller • Boundary = View • Entity = Model Thơng thường ứng dụng làm công việc sau: Nhập xuất kiện (input/output) Thay đổi hay kết hợp kiện (manipulate data) Lưu trữ hay truy cập kiện (save or retrieve data from database) Công việc thứ thường đưa đến object thuộc loại View, công việc thường đưa đến object thuộc loại Model Bạn nơn nóng đặt câu hỏi:Như Controller cần ? Câu trả lời ứng dụng phải có Controller object Khơng có chúng ứng dụng nằm i` mà khơng chạy Điều làm rõ bạn đọc View hay Boundary object ứng dụng tìm kiếm kiện thí sinh object mà người sử dụng nhìn thấy Có thể JTextField để nhập kiện, JTable để kết truy tìm Giả sử có ứng dụng A B chạy độc lập ứng dụng A cần kiện tạo từ B, View object A object dùng để liên hệ với B để nhận kiện, View object B object xuất kiện cho A cho ứng dụng khác Model hay Entity object thường object chứa kiện Object loại chứa logic hay thuật toán thay đổi hay kết hợp kiện mà chứa, việc đưa vào hay lấy từ database Nói cách đại khái, object 'knows how to do' Trong ứng dụng truy tìm thí sinh, TableModel dùng để chứa data cho JTable Control hay Controller object object 'knows what to next' Bạn biết Java method phải nằm class Class chứa method main() ví dụ Control hay Controller Chúng thường class có method chứa logic sau: if(){ //call some method }else { //call some other method } Khơng có method ứng dụng khơng chạy Bản thân method (hay class chứa nó) chứa đựng algorithm hay logic ứng dụng Đến bạn quen thuộc với khái niệm object phần mềm ứng dụng Bạn liên hệ diện chúng với vật cụ thể ngồi thực tế Bạn phân loại biết mục đích cần có object hay object khác cho ứng dụng Chúng ta sẵn sàng cho bước kế tiếp: “tìm kiếm object cần thiết cho ứng dụng” Trở lại ví dụ mơ hình xe đạp, class như: Dia, DayXich, Lip thuộc loại nào? Bạn biết cần phải có class để mơ theo phận thực xe đạp, khó biết thuộc loại Phần mềm ngày phức tạp phân loại object ngày khó Tuy nhiên, việc xác định loại class hay object khơng phải “kim nam” việc tìm kiếm đầy đủ object cho ứng dụng Chúng ta khơng nên tìm kiếm object dựa mục đích như: Phải bắt đầu tìm kiếm tất object thuộc loại View, Model, hay Controller cho ứng dụng Sau nắm vững yêu cầu ứng dụng, bạn liên hệ hoạt động ứng dụng với cỗ máy hay hệ thống gồm nhiều phận rời rạc hoạt động với nhau, giống mơ hình hoạt động xe đạp trên, nơi mà bạn object cần thiết Sự cần thiết cần có object khơng phải dựa câu hỏi: “nó thuộc loại object ? mà phải dựa “nó làm ?” Có nghĩa mơ hình xe đạp cần phải có class DayXich để mơ dây xích xe đạp Xác định thân class DayXich thuộc loại không quan trọng lắm, cần thiết để truyền tương tác Dia Lip Việc hình dung hoạt động toàn ứng dụng cỗ máy lúc dễ dàng Và thực tế phần mềm dựa theo hệ thống cụ thể có sẵn Trong trường hợp này, nguyên tắc “chia để trị” áp dụng “Chia để trị” chia toàn hoạt động ứng dụng thành nhiều chức nhỏ Mọi chức hoạt động theo nguyên tắc hộp đen (a blackbox), chúng hoạt động độc lập với tốt Mọi blackbox nhận kiện xuất kiện tùy theo chức chúng Dữ kiện xuất blackbox kiện nhập blackbox khác Mỗi blackbox có chức đơn giản nhiều so với tồn ứng dụng, nhờ bạn dễ dàng tìm object cần thiết cho hoạt đơng blackbox Bạn có biết nguyên tắc việc chế tạo thiết bị điện tử Lấy ví dụ computer, bạn tháo rời phận CD drive, hard drive phận ln có điểm tiếp xúc dây nối để nối với phận khác Cần nhớ blackbox ứng dụng phần mềm chứa hay nhiều object, blackbox ranh giới trừu tượng dùng để chia nhỏ vấn đề Trở lại ví dụ tìm kiếm thí sinh dựa vào số báo danh Chúng ta chia vấn đề thành blackbox: blackbox (BB1) dùng để nhận kiện trình bày kết quả; blackbox (BB2) dùng để truy tìm kiện BB1 chứa JTextField để nhập kiện JTable để trình bày kết BB2 chứa JButton “Truy Tìm”, SearchAction liên hệ với JButton thực việc truy tìm Điểm tiếp xúc hay dây nối blackbox thể phần mềm method class hay object * Đối với BB1 , method getText() JTextField dùng điểm để xuất kiện (là số báo danh thí sinh trường hợp này); cần thêm điểm để nhận kết tìm Phân tích đến đây, tạo thêm class ResultTableModel với method addResult() cho BB1 để làm điểm nhận kết ResultTableModel tạo TableModel cho JTable Chúng ta tìm class cho BB1 gồm có: JTextField, JTable, ResultTableModel * Đối với BB2 gồm có class: JButton SearchAction BB2 nối với BB1 cách gọi method JTextField.getText() ResultTableModel.addResult() thông qua Action.actionPerformed() sau: SearchAction(JTextField jtf,ResultTableModel tm) extends { public void actionPerformd(ActionEvent a) { String sbd = jtf.getText(); //nhận số báo danh, truy tìm từ database tm.addResult(ketquatimđược); //kết tìm } } Đến bạn nên thấy cách suy nghĩ phân tích vấn đề sử dụng OO quen thuộc gần gủi với suy nghĩ giới xung quanh người Sản phẩm OO object với method phản ánh làm việc tương tác với object khác Nó dễ hiểu dễ truyền đạt function procedure cách suy nghĩ procedural Đi xa nữa, tính chất có OO inheritance, encapsulation, polymorphism làm cho ứng dụng trở nên linh hoạt dễ bảo trì Trình bày chi tiết tính chất nằm viết khác Sau điểm cần lưu ý cho người lập trình theo phương pháp OO người quen thuộc với cách suy nghĩ procedural: Sai lầm cho Java OO ngơn ngữ, cần sử dụng Java thành thạo bạn tự nhiên biết OO Không hiểu OO tính chất hình thành cách áp dụng đắn Mỗi class tìm phân tích xem blackbox nhỏ Khi viết mã nguồn cho class bạn nên tự đặt thân vào địa vị class Nghĩa bạn quan tâm tới việc biến đổi kiện nhập thành kiện xuất phạm vi class Không quan tâm đến việc kiện nhập từ đâu tới người sử dụng kiện xuất Nó giống phận xe đạp tạo nhiều người khác nhau, lắp ráp với dễ dàng Đây đặc điểm quan trọng để phân biệt người lập trình theo phương pháp OO với người theo phương pháp procedural Đến bạn nắm vững thêm tính chất OO: inheritance, encapsulation, polymorphism bạn tự tin vào kỹ OO Action Một ngày đẹp trời nọ, sếp bạn tự nhiên giao cho bạn viết chương trình thay cho Notepad Windows Lý đơn giản ko thích dùng Windows thứ hai muốn thử thách trình độ bạn Việc bạn nghĩ tới tạo GUI cho chương trình hệ thống menu, muốn chơi trội Windows bạn định thêm vào toolbar Bạn bắt tay vào tạo menu bar JMenuBar menuBar = new JMenuBar(); JMenu file = new JMenu(“File”); JMenuItem item = new JMenuItem(“New”); item.addActionListener(aMenuListener); file.add(item); item = new JMenuItem(“Open”); item.addActionListener(aMenuListener); file.add(item); item = new JMenuItem(“Save”); item.addActionListener(aMenuListener); file.add(item); item = new JMenuItem(“Exit”); item.addActionListener(aMenuListener); file.addSeparator(); file.add(item); // Bạn thêm vào menu bar vài menu Edit, Format, View, Help cuối bạn gọi phương thức setJMenuBar(menuBar) Vậy bạn có hệ thống menu cho Bước tạo toolbar: JToolBar toolBar = new JToolBar(); JButton b = new JButton(“New”); b.addActionListener(aButtonListener); toolbar.add(b); b = new JButton(“Open”); b.addActionListener(aButtonListener); toolbar.add(b); // getContentPane().add(toolbar, BorderLayout.NORTH); Sau có hệ thống menu hồn chỉnh toolbar vừa ý, bạn phát chẳng có khác action New menu file button New toolbar, bạn lại tạo hai lớp khác để lắng nghe kiện New Bạn định tạo lớp implements ActionListener interface cho menu item button toolbar, xem bạn làm phương thức actionPerformed(): public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if(obj instanceof JMenuItem) { JMenuItem item = (JMenuItem)obj; String name = item.getText(); if(“New”.equals(name)) { // } // } else if(obj instanceof JButton) { JButton b = (JButton)obj; String bName = b.getText(); if(“New”.equals(bName)) { // } // } } Từ hệ thống menu bạn cảm thấy chống khối lượng câu lệnh if else Liệu có giải pháp tốt khơng? Tơi nói với bạn bạn khơng sử dụng interface Action có sẵn Java nhỉ? Action Interface Action interface kế thừa từ ActionListener interface, điều có nghĩa bạn implements interface bạn phải định nghĩa phương thức actionPerformed() số phương thức khác Phương thức add() JToolBar, JMenu, JPopupMenu nhận vào tham số đối tượng implements Action interface, action add vào container container tự động tạo component tương ứng, ví dụ: bạn add action JMenu JMenuItem tạo ra, add vào JToolBar JButton tạo Và lúc action trở thành ActionListener cho component Khi bạn click chọn menu item, hay click chọn button phương thức actionPerformed() gọi Trong Action định nghĩa sẵn số số: - NAME : tên Action - SHORT_DESCRIPTION, LONG_DESCRIPTION: tooltip - SMALL_ICON: icon - MNEMONIC_KEY: phím đại diện - ACCELERATOR_KEY: phím tăng tốc - ACTION_COMMAND_KEY: chuỗi đại diện cho Action - DEFAULT Ngồi ra, Action cịn có thuộc tính kiểu boolean để bạn enable hay disable action Khi bạn muốn set thuộc tính cho Action bạn dùng phương thức putValue(String key, Object obj); key số trên, Hashtable dùng để lưu giữ giá trị Ví dụ bạn muốn add icon: putValue(Action.SMALL_ICON, new ImageIcon( )); bạn muốn add tooltip: putValue(Action.SHORT_DESCRIPTION, “Tooltip”); Ngược lại, bạn dùng phương thức: getValue(String key); để lấy giá trị tương ứng với số Phương thức trả Object, bạn phải ép kiểu để có giá trị mong muốn • AbstractAction AbstractAction lớp implements Action interface định nghĩa sẵn cho bạn hầu hết phương Action interface Bạn cần kế thừa lớp định nghĩa lại phương thức actionPerformed() Vậy đủ rồi, áp dụng Actibạn đặt tên Trong lớp này, tạo thêm inner claon để xây dựng GUI cho chương trình Tơi gọi chương trình NotepadForBoss, ss - FileAction - EditAction - HelpAction package org.mountain.abstractaction; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.KeyStroke; public class NotepadForBoss extends JFrame { private JMenuBar private JToolBar private JTextArea private JMenu private FileAction menuBar; toolBar; display; fileMenu, editMenu, helpMenu; newAction, openAction, saveAction, exitAction; private EditAction copyAction, cutAction, pasteAction; private HelpAction contentsAction, aboutAction; // // This action for File menu class FileAction extends AbstractAction { private String name; private Icon icon; public FileAction(String name) { super(name); // this.name = name; // this.putValue(AbstractAction.NAME, name); // this.putValue(AbstractAction.SHORT_DESCRIPTION, name); } public FileAction(String name, Icon icon) { super(name, icon); // this(name); // this.icon = icon; // if(icon != null) { // putValue(AbstractAction.SMALL_ICON, icon); // } } public FileAction(String name, Icon icon, KeyStroke key) { this(name, icon); putValue(AbstractAction.ACCELERATOR_KEY, key); } public void actionPerformed(ActionEvent e) { display.setText("FileAction - You just pressed: " + (String)getValue(AbstractAction.NAME)); } } // This action for Edit menu class EditAction extends AbstractAction { private String name; private Icon icon; public EditAction(String name) { this.name = name; this.putValue(AbstractAction.NAME, name); } public EditAction(String name, Icon icon) { this(name); this.icon = icon; if(icon != null) { putValue(AbstractAction.SMALL_ICON, icon); } } public EditAction(String name, Icon icon, KeyStroke key) { this(name, icon); putValue(AbstractAction.ACCELERATOR_KEY, key); } public void actionPerformed(ActionEvent e) { display.setText("EditAction - You just pressed: " + (String)getValue(AbstractAction.NAME)); } } // This action for Help menu class HelpAction extends AbstractAction { private String name; private Icon icon; public HelpAction(String name) { this.name = name; this.putValue(AbstractAction.NAME, name); } public HelpAction(String name, Icon icon) { this(name); this.icon = icon; if(icon != null) { putValue(AbstractAction.SMALL_ICON, icon); } } public HelpAction(String name, Icon icon, KeyStroke key) { this(name, icon); putValue(AbstractAction.ACCELERATOR_KEY, key); } public void actionPerformed(ActionEvent e) { String name = (String)getValue(AbstractAction.NAME); if("About".equalsIgnoreCase(name)) { JOptionPane.showMessageDialog(null, "Hello!"); } else { display.setText("HelpAction - You just pressed: " + (String)getValue(AbstractAction.NAME)); } } } } Giờ đến lúc ta tạo menu bar toolbar từ lớp package org.mountain.abstractaction; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.KeyStroke; public class NotepadForBoss extends JFrame { private JMenuBar private JToolBar private JTextArea private JMenu private FileAction menuBar; toolBar; display; fileMenu, editMenu, helpMenu; newAction, openAction, saveAction, exitAction; private EditAction copyAction, cutAction, pasteAction; private HelpAction contentsAction, aboutAction; public NotepadForBoss() { super("Abstract Action Example v1.0"); setDefaultCloseOperation(EXIT_ON_CLOSE); menuBar = new JMenuBar(); toolBar = new JToolBar(); fileMenu = new JMenu("File"); newAction = new FileAction("New", new ImageIcon("new.gif"), KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK)); fileMenu.add(newAction); openAction = new FileAction("Open", new ImageIcon("open.gif"), KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK)); fileMenu.add(openAction); saveAction = new FileAction("Save", new ImageIcon("save.gif"), KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK)); fileMenu.add(saveAction); exitAction = new FileAction("Exit"); fileMenu.addSeparator(); fileMenu.add(exitAction); editMenu = new JMenu("Edit"); copyAction = new EditAction("Copy", new ImageIcon("copy.gif")); editMenu.add(copyAction); cutAction = new EditAction("Cut", new ImageIcon("cut.gif")); editMenu.add(cutAction); pasteAction = new EditAction("Paste", new ImageIcon("paste.gif")); editMenu.add(pasteAction); helpMenu = new JMenu("Help"); contentsAction = new HelpAction("Contents"); helpMenu.add(contentsAction); aboutAction = new HelpAction("About", new ImageIcon("palette_select.gif")); helpMenu.addSeparator(); helpMenu.add(aboutAction); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(helpMenu); toolBar.add(newAction); toolBar.add(openAction); toolBar.add(saveAction); toolBar.addSeparator(); toolBar.add(copyAction); toolBar.add(cutAction); toolBar.add(pasteAction); // toolBar.addSeparator(); // toolBar.addSeparator(); // toolBar.add(aboutAction); setJMenuBar(menuBar); add(toolBar, BorderLayout.NORTH); display = new JTextArea(); JScrollPane pane = new JScrollPane(display); getContentPane().add(pane, BorderLayout.CENTER); setSize(400, 300); } // This action for File menu class FileAction extends AbstractAction { // } // This action for Edit menu class EditAction extends AbstractAction { // } // This action for Help menu class HelpAction extends AbstractAction { // } public static void main(String[] args) { JFrame f = new NotepadForBoss(); f.setVisible(true); } } Trong lớp Action tạo constructor Thứ tạo action với tên: FileAction(String name); Thứ 2: tên cộng với icon FileAction(String name, Icon icon); Thứ 3: ta thêm vào tham số phím (tổ hợp phím) tăng tốc FileAction(String name, Icon icon, KeyStroke keyStroke); Khi bạn chọn menu item hay click vào button, chương trình đơn giản in tên action Đây GUI mà tạo được: Action thực hữu dụng bạn làm việc với JMenu, JToolBar, JPopupMenu Rõ ràng bạn không cần phải làm công việc nhàm chán, tạo menu item, add cho ActionListener, add vào menu Bạn cần add action vào menu Có điều ứng dụng chưa hồn chỉnh cho lắm, thiếu vài menu Tôi để công việc lại cho bạn ... kiện tạo từ B, View object A object dùng để liên hệ với B để nhận kiện, View object B object xuất kiện cho A cho ứng dụng khác Model hay Entity object thường object chứa kiện Object loại chứa logic... hay Boundary object ứng dụng tìm kiếm kiện thí sinh object mà người sử dụng nhìn thấy Có thể JTextField để nhập kiện, JTable để kết truy tìm Giả sử có ứng dụng A B chạy độc lập ứng dụng A cần kiện... import java. awt.BorderLayout; import java. awt.event.ActionEvent; import java. awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame;

Ngày đăng: 02/08/2014, 18:21

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w