Giới thiệu

Một phần của tài liệu Phát triển phần mềm hướng đối tượng sử dụng UML (Trang 79)

6. Cấu trúc của luận văn

4.3.1.Giới thiệu

Khi phát sinh mã chương trình, Rose sử dụng cấu trúc gói trong cấu trúc thành phần (Component view) để tạo ra các danh mục thích ứng. Nếu không có cấu trúc thành phần. Rose sẽ sử dụng cấu trúc gói trong cấu trúc logic (Logical view) để tạo lập cấu trúc danh mục.

Có sáu bước cơ bản để phát sinh mã chương trình tự động bằng Rose, bao gồm: - Kiểm tra mô hình,

- Tạo lập thành phần,

- Thực hiện ánh xạ lớp vào thành phần, - Đặt thuộc tính phát sinh mã chương trình, - Chọn lớp thành phần hay gói,

- Phát sinh mã chương trình.

Bước I: Kiểm tra mô hình

Rose có chức năng kiểm tra mô hình độc lập ngôn ngữ để đảm bảo mô hình là phù hợp trước khi phát sinh mã chương trình. Chức năng này có thể tìm ra tính không thống nhất và lỗi trong mô hình, chúng ảnh hưởng đến sai sót trong mã chương trình.

Trình tự thực hiện như sau:

1. Chọn Tooỉs>Check Model

2. Lỗi mô hình sẽ được hiển thị trong cửa sổ Log.

Các lỗi hay xảy ra là thông điệp trong biểu đổ tương tác không được ánh xạ vào thao tác hay đối tượng trong biểu đổ tương tác khổng được ánh xạ vào lớp.

Bước 2: Tạo lập thành phần

Mục đích của tạo lập thành phần (Component) là để chứa các lớp. Có nhiều loại thành phần như các tệp mã nguồn, tệp thực hiện (exe), tệp thư viện động (dll),...Trước khi phát sinh mã chương trình ta phải ánh xạ các lớp vào thành phần chứa mã nguồn tương ứng. Một khi các thành phần đã được tạo lập, ta có thể gắn các phụ thuộc giữa chúng trong biểu đồ thành phần. Các phụ thuộc giữa các thành phần là phụ thuộc biên dịch trong hệ thống.

Để tạo lập thành phần ta làm như sau: 1. Mở Component diagram

2. Sử dụng biểu tượng Component trong thanh công cụ để bổ sung thành phần mới vào biểu đồ.

Bước 3: Ánh xạ lớp vào thành phần.

Mỗi thành phần mã nguồn biểu diễn tệp mã nguồn cho một hay vài lớp. Để ánh xạ lớp vào thành phần ta làm như sau:

1. Nhấn phím phải trên thành phần trong biểu đồ thành phần 2. Chọn Open Specification

3. Chọn bảng Realizes

4. Nhấn phím phải trên lớp thích ứng và chọn Assign

5. Brower sẽ chỉ ra thành phần trong dấu « » sau tên lớp trong Logical view.

Bước 4: Đặt các thuộc tính cho phát sinh mã chương trình

Có nhiều thuộc tính cho phát sinh mã nguồn có thể gán cho lớp, thuộc tính và các thành phần khác của mô hình. Các thuộc tính này điều khiển mã chương trình sẽ được phát sinh như thế nào. Trước khi phát sinh mã chương trình nên xem xét đặc tính phát sinh mã chương trình và thay đổi chúng nếu cần.

Để quan sát đặc tính phát sinh mã chương trình hãy chọn Tooỉ>Options, sau đó chọn bảng ngôn ngữ thích ứng.

O plions

G eneral | D iagram | Browser | N otation | Toolbars | D D L

Ja va | O racle8 ] C++ | MSVC | COM ) V isua l Basic

Tũpe: ỊSpH Set: I M odel properties ■ Q CJone Renjove I Name V alue Final False S ta tic False

G enerateD efaultC onsl True

Constructor! s public

GenerateFinalizer False

G e n e ratestalicln itia lizi False G eneratelnstancelniti< False I S ource 1 D efault D efault D efault D efault D efault D efault D efault Be vert

OK j C ancel -ppi, I Help

Hình 57: Đặt thuộc tính cho phát sinh m ã chương trình.

Từ cửa sổ T yp e có thể chọn các thành phần m ô hình như Class, Attribute, Operation,...M ỗi ngôn ngữ có thành phần m ô hình khác nhau và mọi thay đổi tại đây đều ảnh hưởng đến toàn bộ m ô hình.

Bước 5: Chọn lớp, thành phần hay gói

Khi phát sinh mã chương trình ta có thể phát sinh cho lớp, thành phần hay gói vào cùng thời điểm. Mã chương trình có thể phát sinh từ biểu đồ hay browser. Nếu phát sinh mã trình từ gói, thì có thể chọn gói Logical view trên biểu đồ lớp hay chọn gói Component view trên biểu đồ thành phần.

Bước 6: Phát sinh mã trình

Có thể lựa chọn một trong các ngôn ngữ để phát sinh mã như Java, Oracle8, C++, DDL,...Cách thực hiện như sau:

1. Chọn các ngôn ngữ trong Add-ỉns> Add-ỉn Manager 2. Các vừa được chọn sẽ hiển thị trong thực đơn Tools.

... ...I Name 1 Version - cO RBA 1.2 I lClearCase 1.1 0 DDL 2.1 I I Framewofk W Ĩ2âfd 2.1 0 J a v a 2.1 !✓ ! Ũfacle8 2.1 1 1 Repository 2.1 w \ Rose C++ 2.2 [✓ ] R ose M odel 1 ntegí aíor 1.1 í I Rose W e b Publisher 1 ,j2

|[ ỠK ìỊ Cancel I Apply

Hình 58: Chọn ngôn ngữ (m ã đích).

Khi chọn lớp hay thành phần trên biểu đổ, hãy chọn ngôn ngữ thích ứng trong thực đơn phát sinh mã chương trình.

<4* Rational Rose - chinh.mdl - (Component Diagram: Component View / Sytem]

Ấ 'j £ ile £ d it ỵievv Ffirmat £ ro w se R eport Q uery Tools A dd -In s W in d o w Help Create C h e ck M o d el D ổ y a ■t? 3El chinh SB C ] Use Case V s Cj L og ica l Viev 0 L J Component Cl Main €1 tuyel Cl; Sytem 3-J C j Lop T h u ±; C ] LopGia( ♦ L J L opD iei w « T a s k H7 « T a s k i±! Cl Deploym ent

(5ã M o d e l Prop« 1 L J Jj - A BC □ ÉO 7\ □ i □ s s ể j ắữ M ultiple ] selection J Hoc’pT M o d el Properties ► Options... r r O pe n S c rip L . N e w Scripl s ynchronise.. D D L hMũ W e b t e s t f f x e ’ 1 J a v a D 1 H I A T I . :

Project sp ecifica tio n... 0 ra c le 8 ► S yn ta x C h eck

B io m e J a v a S ource C++ ► R everse E ngineer Java... S- M odel Integrator G enerate J a v a

COM ► 1 ‘— I— 1 ■ 1 c V ersion ControJ ►

Visual Basic ► ■ Class W izard...

Hình 59: Chọn ngôn ngữ đ ể phát sinh m ã chương trình.

Nếu có lỗi xảy ra trong quá trình phát sinh mã chương trình, chúng được hiển thị trong cửa sổ Log.

Phần này thực hành tạo lập biểu đổ thành phần cho hệ thống quản lý thi trên mạng (lưu trong file chinh.mdl). Trong chương trước ta đã tìm ra các lớp cần thiết cho hệ thống quản lý thi trên mạng. Sau khi hoàn chỉnh phân tích, thiết kế ta có thể xây dựng biểu đổ thành phần chính tập trung vào các gói của thành phần được chỉ ra ở hình 49 - chương 3.

- Tạo lập các gói thành phần trong biểu đồ thành phần Main

I LliaU'JillJ’Jl'M-liii'i'liilI Ili-liiyỉHlẳ ĩ ĩ M B l H ỊHỊ lị

4.3.2. Phát sinh m ã chương trình cho hệ thông quản lý thi trên mạng

“3

LopThucThe

LopDieuKhien

LopGiaoDien

Hình 60: Biểu đồ thành phần của hệ thống quản lý thi trên mạng.

- Bổ sung thành phần cho các gói vào biểu đồ thành phần Main và vẽ các phụ thuộc

CauHoi HocPhan F o rm C N C a u H o i F o rm C N H o c Ể : r CauHoi T F o m iC N H o c P h HocPhan DKThi F o rm C N C a u H o i & D K D a n h M u c T g DKThi D K D a n h M u c s Hình 6 1 : Biểu đ ồ thành p h ầ n của c á c g ó i.

- Tạo biểu đồ thành phần System và cài đặt thành phần ở bước trên vào System. HocPhan HocPhan CauHoi FormCNCauHoiTUn > DKThi -7— ì : FormCNCauHoi T CauHoi I ~Ầ FT WebSerusrExe 7T~ DkDanhMuc I T DKThi r FormCNHocPhan /Ị DKDanhMuc FormCNHocPhan W ebtestE xe

Hình 62: Biểu đồ thành phần của Hệ thống quản lý thi trên mạng.

- Phát sinh mã chương trình Java được thực hiện như sau: + Mở biểu đồ System Component

+ Chọn toàn bộ đối tượng trong biểu đồ System Component

+ Chọn Tools>Java>Generate Java

Rotional Rose tự động phát sinh mã chương trình sang ngôn ngữ Java cho những thành phần đã chọn. Mã chương trình sẽ được lưu trong tệp chinh.doc. Mở tệp chinh.doc ta thấy những thông tin về lớp, giao diện, thuộc tính, quan hệ,... của các thành phần đã thiết kế được phát sinh dưới dạng mã.

4.4. Cài đặt chi tiết một sô chức năng cơ bản củahệ thống quản lý thi trên mạng //ChinhApp.java

import java.awt.*; import java.lang.*; import java.io.*;

public class ChinhApp extends Frame! TextArea textArea;

public static void main (String args []){

ChinhApp app = new ChinhAppO; }

public ChinhAppOl

super("HE THONG QUAN LY THI TREN MANG"); setupPanels(); pack(); resize(400,400); setBackground(Color.pink); show(); } void setupPanels(){

Panel mainPanel = new PanelO; Panel panels[][]=new Panel [3][3]; for(int i=0;i<3;++i){

for(int j=0;j<3;++j){

panels[j][i] = new Panel();

panels[j][i].setLayout(new FlowLayout(FlowLayout.LEFT)); }

}

panels[0][0].add(new Label("Dang nhap he thong")); panels[0][0].add(new MyTextFieldl("Nhap ten", 15)); panels[l][0].add(new Label("Dang nhap thi"));

panels[l][0].add(new MyTextFieldl("Thi sinh Nhap ten",15)); panels[2][0].ađd(new Label("Mat khau"));

panels [2] [0] .add(new MyTextFieldl("",10)); panels[2][0].add(new Label("Chon"));

String choiceString[]= {"Yes","No"};

panels[2][0].add(new MyChoice(choiceString,textArea)); panels[0][l].add(new ButtonC'Quan ly thong tin danh muc")); panels[0][l].add(new Button("Quan ly thi"));

panels[0][l].add(new ButtonC'Quan ly nguoi dung")); panels[0][2].add(new ButtonC'Thi"));

panels[0][2].add(new Button("Xem ket qua")); panels[0][2].add(new Button("Thoat"));

panels[l][2].add(new Label("Thay giao huong dan:TS.Doan Van Ban")); panels[2][2].add(new Label("Hoc vien thuc hien: Nguyen Thi Tuyet"));

for (int i=0;i<3;++i) for (int j=0;j<3;++j)

mainPanel.add(panels[j][i]); add("Center",mainPanel); }

public boolean handleEvent(Event event)!

if(event.id==Event.WINDOW_DESTROY){ System.exit(O);

return true; }

else if(event.id==Event. ACTION_EVENT) ( if(event.target instanceof Button) ị

if ("Thoat".equals (event.arg)){ System.exit(O);

return true;

else if ("Thi".equals (event.arg)){

ThisinhApp thi=new ThisinhAppO; thi.setupPanels(); return true; } } } return false; ! }

class MyTextFieldl extends TextField{

public MyTextFieldl (String text,int columns)) super( text,columns);

}

public boolean action (Event event,Object arg){ String text=getText();

setText(text.toUpperCase());return true; }

1

class MyChoice extends Choice} TextArea text;

public MyChoice (String strings[],TextArea textArea){ super();

try {

for(int i=0;i<strings.length;++i) addltem(strings[i]);

text=textArea;

} catch (NullPointerException ex){ System.exit(O);

}

public boolean action (Event event.Object arg){ text.setText((String)arg);

return true;

} )

class ThisinhApp extends Frame { public ThisinhApp(){ super("THI SINH"); setupPanels(); pack(); resize(400,300); setBackground(Color.blue); show(); ) void setupPanels(){

Panel mainPanel = new Panel(); setForeground(Color.red);

Panel panels[][]=new Panel [3][3]; for(int i=0;i<3;++i){

for(int j=0;j<3;++j) {

panels[j][i] = new Panel();

panels[j][i].setLayout(new FlowLayout(FlowLayout.LEFT));

1 }

panels[0][0].add(new Label("Phieu du thi")); panels[0][0].add(new MyTextField("",4)); panels[0][0].add(new Label("So bao danh")); panels[0][0].add(new MyTextField("",3)); panels[l][0].add(new Label("Ho ten"));

panelsf 1 ][0].add(new MyTextField("",8)); panels[l][0].add(new LabelC'Ngay sinh")); panels[l][0].add(new MyTextField("",5)); panels[0][l].add(new LabelC'Gioi tinh")); panels[0][ 1 ].add(new MyTextField("",2)); panels[0][l].add(new Label("Mon thi")); panels[0][l].add(new MyTextField("",5)); panels[l][l].add(new Label("Ky thi")); panels[l][l].add(new MyTextField("",5)); panels[2][0].add(new Label("Lop")); panels[2][0].add(new MyTextField("",5)); panels[l][l].add(new Label("Hoc phan")); panels[ 1 ][ 1 ].add(new MyTextField("",5));

panels[0][2].add(new Label("Don vi kien thuc")); panels[0][2].add(new MyTextField("",5));

panels[0][2].add(new Label("So hieu de")); panels[0][2].add(new MyTextField("",5)); panels[l][2].add(new Button("THI")); panels[l][2].add(new Button("Quit")); for (int i=0;i<3;++i)

for (int j=0;j<3;++j)

mainPanel.add(panels[j][i]); add("Center",mainPanel); I

public boolean handleEvent(Event event)!

if(event.id==Event.WINDOW_DESTROY){ disposeO;

return true; }

else if(event.id==Event. ACTION_EVENT) {

if(event.target instanceof Button) { if ("Quit".equals (event.arg)){

dispose(); return true;

Jelse if ("THI".equals(event.arg)){ ThiApp thil=new ThiAppO; thil.setup(); return true;} ) ) return false; 1 }

class MyTextField extends TextField{

public MyTextField (String text,int columns)) super( text,columns);

)

public boolean action (Event event,Object arg){ String text=getText();

setText(text.toUpperCase());return true; )

I

class ThiApp extends Frame { TextArea text; MenuBar menuBar; FileDialog openFile; FileDialog saveFile; public ThiAppO { super ("THI"); setup();

resize(text.minimumSize()); pack(); show(); } void setup() { setFont(new Font("system",Font.PLAIN, 12)); setBackground(Color. white);

text = new TextArea(25,80); add("Center",text);

setupMenuBar();

openFile = new FileDialog(this,"MO FILE XEM DIEM",FileDialog.LOAD); saveFile = new FileDialog(this,"GHI FILE NOP BAI",FileDialog.SAVE);

}

void setupMenuBar() { menuBar = new MenuBar();

Menu fileMenu = new Menu("File"); fileMenu.add(new MenuItem("New")); fileMenu.add(new MenuItem("Xem diem")); fileMenu.addSeparator();

fileMenu.add(new MenuItem("Nop bai")); fileMenu.addSeparator();

fileMenu.add(new MenuItem("Exit")); menuBar.add(fileMenu);

setMenuBar(menuBar); }

public boolean handleEvent (Event event){

if (event.id==Event.WINDOW_DESTROY) { dispose();

return true;

else if(event.id==Event.ACTION_EVENT) { if (event.target instanceof Menultem){

if ("New".equals(event.arg)){ text.setText("");

return true; I

else if ("Xem diem".equals(event.arg)){ openFile.show();

String inFile=openFile.getFile(); readFile(inFile);

return true; 1

else if("Nop bai".equals(event.arg)){ saveFile.show(); String outFile=saveFile.getFile(); writeFile(outFile); return true; I else if ("Exit".equals(event.arg)){ dispose(); return true; } } } return false; }

public void readFile(String file){ DatalnputStream inStream; try {

inStream=new DataInputStream(new FilelnputStream(file));

}catch(IOException ex){

notifyDialog("Error opening file"); return; } try { String newText=""; String line; while ((line=inStream.readLine())!=null) newText=newText+line+"\n"; text.setText(newText); inStream.close(); }catch(IOExeeption ex){

notifyDialog( "Error reading file"); }

)

public void writeFile (String file)} DataOutputStream outStream; try}

outStream=new DataOutputStream(new FileOutputStream(file)); }catch(IOException ex){

notifyDialog("Error opening file"); return; } try} outStream. writeBytes(text.getText()); outStream.close(); }catch(IOException ex)}

notifyDialog("Error writing file");

public void notifyDialog(String msg){

Notification notification =new Notification(this,msg); notification.show();}

class Notification extends Dialog! String msg;

public Notification(Frame f,String s){ super(f,"notification'\true); msg=s;}

public void show(){

add("North",new Label(msg,Label.CENTER)); Panel p=new Panel();

p.add(new Button("OK")); add("South",p);

setBackground(Color.gray); resize(160,100);

super.show();)

public boolean handeEvent(Event event) { if (event.id==Event.WINDOW_DESTROY) { System.exit(O);

return true;}

else if(event.id==Event.ACTION_EVENT) { if (event.target instanceof Button)}

if ("OK".equals(event.arg)){ dispose(); return true;} } ¡return true; 1

PH ẦN KẾT LUẬN

1. Những đóng góp của đề tài

UML và Rational Rose đã và đang phát triển vô cùng mạnh mẽ và khẳng định vai trò của nó trong công nghiệp phần mềm nói riêng và ngành công nghệ thông tin nói chung. Ngôn ngữ mô hình hoá thống nhất ƯML được tổ chức OMG (Object Management Group) công nhận là chuẩn công nghiệp và đã nhanh chóng trở thành công cụ phổ dụng và hữu hiệu cho phương pháp phân tích, thiết kế hệ thống hướng đối tượng.

Phương pháp phân tích, thiết kế hướng đối tượng sử dụng UML và Rational Rose được sử dụng rộng rãi tại các nước phát triển và bắt đầu được sử dụng tại một số đơn vị tin học ở Việt Nam. Để góp phần nghiên cứu vào lĩnh vực khá mới mẻ này, nhiệm vụ nghiên cứu của đề tài tập trung vào một số vấn đề sau:

- Tìm hiểu, nghiên cứu hai giai đoạn quan trọng của phát triển phần mềm đó là phân tích và thiết kế bằng phương pháp hướng đối tượng sử dụng UML làm ngôn ngữ mô hình hoá.

- Xây dựng một ứng dụng “ Hệ thống quản lý thi trên mạng” để minh hoạ một cách cụ thể các lý thuyết về phân tích và thiết kế hướng đối tượng đã đề cập.

- Phát sinh mã trình cho những phần thiết kế tốt trong Rose.

- Dựa trên những phân tích, thiết kế đã có ứng dụng để cài đặt một số giao diện chính cho chương trình “ Hệ thống quản lý thi trên mạng” bằng ngôn ngữ Java.

UML là ngôn ngữ mô hình hoá tương đối mới, phức tạp với hơn một trăm khá niệm và Java là ngôn ngữ lập trình hướng đối tượng thực sự, luận văn được viết trong một khoảng thời gian có hạn nên chỉ tiếp cận ở mức khiêm tốn. Do chưa có nhiều kinh nghiệm về phân tích và thiết kế trên các bài toán cụ thể, nên việc sử dụng UML để phân tích, thiết kế bài toán ứng dụng chắc chắn còn rất nhiều sai soát. Tuy nhiên, chúng tôi đã rất cố gắng trong việc áp dụng UML để phân tích, thiết kế hệ thống và dùng Java để cài đặt một số giao diện chính cho chương trình quản lý thi trên mạng. Những lý thuyết cơ bản về phát triển phần mềm hướng đối tượng sẽ giúp ích cho tôi rất nhiều trong quá trình làm công tác chuyên môn.

Tôi hy vọng rằng với những vấn đề lý thuyết mà luận văn đã trình bày có thể dùng làm tài liệu tham khảo về phương pháp phân tích, thiết kế hướng đối tượng. Phần mềm mà tôi xây dựng có thể phát triển hoàn chỉnh hơn đáp ứng yêu cầu bài toán đặt ra và tạo thành phần mềm hữu ích có thể ứng dụng được.

2. Hướng phát triển của đề tài

- Tạo sản phẩm phần mềm hoàn chỉnh đáp ứng yêu cầu bài toán đặt ra. - Mở rộng dự án ra các lĩnh vực khác và ra liên mạng .

- Thực hiện giao diện đẹp hơn và thân thiện hơn.

- Tạo phán giúp đỡ dễ sử dụng hơn và hướng dẫn cặn kẽ hơn.

TÀI LIỆ U T H A M KHẢO Tiếíng Việt

[1], Đoàn Văn Ban, Phân tích thiết k ế và lập trình hướng đối tượng, NXB Thống Kê, 1997. [2], Trần Tiến Dũng, Giáo trình lý thuyết và bài tập Java, NXB Giáo Dục, 1999. [3]. Thạch Thị Ngân, Nguyễn Thị Thanh Thuận, Phân tích thiết k ế hướng đối tượng

sử dụng UML, khoá luận tốt nghiệp Đại học, 2001.

[4], Đặng Văn Đức, Phân tích thiết k ế hướng đối tượng bằng UML, NXB Giáo Dục, 2002. [5]. Lê Minh Trí, JavaScript, tập 2, NXB Trẻ, 2002.

[6], VN-GUID (Hiệu đính Lê Phụng Long), Lập trình JAVA, NXB Thống Kê, 2000.

Tiêng Anh

[7|. Booch, G.,Rumbaugh, J., and Jacobson, I., The Unifiel Modelling Language user Guide, Addison-Wesley, 482 pp, 1999.

[8]. Boggs, w., and Boggs, w., Matering UML with Rational Rose, Sybex, 957pp, 1999.

[9]. Craig Larman, Applying UML and Patterns, Prentice Hall PTR, 507 pp, 1997. [10]|. Eriksson, H.E., UMLTooIkit, Wiley Computer, 397 pp, 1998.

[11]|. Jacobson, I., Booch, G., and Rumbaugh, J., The Unified Sofware Development Process, Addion - Wesley, 483 pp, 1999.

[12]|. Mughal, K.A., and Rasmussen, R.W., A.Programmer’s Guide to Java™ Certification, Addion - Wesley, 754 pp, 2000.

[13]!. Trainee’s Material, Internet and Java, First Edition, 124 pp, 1997.

[14]. Zhiming Liu, Object Oriented Software Development Using UML, The United Nations University ƯNU/IIST, 120 pp, March 2001.

Một phần của tài liệu Phát triển phần mềm hướng đối tượng sử dụng UML (Trang 79)