Mã nguồn Maude minh họa mẫu thiết kế Visitor Pattern:

Một phần của tài liệu Áp dụng ngôn ngữ lập trình maude việc phát triển phần mềm cho hệ thống nhúng và thời gian thực (Trang 112 - 119)

Với yêu cầu của luận văn, sử dụng ngôn ngữ Maude trong việc hiện thực hóa Visitor Pattern thông qua việc cài đặt các lớp thay vì các Interface như trong Java (Maude hỗ trợ đa thừa kế). Về cơ bản tôi sẽ thiết kế các lớp (Object Module) như sau: Có hai lớp cơ bản Element và Visitor. Có các lớp phục vụ mục đích tạo các đối tượng Car, Body, Engine và Wheel. Lớp PrintVisitor sẽ kế thừa lớp Visitor và thực hiện cài đặt phương thức visit tương thích với từng đối tượng Car, Body, Engine, Wheel. Việc xây dựng được tôi mô tả cụ thể thông qua mã nguồn đi kèm.

---File Visitor.maude (omod VISITOR is protecting QID . subsort Qid < Oid . class Visitor . msg visit : Oid -> Msg . endom) ---File Element.maude (omod ELEMENT is protecting QID . subsort Qid < Oid . class Element . msg accept : Oid -> Msg . endom) ---File Wheel.maude (omod WHEEL is including ELEMENT . including VISITOR . protecting QID . protecting STRING . subsort Qid < Oid .

class Wheel | name : String , status : String . subclass Wheel < Element .

vars A P : Oid . vars N M : String .

rl [accept] :

accept(A)

< A : Wheel | name : N , status : M >

=> < A : Wheel | name : N , status : "Visitting Wheel" > visit(A) . endom) ---File Engine.maude (omod ENGINE is including ELEMENT . including VISITOR . protecting QID . protecting STRING . subsort Qid < Oid .

class Engine | status : String . subclass Engine < Element . var N : String .

vars E P : Oid . rl [accept] :

accept(E)

< E : Engine | status : N >

=> < E : Engine | status : "Visitting Engine" > visit(E) . endom) ---File Body.maude (omod BODY is including ELEMENT . including VISITOR . protecting QID . protecting STRING . subsort Qid < Oid .

class Body | status : String . subclass Body < Element . var A : Oid .

rl [accept] :

accept(A)

< A : Body | status : N >

=> < A : Body | status : "Visitting Body" > visit(A) . endom) ---Car.maude (omod CAR is including ELEMENT . including VISITOR . protecting QID . protecting STRING . subsort Qid < Oid .

class Car | engine : Oid , body : Oid , wheel : Oid , status : String . subclass Car < Element .

vars E B W C P : Oid . var N : String .

rl [accept] :

accept(C)

< C : Car | engine : E , body : B , wheel : W , status : N > => < C : Car | engine : E , body : B , wheel : W , status : "Visitting Car" >

visit(C) accept(W) accept(B) accept(E) . endom) ---PrintVisitor.maude (omod PRINTVISITOR is including VISITOR . including BODY . including ENGINE . including WHEEL . including CAR . protecting QID . protecting STRING . protecting INT .

subsort Qid < Oid . class PrintVisitor .

subclass PrintVisitor < Visitor . vars N M : String .

vars B E P C W : Oid . rl [visit] :

visit(B)

< B : Body | status : N >

=> < B : Body | status : "Visitting Body" > . rl [visit] :

visit(E) (adsbygoogle = window.adsbygoogle || []).push({});

< E : Engine | status : N > =>

< E : Engine | status : "Visiting Engine " > . rl [visit] :

visit(W)

< W : Wheel | name : N , status : M >

=> < W : Wheel | name : N , status : "Visitting Wheel" > . rl [visit] :

visit(C)

< C : Car | engine : E , body : B , wheel : W , status : N > => < C : Car | engine : E , body : B , wheel : W , status : "Visiting Car" > . endom) ---Main.maude (omod MAIN is including ELEMENT . including CAR . including PRINTVISITOR . protecting QID . protecting STRING . subsort Qid < Oid .

class Main | name : String . msg main : Oid -> Msg .

vars C B E W : Oid . var N : String . rl [main] :

main(C)

< C : Car | engine : E , body : B , wheel : W , status : N > => < C : Car | engine : E , body : B , wheel : W , status : "Visitting Car" >

accept(C) . endom)

Khi chạy chương trình: Cho đến thời điểm này luận văn đã tiến hành giới thiệu qua về các khái niệm cơ bản và quan trọng nhất mà tôi sử dụng trong quá trình thực hiện: Một là sử dụng Full Maude làm công cụ viết chương trình. Thứ hai là cài đặt môi trường thực thi. Cuối cùng là dựa trên Visitor Pattern trong việc thiết kế, xây dựng ứng dụng. Project sẽ gồm các Object Module được lưu trong các file Visitor.maude, Element.maude, Car.maude, Body.maude, Wheel.maude, Engine.maude. Để chạy chương trình truớc tiên chúng ta cần khởi động Maude.

Khởi động Maude ./maude.linux full-maude.maude

Để thực thi các file .maude chúng ta cần phải thực hiên load các file có liên quan đến nhau .Trong project, thực thi load các file theo thứ tự sau .

load Visitor.maude load Element.maude load Body.maude

load Engine.maude load Wheel.maude load PrintVisitor.maude load Main.maude

Trong Maude cách chạy chương trinh hơi khác so với các ngôn ngữ khác. Chạy thông điệp accept cho đối tượng Wheel (sau khi load PrintVisitor.maude)

Maude> (rew < 'A-001 : Wheel | name : "Banh" , status : "Wheel" > accept('A-001) .)

->Kết quả

rewrites: 3116 in 12ms cpu (13ms real) (259666 rewrites/second) rewrite in PRINTVISITOR :

< 'A-001 : Wheel | name : "Banh",status : "Wheel" > accept('A-001) result Object :

< 'A-001 : Wheel | name : "Banh",status : "Visitting Wheel" > Chạy thông điệp accept cho đối tượng Body (sau khi load PrintVisitor.maude) Maude> (rew < 'A-001 : Body | status : "Body" > accept('A-001) .) -> Kết quả

rewrites: 2656 in 8ms cpu (5ms real) (331958 rewrites/second) rewrite in PRINTVISITOR :

< 'A-001 : Body | status : "Body" > accept('A-001) result Object :

< 'A-001 : Body | status : "Visitting Body" >

Chạy thông điệp accept cho đối tượng Engine (sau khi load PrintVisitor.maude) Maude> (rew < 'A-001 : Engine | status : "Engine" > accept('A-001) .) -> Kết quả

rewrites: 2656 in 4ms cpu (5ms real) (664000 rewrites/second) rewrite in PRINTVISITOR :

< 'A-001 : Engine | status : "Engine" > accept('A-001) result Object :

< 'A-001 : Engine | status : "Visiting Engine " > (adsbygoogle = window.adsbygoogle || []).push({});

Chạy thông điệp accept cho đối tượng Car (sau khi load PrintVisitor.maude)

Maude> (rew < 'A-001 : Engine | status : "Engine" > < 'A-002 : Body | status : "Body" > < 'A-003 : Wheel | name : "Banh" , status : "Wheel" > < 'A-004 : Car | engine : 'A-001 , body : 'A-002 , wheel : 'A-003 , status : "Car" > accept('A-004) .)

-> Kết quả

rewrites: 3514 in 12ms cpu (10ms real) (292808 rewrites/second) rewrite in PRINTVISITOR :

< 'A-001 : Engine | status : "Engine" > < 'A-002 : Body | status : "Body" > < 'A-003 : Wheel | name : "Banh",status : "Wheel" > < 'A-004 : Car | engine : 'A-001,body : 'A-002,wheel : 'A-003,status : "Car" > accept('A- 004)

result Configuration :

< 'A-001 : Engine | status : "Visiting Engine " > < 'A-002 : Body | status : "Visitting Body" > < 'A-003 : Wheel | name : "Banh",status : "Visitting Wheel" > < 'A-004 : Car | body : 'A-002,engine : 'A-001,status : "Visiting Car",wheel : 'A-003 >

Chạy thông điệp main cho toàn bộ chương trình .(sau khi load file Main.maude)

Maude> (rew < 'A-001 : Engine | status : "Engine" > < 'A-002 : Body | status : "Body" > < 'A-003 : Wheel | name : "Banh" , status : "Wheel" > < 'A-004 : Car | engine : 'A-001 , body : 'A-002 , wheel : 'A-003 , status : "Car" > main('A-004) .)

-> Kết quả

rewrites: 4285 in 16ms cpu (19ms real) (267795 rewrites/second) rewrite in MAIN :

< 'A-001 : Engine | status : "Engine" > < 'A-002 : Body | status : "Body" > < 'A-003 : Wheel | name : "Banh",status : "Wheel" > < 'A-004 : Car | engine : 'A-001,body : 'A-002,wheel : 'A-003,status : "Car" > main('A-004) result Configuration :

< 'A-001 : Engine | status : "Visiting Engine " > < 'A-002 : Body | status : "Visitting Body" > < 'A-003 : Wheel | name : "Banh",status : "Visitting Wheel" > < 'A-004 : Car | body : 'A-002,engine : 'A-001,status : "Visiting Car",wheel : 'A-003 >

Một phần của tài liệu Áp dụng ngôn ngữ lập trình maude việc phát triển phần mềm cho hệ thống nhúng và thời gian thực (Trang 112 - 119)