• Tidak ada hasil yang ditemukan

Tutorial ABS - RSE - Fasilkom UI

N/A
N/A
Protected

Academic year: 2024

Membagikan "Tutorial ABS - RSE - Fasilkom UI"

Copied!
19
0
0

Teks penuh

(1)

LABORATORIUM RELIABLE SOFTWARE ENGINEERING (RSE) FAKULTAS ILMU KOMPUTER UNIVERSITAS INDONESIA

Tutorial ABS

ABS Training 2017 @ UNSIKA

Sabtu, 25 November 2017

(2)

2

Daftar Isi

1. Instalasi ... 3

• Eclipse ... 3

• Eclipse Plugin – ABS Tool ... 3

2. Membuat Core ABS Module ... 4

• Membuat ABS Module pada Eclipse ... 4

• Core Module ... 5

3. Menjalankan ABS Module ... 11

4. Membuat Feature Model ... 12

5. Membuat Delta Module (Delta Modeling) ... 13

6. Product Configuration ... 16

7. Product Selection ... 16

8. Menjalankan Product di ABS ... 17

• Menjalankan Base/Core Product ... 17

• Menjalankan Varian Produk ... 18

(3)

3

1. Instalasi

Eclipse

Untuk pelatihan ini, IDE yang digunakan adalah Eclipse dan disarankan menggunakan Eclipse modeling tools versi Neon. Untuk mengunduhnya silahkan menuju link berikut:

http://www.eclipse.org/downloads/packages/eclipse-modeling-tools/oxygen1a Kemudian pilih versi yang sesuai dengan device Anda.

Eclipse Plugin – ABS Tool

Untuk menginstall plugin ABS di Eclipse, silahkan mengikuti langkah-langkah berikut:

Eclipse  Menu HelpInstall New Software  Pilih Add  Masukkan Alamat update site ABS Tool (http://docs.abs-models.org/update-site/)  Pilih 3 komponen pertama dari ABS untuk diinstal (seperti gambar di bawah ini)  Klik NextNextFinish

(4)

4

2. Membuat Core ABS Module

Membuat ABS Module pada Eclipse

Setelah melakukan instalasi plugin ABS pada Eclipse, kita dapat membuat ABS model dan menjalankan model tersebut.

Langkah-langkah:

1. Open Perspective ABS dengan membuka Menu WindowOpen Perspective  Pilih Other…  Klik ABS. Setelah itu akan muncul menu dari ABS plugin, yang terdiri dari Generate Maude Code, Execute Model (Maude), Generate Java Code, Debug Model (Java), dan Start SDEdit (Java).

2. Buat project ABS baru. Pilih menu NewOther ABSABS Project. Klik Next

Masukkan nama Project, misal AccountABS. Klik Finish

3. Buat modul ABS baru. Klik kanan pada project AccountABS, pilih menu NewABS Module (New File). Masukkan nama file, misal Account.abs. Klik Finish.

(5)

5

Core Module

Core ABS Module terdiri dari beberapa komponen, antara lain:

1. Module

Pembuatan Core ABS module dimulai dengan pembuatan nama module. Tambahkan kode berikut ke dalam file Account.abs.

Contoh:

Statement Import digunakan untuk menggunakan class-class yang didefinisikan di module lain sedangkan statement Export digunakan agar class-class pada modul tersebut dapat digunakan modul lain juga.

2. Interface

Interface di ABS mirip dengan interface di Java, memiliki nama dan dapat mengextend interface lainnya. Body dari interface terdiri dari deklarasi method dimana nama setiap method diawali dengan huruf kecil. Setiap kelas pada ABS harus memiliki satu interface Berikut adalah contoh interface pada ABS. Silakan tambahkan juga kode berikut kedalam Account.abs

3. Class

Class pada ABS harus mengimplementasi paling tidak satu interface. ABS tidak mengenal konsep class inheritance, konsep tersebut digantikan dengan konsep delta modeling. Class pada ABS tidak memiliki constructor tetapi class-nya memiliki parameter. Berikut adalah contoh dari impelementasi class pada ABS.

interface Account { Int getAid();

Int deposit(Int x);

Int withdraw(Int x);

}

module Account;

export *;

import Customer,CorpIndvCustomerImpl from CustomerIF;

(6)

6 Tambahkan kode diatas ke dalam Account.abs

4. Atribut

Berikut adalah beberapa tipe data yang dikenal oleh ABS : o Bool = True | False

Tipe data Boolean dengan nilai dapat berupa true atau false o Unit

Tipe data yang tidak mengembalikan nilai (mirip dengan void di Java) o Int

Tipe data integer berupa bilangan bulat o Rat

Tipe data rational berupa bilangan rasional o String

Sama dengan tipe data String yang umumnya dikenal di bahasa seperti Java o Fut<T>

Tipe data future, yang tidak bisa secara eksplisit dikonstruksi dan hasil dari pemanggilan metod secara asinkronus. Nilai dari future hanya dapat diperoleh dengan menggunakan ekspresi get.

o List<A> = Nil | Cons(A, List<A>)

Tipe data list dengan Nil menandakan list kosong 5. Method

Method pada ABS memiliki nama, parameter, dan return type.

Pemanggilan Method

Ada dua jenis pemanggilan method yang dikenal di ABS, synchronous atau asynchronous. Untuk pemanggilan method secara synchronous sama dengan pemanggilan method biasa di Java, yaitu namaObject.namaMethod. Contoh:

class AccountImpl(Int aid, Int balance, Customer owner) implements Account { // Core Product

Int getAid() { return aid; }

Int deposit(Int x) { balance = balance + x; return balance;}

Int withdraw(Int y) {

if (balance - y >= 0) { balance = balance - y;

}

return balance;

} }

Bool b = x.m(5);

(7)

7 Untuk pemanggilan method secara asynchronous dapat dilakukan dengan sintaks namaObject!namaMethod. Return type dari Method Asynchronous disimpan di variable dengan statement Fut. Contoh:

Untuk mendapatkan nilai dari sebuah future variable, dapat menggunakan sintaks get.

Task yang sedang berjalan diblok hingga nilai future dapat diperoleh. Sementara itu, tidak ada task lain dalam COG yang dapat dijalankan. Contoh:

Pada asynchronous method call, terdapat statement await untuk menunda task yang sedang berjalan hingga statements selanjutnya (guard) bernilai true. Task tidak ditunda jika guardnya telah bernilai true. Saat task sedang ditunda, task lain akan dikerjakan terlebih dahulu.

Main Method

Main Method ditandai dengan block yang diawali dan diakhiri dengan kurung kurawal ({}). Pada main method ini dapat dibuat object baru dengan statement New. Statement new membuat sebuah objek baru dari sebuah nama class dan argument. Objek di ABS dapat dibuat dengan dua cara. Cara pertama adalah menciptakan objek dalam COG yang sama yaitu menggunakan statement new dan menciptakan objek dalam COG yang berbeda yaitu menggunakan statement new cog.

Contoh:

{ Customer c = new local CorpIndvCustomerImpl(17);

Account a = new AccountImpl(1,1,c);

Fut<Int> dep = a!deposit(100);

Fut<Int> withd = a!withdraw(10);

await dep? & withd?;

Int deposit = dep.get;

Int withdraw = withd.get;

Int net = deposit+withdraw;

}

Fut<Bool> f = x!m(5);

Bool b = f.get;

Fut<Bool> f = x!m();

await f?;

await this.x == True;

await f? & this.y > 5;

(8)

8 Silakan tambahkan juga kode diatas ke dalam Account.abs

6. Comment

Jika Anda mengikuti langkah-langkah diatas dengan benar maka module Account.ABS akan terlihat seperti dibawah ini.

module Account;

export *;

import Customer,CorpIndvCustomerImpl from CustomerIF;

interface Account { Int getAid();

Int deposit(Int x);

Int withdraw(Int x);

}

class AccountImpl(Int aid, Int balance, Customer owner) implements Account { // Core Product

Int getAid() { return aid; }

Int deposit(Int x) { balance = balance + x; return balance;}

Int withdraw(Int y) {

if (balance - y >= 0) { balance = balance - y;

}

return balance;

} }

{

Customer c = new local CorpIndvCustomerImpl(17);

Account a = new AccountImpl(1,1,c);

Fut<Int> dep = a!deposit(100);

Fut<Int> withd = a!withdraw(10);

await dep? & withd?;

Int deposit = dep.get;

Int withdraw = withd.get;

Int net = deposit+withdraw;

}

// this is a comment

module A; // this is also a comment / *this

is a multiline comment* /

(9)

9 Lengkapi module Account.abs dengan module Customer.abs dan CustomerData.abs.

Silakan buat dua module tersebut kedalam project AccountABS. Sehingga Project Explorer AccountABS terlihat seperti gambar berikut.

(10)

10 Berikut adalah source code untuk module Customer.abs dan CustomerData.abs.

CustomerData.abs module CustomerIF;

export *;

import Level, createLevel from CustomerData;

interface Customer { Int getId();

Customer findCustomer(CustomerList cl);

}

interface IndvCustomer extends Customer { }

interface CorpCustomer extends Customer { Level getLevel();

}

type CustomerList = List<Customer>;

class CorpIndvCustomerImpl(Int id) implements IndvCustomer, CorpCustomer{

Level lv = createLevel();

Level getLevel() { return lv; } Int getId() { return id; }

Customer findCustomer(CustomerList cl) { Customer result;

Int i = 0;

while (i<length(cl)) {

Customer curCust = nth(cl,i);

Int curId = curCust.getId();

if (id==curId) {result = curCust;}

i = i + 1;

}

return result;

} }

{

Customer c = new local CorpIndvCustomerImpl(17);

Customer d = new local CorpIndvCustomerImpl(16);

Int n = c.getId();

CustomerList l = Cons(c,Cons(d,Nil));

Fut<Customer> e = c!findCustomer(l);

await e?;

Customer f = e.get;

}

(11)

11 CustomerData.abs

module CustomerData;

export Level, Customer, createCustomer, createLevel, getPid;

// export *;

data Level = Standard | Silver | Gold;

data Customer = Test | Person(Int pid, Level) | Company(Int taxId);

def Level createLevel() = Standard;

type CustomerList = List<Customer>;

def Int length(CustomerList list) = case list {

Nil => 0 ; // data constructor pattern Cons(n, ls) => 1 + length(ls) ;

// data constructor pattern with pattern variable _ => 0 ; // underscore pattern (anonymous variable)

} ;

def Int id(Customer c) = case c {

Person(pid,_) => pid;

Company(taxId) => taxId;

_ => 0;

} ;

def Int getPid(Customer c) = pid(c);

def Customer createCustomer(Int id, String kind) = case kind {

"p" => Person(id,Standard);

"c" => Company(id);

_ => Test;

} ;

3. Menjalankan ABS Module

Setelah membuat Core ABS module, module tersebut dapat dijalankan dengan langkah sebagai berikut:

1. Klik ikon Generate Java Code pada toolbar ABS Plugin. Setelah dijalankan akan muncul folder gen pada project AccountABS yang berisi hasil generated Java Code.

2. Klik ikon Debug Model (Java) pada toolbar ABS Plugin untuk melakukan debug dari hasil generated Java Code. Klik menjalankan eksekusi per step.

(12)

12 3. Untuk melihat visualisasi dari proses debug Java Model, dapat me-klik ikon Start SDEdit

(Java) pada toolbar ABS plugin.

Contoh sequence diagram yang dihasilkan adalah seperti di bawah ini.

4. Membuat Feature Model

Feature model dari Account dapat Anda lihat pada FeatureModel.abs. Adapun bentuk d iagramnya dapat dilihat pada gambar berikut.

(13)

13 Gambar lingkaran di atas persegi menandakan bahwa fitur tersebut optional. Sementara kotak yang diwarnai menandakan parameter dan batasan dari fitur. Untuk fitur Type, gambar menyatakan bahwa fitur yang dapat dipilih hanya satu yaitu Check atau Save.

Grup dari fitur dapat dibedakan menjadi inclusive (group allof) atau alternative (group oneof) .Dalam sebuah grup terdapa tcomma-separated list dari deklarasi fitur. Setiap deklarasi fitur dapat berupa optional (opt) dan memiliki batasan (ifin:), exclusions (exclude:) atau requires terhadap fitur lain (require:).

Representasi teks dari gambar tersebut dapat dilihat di bawah ini.

Manfaat utama dari feature model terasa saat mendefinisikan produk baru. Feature model akan mencegah terealisasikannya produk baru yang menyalahi feature model.

5. Membuat Delta Module (Delta Modeling)

Pada ABS, produk-produk baru dalam SPL direalisasikan dengan mengaplikasikan module delta pada core product. Delta pada ABS dapat menambah, menghapus atau memodifikasi class dan interface.

root Account { group allof {

Type {

Group oneof {

Check {ifin: Type.i == 0;},

Save {ifin: Type.i> 0; exclude: Overdraft;}

} Inti;

},

opt Fee {Int amount in [0..5];}, opt Overdraft

} }

(14)

14 Modifikasi yang diizinkan antara lain:

• Menambah dan menghapus field/variabel

• Menambah, menghapus dan memodifikasi method

• Menambah interface yang diimplementasi

Module Delta merupakan realisasi atau implementasi setiap fitur pada feature model.

o Modul delta untuk fitur Fee

Berikut adalah contoh modul delta untuk fitur Fee.

Pada contoh di atas terdapat method original. Method ini memanggil versi asli dari method yang dimodifikasi (dalam hal ini method deposit).

Silakan tulis kode delta diatas dan simpan pada berkas DFee.abs

o Modul delta untuk fitur Save

Untuk memodifikasi nilai dari field atau variabel, cara yang dapat dilakukan adalah menghapusnya terlebih dahulu lalu kemudian menambahkan kembali dengan nilai yang berbeda. Contohnya seperti pada delta DSave untuk fitur Save.

Silakan tulis kode delta diatas dan simpan pada berkas DSave.abs delta DFee (Int fee); // Implements feature Fee uses Account;

modifies class AccountImpl {

modifies Int deposit(Int x) { Intresult = x;

if (x>=fee) result = original(x-fee);

return result;

}

delta DSave (Int i);

usesAccount;

modifies class AccountImpl { removes Intinterest;

adds Intinterest = i;

}

(15)

15 Delta ini memodifikasi nilai interest pada class AccountImpl dengan cara yang telah disebutkan sebelumnya seperti pada gambar berikut ini.

o Modul delta untuk fitur Type

Silakan tulis kode delta diatas dan simpan pada berkas DType.abs o Modul delta untuk fitur Check

Silakan tulis kode delta diatas, kemudian simpan pada berkas DCheck.abs o Modul delta untuk fitur Overdraft

delta DCheck;

uses Account;

modifies class AccountImpl { removes Int interest;

adds Int interest = 0;

}

delta DType (Int i);

uses Account;

modifies class AccountImpl { adds Int interest = i;

}

(16)

16 Silakan tulis kode delta diatas, kemudian simpan pada berkas DOverdraft.abs

6. Product Configuration

Berikut adalah product configuration Bank Account:

Silakan tulis kode delta diatas dan simpan pada berkas AccountPL.abs Pada product configuration terdapat tiga bagian yang penting yaitu:

Application condition (klausa when) yang menandakan fitur yang direalisasikan oleh delta dan memicu aplikasi dari delta.

Parameter delta yang mengikuti atribut fitur.

• Urutan aplikasi delta (klausa after) untuk menjaga agar tidak terjadi konflik antar delta.

7. Product Selection

Berikut adalah Product Selection untuk Bank Account.

Silakan tulis kode delta diatas dan simpan pada berkas Products.abs delta DOverdraft;

uses Account;

modifies class AccountImpl {

modifies Int withdraw(Int y) {

balance = balance - y; return balance;

} }

Productline Accounts;

featuresFee, Overdraft, Check, Save, Type;

delta DType(Type.i) when Type;

delta DFee(Fee.amount) when Fee;

delta DOverdraft after Dcheck when Overdraft;

delta DSave(Type.i) after DType when Save;

delta Dcheck after Dtype when Check;

// basic product

product CheckingAccount (Type{i=0},Check);

// Account with Fee and parameter

product AccountWithFee (Type{i=0},Check,Fee{amount=1});

// Account with overdraft

product AccountWithOverdraft (Type{i=0},Check,Overdraft);

// should be refused

product SavingAccountWithOverdraft (Type{i=1},Save,Overdraft);

(17)

17 Untuk membuat produk cukup menuliskan fitur-fitur yang direalisasikan di dalamnya dan menyatakan nilai pada delta/fitur yang membutuhkan parameter.

Apabila Anda mengikuti langkah-langkah diatas dengan benar maka Project Explorer Eclipse Anda akan terlihat seperti berikut:

8. Menjalankan Product di ABS

Ada dua jenis langkah yang dapat dilakukan untuk menjalankan SPL di ABS

Menjalankan Base/Core Product

Eclipse  Menu RunRun Configurations…Pilih ABS Java BackendNew_configuration

Untuk ABS Project pilih Nama Project yang ingin dijalankan (contoh Test)Untuk ABS Product pilih<base>Untuk Run Target pilih AccountPilih draw sequence diagram jika ingin melihat sequence diagram ApplyRun

(18)

18

Menjalankan Varian Produk

Caranya hamper serupa dengan menjalankan core product namun pada pilihan ABS Product, pilihlah sesuai dengan produk yang diinginkan.Untukselanjutnya, akan dijalankan produk AccountWithFee.

(19)

19 Perbedaan dengan core product dapat dilihat saat proses debugging, nilai deposit menjadi 99 berbeda dengan core product yang menghasilkan 100. Hal ini terjadi karena delta mengubah method deposit.

== End of Tutorial ==

Referensi

Dokumen terkait