Mô hình hóa thực thể dữ liệu

Một phần của tài liệu Nghiên cứu và ứng dụng VDM++ cho mô hình hóa và kiểm thử hệ thống IMP tại NTTDATA việt nam (Trang 54)

3.1.1. Mô hình hóa kiểu dữ liệu SQL

Đây là giai đoạn đặc tả hình thức, sử dụng các kiểu dữ liệu trừu tượng trong VDM. Vì vậy, việc đầu tiên là định nghĩa các kiểu dữ trong SQL bằng các kiểu dữ liệu tương ứng trong VDM. Định nghĩa chi tiết về các kiểu dự liệu này xem tại [3,6].

Bảng 3. 1. Kiểu dữ liệu SQL và kiểu dữ liệu VDM tương ứng

SQL VDM

CHARACTER(n) VARCHAR(n)

String = seq of char;

BOOLEAN bool DECIMAL(p,s) NUMERIC(p,s) FLOAT(p) REAL FLOAT Number = real; SMALLINT INTEGER BIGINT Integer = int;

DATE Date = token;

Kiểu dữ liệu SQL và kiểu dữ liệu VDM tương ứng xem tại [3,6] trừu tượng trong VDM. Vì vậy, việc đầu tiên là định nghĩa các kiểu dữ trong SQL bằng các kiểu dữ liệu tương ứng trong VDM. Định nghĩa như sau:

Hình 3. 1. Mô hình hóa kiểu dữ liệu SQL server

3.1.2. Mô hình hóa cấu trúc bảng

Cấu trúc của một bảng được đặc tả bằng tên và kiểu dữ liệu của từng cột [3,7]. Cấu trúc bảng được mô hình hóa như một class trong VDM++. Tên của class sẽ là tên của bảng cơ sở dữ liệu cùng với chuỗi _Entity. Các trường dữ liệu của bảng dữ liệu quan hệ sẽ được khai báo tương ứng với các thuộc tính của lớp, được khai báo trong khối instance variables cùng với kiểu dữ liệu đã được định nghĩa trong bảng trên.

Bảng ScheduleAnnual được định nghĩa để lưu trữ các thông tin chung của một kế hoạch kiểm tra hàng năm theo từng giai đoạn (một năm thường chia làm 2 giai đoạn: 6 tháng đầu năm, 6 tháng cuối năm). Sử dụng đặc tả Inv để kiểm tra các rằng buộc Not Null của trường dữ liệu. Hàm checkPrimaryKey được định nghĩa để kiểm tra tính duy nhất của khóa chính. Bảng này có khóa chính là ANNUAL_REQUEST_NO.

class CommonType

types

public String = seqofchar; -- char, varchar, text

public Number = real; -- numberic, real, float, decimal

public Integer = int; -- smallint, bigint, int

public Date = token; -- datetime

public Time = token; -- datetime

Hình 3. 2. Mô hình hóa cấu trúc dữ liệu bảng Imp_Schedule_Annual

class ScheduleAnnual_Entity

types

instance variables

public annualRequestNo:CommonType`String; -- not null

public annualStageNo:CommonType`String; -- not null

public year:CommonType`String; -- not null

public maintenanceType:CommonType`String; -- not null

public workflowId:CommonType`String;

public workflowDescription:CommonType`String;

public approvedStatus:CommonType`String; (adsbygoogle = window.adsbygoogle || []).push({});

public approvedDate:CommonType`Date;

public createdDate:CommonType`Date; -- not null

public createdBy:CommonType`String; -- not null

public updatedDate:CommonType`Date; public updatedBy:CommonType`String; public functionId:CommonType`String; public clientIp:CommonType`String; --Check constraints

inv annualRequestNo <>""and year <>""and maintenanceType <>""

and createdBy <>""and createdDate <>mk_token("");

operations

--Check primary key

public checkPrimaryKey : CommonType`String*setof ScheduleAnnual_Entity ==> bool

checkPrimaryKey (aRN, sLs) == (

return notexists row in set sLs & aRN = row.annualRequestNo

);

Hình 3. 3. Mô hình hóa cấu trúc dữ liệu bảng Imp_Schedule_Annual_Pln_Detail Bảng ScheduleAnnualPlnDetail được định nghĩa để lưu trữ thông tin chi tiết kế hoạch năm. Mỗi một hạng mục được lập kế hoạch kiểm tra theo tháng. Bảng này có khóa chính là cặp ANNUAL_REQUEST_NO và ITEM_NO.

3.1.3. Mô hình hóa bảng dữ liệu

Một bảng dữ liệu quan hệ lưu trữ dữ liệu một tập hợp các hàng không theo thứ tự, mỗi hàng là tuần tự các kiểu dữ liệu giống nhau [3,8]. Một bảng dữ liệu có thể được mô hình hóa trong VDM++ như là một tập hợp các class.

Hình 3. 4. Mô hình hóa bảng Imp_Schedule_Annual và Imp_Schedule_Annual_Pln_Detail

class ScheduleAnnualPlnDetail_Entity

types

instance variables

public annualRequestNo:CommonType`String; -- not null

public year:CommonType`String; -- not null

public itemCode:CommonType`String; -- not null

public inspectStatus:CommonType`String; public month01:CommonType`String; public month02:CommonType`String; public month03:CommonType`String; public month04:CommonType`String; public month05:CommonType`String; public month06:CommonType`String; public month07:CommonType`String; public month08:CommonType`String; public month09:CommonType`String; public month10:CommonType`String; public month11:CommonType`String; public month12:CommonType`String; --Check constraints

inv annualRequestNo <>""and year <>""and itemCode <>"";

operations

--Check primary key

public checkPrimaryKey : CommonType`String*CommonType`String

*setof ScheduleAnnualPlnDetail_Entity ==> bool

checkPrimaryKey (aRN, itemN, sLs) == (

return notexists row in set sLs (adsbygoogle = window.adsbygoogle || []).push({});

& aRN = row.annualRequestNo and itemN = row.itemCode );

end ScheduleAnnualPlnDetail_Entity

instance variables

--SCHEDULE_ANNUAL_TBL

public ScheduleAnnual_Table: setof ScheduleAnnual_Entity;

--SCHEDULE_ANNUAL_PLN_DETAIL_TBL

3.1.4. Mô hình hóa cơ sở dữ liệu

Một cơ sở dữ liệu quan hệ có thể được đặc tả bằng một class, bằng việc tập hợp tất cả các khai báo bảng quan hệ trong một class. Bên cạnh đó, các đặc tả khóa chính, khóa ngoại và rằng buộc dữ liệu cũng có thể được thực hiện bằng việc các đặt biểu thức kiểm tra Inv (Invariants).

Hình 3. 5. Mô hình hóa cơ sở dữ liệu Imp

3.2. Mô hình hóa đặc tả hệ thống 3.2.1. Đặc tả kiến trúc 3.2.1. Đặc tả kiến trúc

Lược đồ quan hệ giữa các lớp được thiết kế bằng công cụ Modelio. Sau khi thiết kế xong, các lớp ở mức trừu tượng và mối liên hệ giữa chúng thì bước tiếp theo là đặc tả các lớp này trong VDM++. Dựa vào kiến trúc của Framework sẽ định nghĩa các lớp liên quan. Các lớp ở các tầng controller và model sẽ phải được thừa kế từ các lớp nền tảng (basic…). Các lớp basic này sẽ định nghĩa và cài đặt các thuộc tính và phương thức dùng chung. Lược đồ lớp được thể hiện như sau:

class impdb

types

instance variables

--SCHEDULE_ANNUAL_TBL

public ScheduleAnnual_Table: setof ScheduleAnnual_Entity;

--SCHEDULE_ANNUAL_PLN_DETAIL_TBL

public ScheduleAnnualPlnDetail_Table: setof ScheduleAnnualPlnDetail_Entity;

--SCHEDULE_ANNUAL_ACT_DETAIL_TBL

public ScheduleAnnualActDetail_Table: setof ScheduleAnnualActDetail_Entity;

--SCHEDULE_MONTHLY_TBL

public ScheduleMonthly_Table: setof ScheduleMonthly_Entity;

--SCHEDULE_MONTHLY_DETAIL_TBL

public ScheduleMonthlyDetail_Table: setof ScheduleMonthlyDetail_Entity;

--INSPECTION_CHECKLIST_TBL

public InspectionChecklist_Table: setof InspectionChecklist_Entity;

--INSPECTION_APPROVAL_TBL

public InspectionApproval_Table: setof InspectionApproval_Entity;

--INSPECTION_APPROVAL_DETAIL_TBL

public InspectionApprovalDetail_Table: setof InspectionApprovalDetail_Entity; (adsbygoogle = window.adsbygoogle || []).push({});

--INSPECTION_DEFECT_TBL

public DefectDetail_Table: setof DefectDetail_Entity;

--MST_ITEM_TBL

public MstItem_Table: setof MstItem_Entity;

--MST_LOCATION_TBL

public MstLocation_Table: setof MstLocation_Entity;

--WORKING_CALENDAR_TBL

public WorkingCalendar_Table: setof WorkingCalendar_Entity;

Hình 3. 6. Lược đồ lớp trừu tượng trong Modelio

3.2.2. Đặc tả nghiệp vụ

Dựa vào tài liệu đặc tả màn hình, rằng buộc dữ liệu và yêu cầu nghiệp vụ (Business rule) bước tiếp theo là thực hiện thiết kế luồng xử lý nghiệp vụ cho từng sự kiện (Event). Tài liệu thiết kế lược đồ activity như sau:

DB

Front End Back End

Processing Design Online Design Document Processing

(flow)

System name IMP system

Business ID/Business name B02 Monthly Schedule

Function ID/Function name F_B02_02 処理ID/処理名 S_B02_02 Create 作成者 作成日 更新者 更新日 TungNX TungNX 13/11/2014 Information Type: Group Restricted

Company: NTT DATA Corporation Information Owner: Research and Development Headquarters

Get request Monthly Schedule Create

<<EXIT_STATUS>> [Screen] A99_06

$monthlyRequestNo = generate ID <<COM00001>>

<<EXPECTED>> Pass value: $monthlyRequestNo $annualRequestNo $year = Current year $monthStage $maintenanceType = Constants.CORRECTIVE_MAINTENACE_TYPE $itemCode = $arItemCode[$i] $locationLevel1 = $arLocationLevel1[$i] $resourceAmount = $arResourceAmount[$i] $duration = $arDuration[$i] $plnStartDate = $arPlnStartDate[$i] $plnStartEnd = $arPlnStartEnd[$i] $percentComplete = $arPercentComplete[$i] $inspectStatus = Constants.INS_PLANNING_STATUS $updatedBy = current user loged in $functionId $clientIp Return

<<EXPECTED>>

Return ~MsgID M.INF.F_COMMON.003 {Monthly Schedule}

Pass value SQL 3.0: Insert monthly schedule detail

<<EXPECTED>> $annualRequestNo $year $maintenanceType $monthStage $arItemCode[] $arLocationLevel1[] $arResourceAmount[] $arDuration[] $arPlnStartDate[] $arPlnStartEnd[] $arActStartDate[] $arActEndDate[] End $arLocationLevel1[] Begin $arLocationLevel1[] [Return 10] Return <<EXIT_STATUS>> [Screen] S_B02_02 <<EXPECTED>>

MsgID M.ERR.F_COMMON.028 [Monthly Schedule] Input Check [$scheduleObj != Null]

[$scheduleObj == Null]

Pass value Begin arLocationLevel1[] SQL 9.0: Get list location level 2 (adsbygoogle = window.adsbygoogle || []).push({});

<<EXPECTED>> Pass value: $year=current year $locationLevel1=arItemLocation[i].[LOCATION_NO] Get value <<EXPECTED>> Get value: $arLocationLevel2[] Add warning [$arLocationLevel2.length = 0] <<EXPECTED>>

Add ~MsgID M.ERR.F_COMMON.xxx ({0} must have location level 2)

End arLocationLevel1[] [$arLocationLevel2.length > 0]

Error? Warning message [Y]

<<EXIT_STATUS>> [Screen] S_B02_02

<<EXPECTED>> Return error message

Pass value <<EXPECTED>> Pass value: $year $monthStage $maintenanceType = Constants.CORRECTIVE_MAINTENACE_TYPE

$status = Constants.DB_TRUE_FLAG SQL 8.0: Get list related location level 1 (distinct) Get value

Get value: $arLocationLevel1[]

[N] Click “Confirm”

Hình 3. 7. Lược đồ luồng nghiệp vụ xử lý tạo mới kế hoạch

Khi người dùng click vào nút “Xác nhận” yêu cầu được chuyển tới lớp xử lý event tương ứng. Dữ liệu người dùng được kiểm tra đảm bảo các rằng buộc cơ sở dữ liệu (khóa chính, bắt buộc phải nhập, độ dài, …). Hệ thống chỉ cho phép tạo kế hoạch khi đã các hạng mục được cài đặt mức kiểm tra ở mức hai, vì vậy, luồng nghiệp vụ sẽ kiểm tra sự tồn tại của vị trí cấp 2. Nếu dữ liệu đúng đắn theo yêu cầu nghiệp vụ sẽ được lưu vào cơ sở dữ liệu và hiển thị thông báo tạo kế hoạch thành công, kết thúc luồng nghiệp vụ.

Để đảm bảo tính đúng đắn của tài liệu phân tích, cần tránh những sai sót của tài liệu thiết kế VDM++ được sử dụng để đặc tả tài liệu thiết kế. Việc thực hiện mô hình hóa trong VDM++ cũng tương tự như việc cài đặt trong các ngôn ngữ bậc cao Java. Tuy nhiên, kiểu dữ liệu ở mức trừu tượng và không tập trung nhiều vào các xử lý cơ sở dữ liệu.

Hình 3. 8. Mô hình hóa lớp trừu tượng ScheduleAnnualModel

class ScheduleAnnualModel

operations

public getLastAnnualRequest : () ==> ScheduleAnnual_Entity

getLastAnnualRequest() == issubclassresponsibility;

public getItemsByStatus : CommonType`String ==> setof ScheduleAnnual_Entity

getItemsByStatus(sStatus) == issubclassresponsibility;

public getItemsByYear : CommonType`String ==> setof ScheduleAnnual_Entity

getItemsByYear(sYear) == issubclassresponsibility;

Hình 3. 9. Mô hình hóa lớp cài đặt ScheduleAnnualModelImpl

Lớp này cài đặt toàn bộ các xử lý liên quan đến bảng cơ sở dữ liệu Imp_Schedule_Annual. Gồm các thao tác thêm mới, sửa, xóa và một số kiểm tra ràng buộc (khóa chính, tính duy nhất, trường bắt buộc,…).

class ScheduleAnnualModelImpl is subclass of ScheduleAnnualModel

instance variables

impDB: impdb;

operations

public ScheduleAnnualModelImpl: impdb ==> ScheduleAnnualModelImpl

ScheduleAnnualModelImpl(db) == setDB(db); (adsbygoogle = window.adsbygoogle || []).push({});

public setDB: impdb ==> ()

setDB (db) == ( impDB:= db ); --Check primary key

public checkPrimaryKey : ScheduleAnnual_Entity ==> bool

checkPrimaryKey (obj) == (

return not checkExisting(obj)

);

--Check existing

public checkExisting : ScheduleAnnual_Entity ==> bool

checkExisting (obj) == (

returnexists row in set impDB.ScheduleAnnual_Table

& obj.annualRequestNo = row.annualRequestNo );

public getAllScheduleAnnuals : () ==> setof ScheduleAnnual_Entity

getAllScheduleAnnuals() == (

return impDB.ScheduleAnnual_Table

);

public findByKey : CommonType`String ==> ScheduleAnnual_Entity

findByKey(sKey) == (

return (iota sAnnual in set impDB.ScheduleAnnual_Table &

sAnnual.annualRequestNo = sKey)

);

public insert : ScheduleAnnual_Entity ==> CommonType`String

insert(obj) == (

impDB.ScheduleAnnual_Table := impDB.ScheduleAnnual_Table union {obj};

return obj.annualRequestNo

)

prenotexists row in set impDB.ScheduleAnnual_Table

& obj.annualRequestNo = row.annualRequestNo;

public update : ScheduleAnnual_Entity ==> CommonType`String

update(obj) == (

dcl sAnnualTemp : ScheduleAnnual_Entity; (adsbygoogle = window.adsbygoogle || []).push({});

sAnnualTemp := findByKey (obj.annualRequestNo);

impDB.ScheduleAnnual_Table := (impDB.ScheduleAnnual_Table \ {sAnnualTemp}) union

{obj};

return obj.annualRequestNo

)

preexists row in set impDB.ScheduleAnnual_Table

& obj.annualRequestNo = row.annualRequestNo;

public getLastAnnualRequest : () ==> ScheduleAnnual_Entity

getLastAnnualRequest() == (

dcl lastRow:ScheduleAnnual_Entity;

for all tmp in set impDB.ScheduleAnnual_Table do (

lastRow := tmp;

);

return lastRow;

)

precard impDB.ScheduleAnnual_Table >= 1;

public getItemsByStatus : CommonType`String ==> setof ScheduleAnnual_Entity

Mô hình hóa tầng controller (xử lý yêu cầu người dùng)

Hình 3. 10. Mô hình hóa lớp xử lý yêu cầu B0102ServiceController

3.3. Kiểm thử mô hình hóa

Để tự động hóa quá trình kiểm thử, VDM-10 cho phép viết các trường hợp muốn kiểm thử sau từ khóa “trace”. Các trường hợp test sẽ thực hiện tuần tự theo thứ tự khai báo [1,159].

class B0102ServiceController

instance variables

db: impdb := new impdb();

modelSA: ScheduleAnnualModelImpl := new ScheduleAnnualModelImpl(db);

operations

public B0102ServiceController: () ==> B0102ServiceController

B0102ServiceController() == ( db := new impdb();

modelSA := new ScheduleAnnualModelImpl(db); ); (adsbygoogle = window.adsbygoogle || []).push({});

public checkConstraints : () ==> bool

checkConstraints() ==

isnotyetspecified;

public confirm : () ==> bool

confirm() ==

isnotyetspecified;

public generate : () ==> bool

generate() ==

isnotyetspecified;

public getEvent : () ==> bool

getEvent() ==

isnotyetspecified;

public getForm : () ==> bool

getForm() ==

isnotyetspecified;

Hình 3. 11. Cài đặt unit test thiết kế lớp ScheduleAnnualModelImpl

class B0102Test

instance variables

db: impdb := new impdb();

modelSA: ScheduleAnnualModelImpl := new ScheduleAnnualModelImpl(db); objSA: ScheduleAnnual_Entity:= new ScheduleAnnual_Entity();

objSAForUpdate: ScheduleAnnual_Entity:= new ScheduleAnnual_Entity();

objSA1: ScheduleAnnual_Entity:= new ScheduleAnnual_Entity(); objSA2: ScheduleAnnual_Entity:= new ScheduleAnnual_Entity();

operations

public B0102Test: () ==> B0102Test

B0102Test() == (

objSA:= new ScheduleAnnual_Entity("AS20150712-001","ST001","2015","01","201500000001"

,"Nothing","05",mk_token("2015-07-12"),mk_token("2015-07-12"),"Tungnx", mk_token("2015-07- 12") , "HienAb","B0102-Schedule Annual","192.168.1.12");

objSAForUpdate:= new ScheduleAnnual_Entity("AS20150712- 001","ST002","2015","02","201500000001"

,"Nothing","05",mk_token("2015-07-12"),mk_token("2015-07-12"),"Tungnx",mk_token("2015-07-12") ,"HienAb","B0102-Schedule Annual","192.168.1.13"); (adsbygoogle = window.adsbygoogle || []).push({});

objSA1:= new ScheduleAnnual_Entity("AS20150712-101","ST002","2015","02","201500000001"

,"Nothing","05",mk_token("2015-07-12"),mk_token("2015-07-12"),"Tungnx",mk_token("2015-07-12") ,"HienAb","B0102-Schedule Annual","192.168.1.13");

objSA2:= new ScheduleAnnual_Entity("AS20150712-102","ST002","2015","02","201500000001"

,"Nothing","05",mk_token("2015-07-12"),mk_token("2015-07-12"),"Tungnx",mk_token("2015-07-12") traces case0001: modelSA.insert(objSA); modelSA.findByKey(objSA.annualRequestNo); modelSA.checkExisting(objSAForUpdate); modelSA.update(objSAForUpdate); modelSA.findByKey(objSA.annualRequestNo); case0002: modelSA.insert(objSA1); modelSA.insert(objSA2); modelSA.getLastAnnualRequest(); modelSA.getItemsByYear("2014"); modelSA.getAllScheduleAnnuals(); modelSA.delete("AS20150712-101"); modelSA.getAllScheduleAnnuals(); modelSA.getLastAnnualRequest(); case0003: modelSA.insert(objSA1); modelSA.insert(objSA10); modelSA.insert(objSA11); end B0102Test

Hình 3. 12. Màn hình kiểm thử và kết quả kiểm thử lớp ScheduleAnnualModelImpl

3.4. Kết quả thực nghiệm

Áp dụng quy trình mới với sự kết hợp mô hình hóa bằng VMD++ trong giai đoạn thiết kế chi tiết (Detail Design), giúp đảm bảo chất lượng tài liệu thiết kế. Những lợi ích đạt được sau khi áp dụng mô hình mới như sau:

 Phát hiện các vấn đề về thiết kế, xử lý hệ thống, thậm chí các giải pháp đã đề xuất với khách hàng.

 Phát hiện các thuật toán thực thi không hiệu quả đối với các xử lý đồng bộ của nghiệp vụ phê duyệt.

 Phát hiện các lỗi nghiêm trọng có thể xảy ra trong thiết kế, đưa ra được giải pháp xử lý sớm.

 Đảm bảo đồng nhất về thiết kế các hàm, biến dùng chung, ngôn ngữ.

 Loại bỏ các thiết kế không thống nhất về tên trường dữ liệu, kiểu dữ liệu, độ dài dữ liệu của tài liệu ERD.

 Giảm thời gian, công sức làm lại ở các giai đoạn sau: viết mã, kiểm thử tích hợp, kiểm thử hệ thống.

Tuy nhiên, áp dụng quy trình mới có một số điểm lưu ý như sau:

 Bổ sung công việc đào tạo vào kế hoạch dự án và ước tính thời gian đảm bảo SA hiểu và áp dụng được VDM++ trước khi đi vào mô hình hệ thống.

 Trao đổi để SA hiểu rõ lợi ích khi sử dụng VDM++ vào trong quy trình phát triển, tránh việc làm việc cho có.

Kết quả đạt được lớn nhất của việc áp dụng quy trình mới đó là trách nhiệm của SA tăng lên, sự tương tác giữa những SA tăng lên làm cho chất lượng tài liệu thiết kế tăng lên, giúp tiết kiệm rất nhiều chi phí, công sức do phải làm lại trong giai đoạn lập trình. Phát hiện các vấn đề của bài toán ở ngay giai đoạn thiết kế, đưa ra được giải pháp xử lý tổng thể.

Hình 3. 13. Timeline của dự án trước và sau khi áp dụng quy trình mới Bảng 3. 2. Tổng hợp lỗi tài liệu thiết kế

Loại lỗi Số lỗi phát hiện

được Chi tiết

Lỗi thiết kế cơ sở dữ liệu 30

Những lỗi liên quan đến việc thiết kế cơ sở dữ liệu ERD, như khai báo tên trường dữ liệu, khóa ngoại, kiểu dữ liệu, độ dài.

Lỗi đặc tả kiểm tra dữ

liệu người dùng 90

Những lỗi thiết kế liên quan đến việc kiểm tra dữ liệu người dùng, rằng buộc dữ liệu giữa các chức năng.

Lỗi thiết kế online

proccessing 110

Những lỗi liên quan đến thiết kế luồng xử lý dữ liệu online processing (Activity diagram).

Sai yêu cầu khách hàng 10 (adsbygoogle = window.adsbygoogle || []).push({});

Những lỗi liên quan đến thay đổi yêu cầu do đưa giải pháp sai trong giai đoạn lấy yêu cầu người dùng (Requirement Definition).

Lỗi kiến trúc 10

Những lỗi thiết kế không theo framework, do đó không thể cài đặt được trong giai đoạn lập trình.

Hình 3. 144. Lỗi có độ ưu tiên cao phát hiện khi thực hiện Modelling Test

Hình 3. 166. Lỗi có độ ưu tiên thấp phát hiện khi thực hiện Modelling Test

3.5. Kinh nghiệm thực tiễn

Việc áp dụng VDM++ vào việc đảm bảo chất lượng tài liệu thiết kế trong giai đoạn đầu của dự án có tính khả thi với những dự án có quy mô như đề cập trong bảng 3.3. Đối với những dự án tại NTT DATA Việt Nam thì việc áp dụng đề xuất này là hoàn khả thi bởi những yếu tố sau:

 Giai đoạn đầu được thực hiện bởi người phân tích thiết kế hệ thống. Những người ở vị trí này có kinh nghiệm về lập trình và kinh nghiệp phân tích nghiệp vụ vậy nên việc tiếp cận VMD++ là nhanh và tốn ít thời gian

 Chất lượng phần mềm và sự hài lòng của khách hàng là ưu tiên hàng đầu của các dự án. Vậy nên đảm bảo chất lượng tài liệu thiết kế, đáp ứng đúng yêu cầu khách hàng được công ty ưu tiên và khuyến khích thực hiện

 VDM++ là phương pháp phát triển Vienna hướng đối tượng, sử dụng công cụ overture trên nền tảng eclipse và ngôn ngữ Java phù hợp với các ngôn ngữ và tool phát triển phần mềm công ty đang sử dụng, rất dễ phối hợp trong quá trình phát triển dự án giữa giai phân tích và giai đoạn viết mã chương trình.

Bảng 3. 3. Phạm vi và quy mô dự án

Loại Điều kiện

Thời gian Trung bình (> 6 tháng) Tổng thời gian fulltime > 20 man/month Số lượng nhân sự > 9 người

Một phần của tài liệu Nghiên cứu và ứng dụng VDM++ cho mô hình hóa và kiểm thử hệ thống IMP tại NTTDATA việt nam (Trang 54)