• Tidak ada hasil yang ditemukan

Design Pattern Evaluation on A RESTful API Wrapper: A Case Study of Software Integration with An Internet Payment Gateway using Model-Driven Architecture

N/A
N/A
Protected

Academic year: 2023

Membagikan "Design Pattern Evaluation on A RESTful API Wrapper: A Case Study of Software Integration with An Internet Payment Gateway using Model-Driven Architecture"

Copied!
11
0
0

Teks penuh

(1)

Journal of Information Technology and Computer Science Volume 4, Number 3, Desember 2019, pp. 222-232

Journal Homepage: www.jitecs.ub.ac.id

Design Pattern Evaluation on A RESTful API Wrapper:

A Case Study of Software Integration with An Internet Payment Gateway using Model-Driven Architecture

Lindung Parningotan Manik1,2, Hani Febri Mustika1, Arida Ferti Syafiandini1

1Research Center for Informatics, Indonesian Institute of Sciences, Bandung, Indonesia

2STMIK Nusa Mandiri, Jakarta, Indonesia {lindung.manik,hanifmustika,afsyafiandini}@gmail.com Received 13 May 2019; accepted 29 November 2019

Abstract. A proper use of design patterns has proven to be very useful in the development of robust applications over time. In this paper, the design patterns are introduced in the early stage of the software development where model-driven architecture is used as the engineering approach. A RESTful internet payment gateway API (Application Programming Interface) wrapper is selected as the case study. At the beginning, Platform Independent Model (PIM) is created as the domain model. After that, the PIM is transformed into the Platform Specific Model (PSM). Before converting the PSM into the source code, three design patterns such as builder, observer, and factory pattern are added into the model.

To evaluate the impacts of implementation, static analysis is used to examine the generated code before and after adding the design patterns. The result shows that the design decision increases cohesion, complexity, coupling, inheritance, and size metrics of the source codes.

1 Introduction

Nowadays, digitization of the business processes makes internet applications and technologies connected through the cloud growing enormously. Industry 4.0 era pushes stakeholders including governments, manufacturers, and business owners to integrate their applications within the organization, or even with the external organizations. A REST (Representational State Transfer) API (Application Programming Interface) is one of the ways to make these online integrations happen in the cloud. These APIs allow two or more software programs to communicate between each other.

A RESTful API is an API based on the REST technology which is often used in a web services development. It uses HTTP defined by RFC 2616 protocol to GET, PUT, POST, and DELETE data. Since HTTP calls are stateless, REST is very useful in cloud applications. REST also leverages less bandwidth, making it more suitable for internet usage. The API describes the proper way for a developer to write a software requesting services or receiving responses from other applications.

An API wrapper is a software package that contains clean functions to access the API. This wrapper could be written in any programming languages. It takes time to implement the API in a language, to figure out the right way to access the REST endpoints and to retrieve the response data. Once the API wrapper is written, it could

(2)

Lindung Parningotan Manik et al., Design Pattern Evaluation on... 223 be shared among other developers to ease their pain when they must implement the same API in the same programming language.

In this paper, model-driven architecture is used as the software design approach for the development of the API wrapper. One of internet payment gateway API is selected as the case study. The main research goal is to evaluate the design patterns that could be used in the early stage of the API wrapper development. Design pattern is a best practice solution to a commonly occurring problem in software engineering [1].

Since Gang of Four standardized the design patterns for the first time [2], more and more object-oriented software apply them until now. Design patterns have some benefits on software maintainability [3], expandability [4], and modularity [5]. In this research, five software metrics, such as cohesion, complexity, coupling, inheritance, and size metric are evaluated to analyze the impacts of the design decisions.

2 State-of-the-art

Model Driven Architecture (MDA) developed by the Object Management Group (OMG) is a framework for software development using a system modeling language which is defined by [6]. MDA aims to enhance portability by separating business and application logic from underlying platform technology. The primary components of MDA technologies are the Platform Independent Model (PIM) which describes the structure or function of a system and the Platform Specific Model (PSM) which defines specific implementation.

Software development in the MDA starts with a PIM of an application’s or integrated system’s business functionality and behavior, constructed using a modeling language based on OMG’s MetaObject Facility (MOF), Unified Modeling Language (UML), or Common Warehouse Metamodel (CWM). This model remains stable as the technology evolves. MDA has the capability to define templates that map transformations from a PIM to a PSM and then to a working implementation on any platform, including Web Services, .NET, CORBA, Java, and others.

Fig. 1 Model-driven architecture transformation [7]

MDA facilitates the development of a system in abstraction and simplifies implementation of that system across a variety of platforms. The MDA has been successfully implemented in various business domain such as accounting system [8], embedded system [9], cancer research [10], human language technologies [11], also more recently enterprise e-health system [12] and Zakat calculation [13]. MDA may provide 10-20% efficiency improvement of existing systems engineering efforts once the methodology is understood and successfully adapted [14].

However, MDA could not apply the design patterns automatically either when transforming the PIM to the PSM or when converting the PSM into the code. Software designer should add it manually according to the needs since a design pattern is not a finished design that can be transformed directly into the code. It is a template of solving

(3)

224 JITeCS Volume 4, Number 3, Desember 2019, pp 222-232 a problem that can be used in many different situations. Twenty three design patterns that are specified in [2] can be categorized into three main types. They are creational, behavioral, and structural pattern. Despites of their advantages, the abuse, misuse, or overuse of the design patterns could lead into creating bigger problems rather than solving the actual problems.

3 Case Study

In this paper, software development of integrating a mobile commerce application with an internet payment gateway provider is selected as the case study. The actor that uses the payment gateway service in the form of API is called as the merchant. It needs the service since the payment gateway facilitates its customer various payment methods such as credit card, online bank transfer, or e-money. By using the services, the merchants could increase their transaction number since their customer has various options while paying the transaction order. The merchants also can minimize the burdens since they do not need to implement the payment methods one by one.

An internet payment gateway is an instant payment service where the payment occurs in the provider webpage portal. With this service, the customer of the merchant will be redirected to a provider webpage upon checkout to complete the payment by selecting available payment methods. Besides creating order, the payment gateway service provider also serves other features for the merchants such as:

1. Query order status request, to check the status of a payment transaction.

2. Refund request, to refund a settled transaction.

3. Cancel request, to cancel a transaction regardless of its settlement status.

4. Query refund status request, to check the status of an order refund.

Fig. 2 Use-case diagram of the case study

In terms of the security, merchant and payment gateway provider normally use cryptographic keys (private and public key pair) in agreed format when exchanging messages. As mentioned before, it would be very helpful if an API wrapper package could be shared to the merchant application developers in order to minimize the

uc Primary Use Cases

Payment Gateway System

Merchant

Cancel Order

Refund Order

Query Order Create Order

Query Refund

(4)

Lindung Parningotan Manik et al., Design Pattern Evaluation on... 225 integration efforts. The merchants could use the package as the library in their software when they need to connect the applications with the same payment gateway provider and must implement the API in the same programming language.

4 Design

This chapter explains the design of the PIM and the PSM that accommodates the requirements in the case study. Implementation of the design patterns are also discussed accordingly.

4.1 Platform Independent Model

In the domain of the API wrapper, several entities are created in the model such as BusinessApi, BusinessSpi, RestApiClient, and IpgConfig. The BusinessApi refers to interfaces or services hosted or implemented by the payment gateway, in which merchant act as the client (API caller) and payment gateway is the service provider. In this case, the BusinessApi uses a RestApiClient to post a request and to get a response.

Meanwhile, BusinessSpi (service provider interface) refers to interfaces that are intended to be implemented or extended by the merchant. For example, the callback services implemented by merchant client, for which payment gateway provider is the caller and the merchant acts as the service provider. The client and the service provider exchange request and response messages in certain format (either XML or JSON) during the API or the SPI call.

Fig. 3 Differentiation between API and SPI

As a concrete example, a merchant needs to request creating order API when the customer wants to use the payment service and the payment gateway provider will give transaction identifier response in the return. After the customer finish the payment process (either using credit card, online bank transfer, or e-money) in the payment gateway provider webpage portal, the payment gateway provider call the order finished SPI to give the merchant a transaction status either success or failed. The same occurs with the refund order service since it is also an asynchronous flow.

Merchant has key attributes that are associated with the payment gateway system such as the client identifier and the private key. It’s application usually also has other technical configurations such as timeout connection time, connection pool size, and environment type. The IpgConfig entity holds these configuration attributes. Typically,

sd Use Case Model

Merchant Payment Gateway

SPI() API()

(5)

226 JITeCS Volume 4, Number 3, Desember 2019, pp 222-232 there are two types of environment when merchants start integrating their applications with a payment gateway application. The payment gateway providers normally serve sandbox and production environment. Sandbox is safe environment that mimics the real setting, where merchants can develop and test the features of their applications before its released to go live to the public. Thus, EnvironmentType enumeration is created to accommodate this situation. This entity holds some final or unchangeable properties (constants) about the payment gateway information such as the Uniform Resource Location (URL) and the public key.

Fig. 4 Platform independent model

4.2 Platform Specific Model

When transforming the PIM in Fig. 4 to the PSM in Fig. 5, the MDA tool adds some specific implementations in the selected platform. In this case study, Java programming language is selected as the specific implementation platform. As can be seen, the notable transformation rule is the properties encapsulation. The attributes’

modifiers in the PIM are converted from public to private by adding the getter’s and the setter’s methods. Besides that, the constructor methods are also added in each class.

At this point, the Java codes could be generated automatically from the PSM by using the MDA tool.

class PIM

BusinessApi + client: RestApiClient

+ cancelOrder(Request): Response + createOrder(Request): Response + queryOrder(Request): Response + queryRefund(Request): Response + refund(Request): Response

BusinessSpi + ipgConfig: IpgConfig

+ handleOrderFinishedNotification(Request) + handleRefundFinishedNotification(Request)

IpgConfig + clientId: String + connectTimeout: int

+ environmentType: EnvironmentType + maxConnectionPoolSize: int + privateKey: String

+ socketTimeout: int T > RequestMessage

Request + requestMessage: T

T > ResponseMessage

Response + responseMessage: T

RestApiClient + ipgConfig: IpgConfig

+ post(Class<T>, Request<? extends RequestMessage>): Response<T>

«enumeration»

Env ironmentType SANDBOX PRODUCTION Attributes + url: String + publicKey: String

+ipgConfig +client

+environmentType

+ipgConfig

(6)

Lindung Parningotan Manik et al., Design Pattern Evaluation on... 227

Fig. 5 Platform specific model

4.3 Design Patterns

There are rooms for improvement before converting the PSM into the codes. For instance, design patterns could be introduced in the PSM in order to refine the software design. However, as stated before, design patterns must be implemented manually since MDA tool cannot recognize what patterns should be applied for such cases. In this part, the implementations of several design patterns such as builder, observer, and factory pattern are discussed.

4.3.1 Builder Design Pattern

The builder pattern, which is a creational design pattern, separates the construction of a complex object from its representation. In this case study, the builder pattern could

class PSM

BusinessApi - client: RestApiClient + cancelOrder(Request): Response + createOrder(Request): Response + queryOrder(Request): Response + queryRefund(Request): Response + refund(Request): Response

«constructor»

+ BusinessApi(RestApiClient)

IpgConfig - clientId: String

+ CONNECT_TIMEOUT: int = 5000 {readOnly}

- connectTimeout: int = CONNECT_TIMEOUT - environmentType: EnvironmentType

+ MAX_CONNECTION_POOL_SIZE: int = 16 {readOnly}

- maxConnectionPoolSize: int = MAX_CONNECTION_...

- privateKey: String

+ SOCKET_TIMEOUT: int = 30000 {readOnly}

- socketTimeout: int = SOCKET_TIMEOUT

«property get»

+ getClientId(): String + getConnectTimeout(): int

+ getEnvironmentType(): EnvironmentType + getMaxConnectionPoolSize(): int + getPrivateKey(): String + getSocketTimeout(): int

«constructor»

+ IpgConfig(String, EnvironmentType, String) + IpgConfig(String, EnvironmentType, String, int) + IpgConfig(String, EnvironmentType, String, int, int) + IpgConfig(String, EnvironmentType, String, int, int, int)

BusinessSpi - ipgConfig: IpgConfig

+ handleOrderFinishedNotification(Request): void + handleRefundFinishedNotification(Request): void

«constructor»

+ BusinessSpi(IpgConfig)

RestApiClient - ipgConfig: IpgConfig

+ post(Class<T>, Request<? extends RequestMessage>): Response<T>

«constructor»

+ RestApiClient(IpgConfig)

«enumeration»

Env ironmentType SANDBOX

PRODUCTION Attributes

- url: String {readOnly}

- publicKey: String {readOnly}

«constructor»

~ EnvironmentType(String, String)

«property get»

+ getUrl(): String + getPublicKey(): String T > RequestMessage

Request - requestMessage: T

«property get»

+ getRequestMessage(): T

«constructor»

+ Request()

«property set»

+ setRequestMessage(T): void

T > ResponseMessage

Response - responseMessage: T

«property get»

+ getResponseMessage(): T

«constructor»

+ Response()

«property set»

+ setResponseMessage(T): void

+ipgConfig +client

+ipgConfig +environmentType

(7)

228 JITeCS Volume 4, Number 3, Desember 2019, pp 222-232 be implemented in creating the IpgConfig object. It is very useful when the object contains a lot of attributes. In case of creating the IpgConfig object, the mandatory parameters are a client identifier, an environment type, and a private key. Meanwhile, the optional parameters are a connected timeout, a maximum connection pool size, and a socket timeout. In the original class, there are at least four constructor methods to accommodate this situation. This condition is also called as the telescoping constructor, which is considered as an anti-pattern.

Fig. 6 Builder design pattern implementation

After applying the builder pattern, the number of the constructor methods of the IpgConfig class is reduced to one. The constructor class modifier is set to private, so that it cannot be constructed directly. To create the object, the builder static inner class is introduced. The mandatory parameters of the configurations are needed when creating the builder object. Then, optional parameters can be set one by one before creating the IpgConfig object. The builder pattern provides a better control over instantiation process.

class Class Model

IpgConfig - clientId: String {readOnly}

- connectTimeout: int {readOnly}

- environmentType: EnvironmentType {readOnly}

- maxConnectionPoolSize: int {readOnly}

- privateKey: String {readOnly}

- socketTimeout: int {readOnly}

«property get»

+ getClientId(): String + getConnectTimeout(): int

+ getEnvironmentType(): EnvironmentType + getMaxConnectionPoolSize(): int + getPrivateKey(): String + getSocketTimeout(): int

«constructor»

- IpgConfig(Builder)

Before applying builder pattern After applying builder pattern

IpgConfig config = new IpgConfig

.Builder("id",EnvironmentType.SANDBOX,"key") .setMaxConnectionPoolSize(8)

.createIpgConfig();

«static»

IpgConfig::Builder - clientId: String

+ CONNECT_TIMEOUT: int = 5000 {readOnly}

- connectTimeout: int = CONNECT_TIMEOUT - environmentType: EnvironmentType

+ MAX_CONNECTION_POOL_SIZE: int = 16 {readOnly}

- maxConnectionPoolSize: int = MAX_CONNECTION_...

- privateKey: String

+ SOCKET_TIMEOUT: int = 30000 {readOnly}

- socketTimeout: int = SOCKET_TIMEOUT + createIpgConfig(): IpgConfig

«constructor»

+ Builder(String, EnvironmentType, String)

«property set»

+ setConnectTimeout(int): Builder + setMaxConnectionPoolSize(int): Builder + setSocketTimeout(int): Builder IpgConfig

- clientId: String

+ CONNECT_TIMEOUT: int = 5000 {readOnly}

- connectTimeout: int = CONNECT_TIMEOUT - environmentType: EnvironmentType

+ MAX_CONNECTION_POOL_SIZE: int = 16 {readOnly}

- maxConnectionPoolSize: int = MAX_CONNECTION_...

- privateKey: String

+ SOCKET_TIMEOUT: int = 30000 {readOnly}

- socketTimeout: int = SOCKET_TIMEOUT

«property get»

+ getClientId(): String + getConnectTimeout(): int

+ getEnvironmentType(): EnvironmentType + getMaxConnectionPoolSize(): int + getPrivateKey(): String + getSocketTimeout(): int

«constructor»

+ IpgConfig(String, EnvironmentType, String) + IpgConfig(String, EnvironmentType, String, int) + IpgConfig(String, EnvironmentType, String, int, int) + IpgConfig(String, EnvironmentType, String, int, int, int)

(8)

Lindung Parningotan Manik et al., Design Pattern Evaluation on... 229

4.3.2 Observer Design Pattern

The observer pattern, which is a behavioral design pattern, defines a one-to-many dependency between the subject and the objects so that when the subject changes state, the objects are notified and updated automatically. In this case study, the observer pattern could be implemented on handling the payment gateway provider notifications, which is conducted by the BusinessSpi as the subject. Firstly, a SPI observer abstraction is created. Thus, the classes that inherits it should realize its methods in their own way.

Secondly, a list of the observers is added into the BusinessSpi, so the observers will be notified and updated when the BusinessSpi receives the notifications.

The example is shown by Fig. 7. There are two classes that inherits the observer, the OrderDao (data access object) and the CustomerNotifier class. These classes are added in the observer list of the BusinessSpi. When these classes are notified about the changes of an order status, the OrderDao will modify the transaction status in the database and the CustomerNotifier will send an email notification to the customer. By doing so, the subject and the observers are loosely coupled. The subject does not need to know about the implementation of the concrete observer class and any new observer can be added at any point of time without changing the subject class.

Fig. 7 Observer design pattern implementation

4.3.3 Factory Design Pattern

Like the builder pattern, the factory pattern is also a creational design pattern. It is used to create objects without exposing the instantiation process. In this case study, the factory pattern could be used when creating the API client object. As can be seen in the PSM, the RestApiClient is the only class that has responsible in posting a request to the payment gateway. However, this situation could be changed in the future. For instance, in the current situation the RestApiClient uses the technology of Apache

class Class Model

BusinessSpi - ipgConfig: IpgConfig - observers: List<SpiObserver>

+ addObserver(SpiObserver): void + BusinessSpi(IpgConfig)

+ handleOrderFinishedNotification(Request): void + handleRefundFinishedNotification(Request): void

«interface»

SpiObserv er + onOrderFinished(Request): void + onRefundFinished(Request): void for (SpiObserver observer : observers) {

observer.onRefundFinished(request);

}

for (SpiObserver observer : observers) { observer.onOrderFinished(request);

}

OrderDao

+ onOrderFinished(Request): void + onRefundFinished(Request): void

CustomerNotifier + onOrderFinished(Request): void + onRefundFinished(Request): void

-observers 0..*

(9)

230 JITeCS Volume 4, Number 3, Desember 2019, pp 222-232 HttpClient. As an alternative way, a modern HTTP client, namely OkHttp by Square, Inc., is added. Thus, the OkHttpApiClient class is created. To improve the software design, an abstraction of API client, namely ApiClient, is introduced so that the RestApiClient and the OkHttpApiClient class inherits it. To create the concrete class of the abstraction, the ApiClientFactory class is needed. The factory design pattern makes the source codes more robust, less coupled, and easy to extend.

Fig. 8 Factory design pattern implementation class Class Model

RestApiClient - ipgConfig: IpgConfig

+ post(Class<T>, Request<? extends RequestMessage>): Response<T>

+ RestApiClient(IpgConfig) BusinessApi

- client: ApiClient + BusinessApi(ApiClient) + cancelOrder(Request): Response + createOrder(Request): Response + queryOrder(Request): Response + queryRefund(Request): Response + refund(Request): Response

«interface»

ApiClient

+ post(Class<T>, Request<? extends RequestMessage>): Response<T>

OkHttpApiClient - ipgConfig: IpgConfig

+ OkHttpApiClient(IpgConfig)

+ post(Class<T>, Request<? extends RequestMessage>): Response<T>

ApiClientFactory - ApiClientFactory()

+ createClient(IpgConfig, int): ApiClient Application

ApiClient client = ApiClientFactory.createClient(config, 1);

BusinessApi api = new BusinessApi(client);

if (type==1) {

return new RestApiClient(ipgConfig);

}if (type==2) {

return new OkHttpApiClient(ipgConfig);

} -client

(10)

Lindung Parningotan Manik et al., Design Pattern Evaluation on... 231

5 Analysis

In this chapter, five software metrics are measured by using static analysis to investigate the impact of the design patterns implementation. At first, the software metrics are measured when PSM is directly transformed into the source codes before (B) applying the design pattern. After (A) implementing the patterns, the metrics are evaluated again to analyze the differences. The SourceMeter [15] is used to measure these metrics. The metric categories that are chosen in this research, namely:

1. Cohesion metric, which is represented by the LCOM5 (Lack of Cohesion in Methods 5), in measuring to what extent the source code elements are coherent in the system.

2. Complexity metric, which is represented by the WMC (Weighted Methods per Class), in measuring the complexity of source code elements.

3. Coupling metric, which is represented by the CBO (Coupling Between Object classes), in measuring the amount of interdependencies of source code elements.

4. Inheritance metric, which is represented by DIT (Depth of Inheritance Tree), in measuring the aspects of the inheritance hierarchy of the system.

5. Size metric, which is represented by the LLOC (Logical Lines of Code), in measuring the basic properties of the analyzed system in terms of cardinalities.

Table 1 Metrics measurement before and after applying design pattern

LCOM5 WMC CBO DIT LLOC

B A B A B A B A B A

IpgConfig 0 0 10 7 1 2 0 0 55 34

IpgConfig$Builder - 1 - 5 - 2 - 0 - 31

BusinessSpi 2 1 3 6 3 3 0 0 12 21

BusinessApi 1 1 6 6 8 8 0 0 21 21

RestApiClient 1 1 2 2 5 6 0 1 9 9

ApiClientFactory - 1 - 4 - 3 - 0 - 12

The builder pattern decreases the complexity and the size of the IpgConfig class, but the coupling increases. It is because a static inner builder is introduced within the class. As can be seen in the Table 1, if the metrics of the IpgConfig class and the IpgConfig$Builder class are combined then the builder pattern makes the size and the complexity of the codes increasing. The observer pattern increases the cohesion of the BusinessSpi class since the LOM5 value decreases. However, the pattern also makes the complexity and the size of the class increasing. It is because the observers are introduced in the class. The factory pattern increases the coupling and the inheritance of the RestApiClient class because the abstraction and its factory class are introduced.

Moreover, if the RestApiClient and the ApiClientFactory metrics are summed up, then the pattern also makes the complexity and the size of the source codes increasing.

6 Conclusion

The implementation of the selected design patterns in this case study increases the cohesion, the complexity, the coupling, the inheritance, and the size metrics of the source codes when they are introduced in the early stage of the software development.

However, it could not be concluded if this is a good or a bad thing since the measured metrics might become tradeoffs to other software quality properties such as flexibility, maintainability, expandability, reusability, or understandability. More advantages or disadvantages of applying the design decisions might come later in the long run when

(11)

232 JITeCS Volume 4, Number 3, Desember 2019, pp 222-232 the software evolves over the time. For the future works, there should be a certain mechanism to judge whether applying a design pattern in such a case will give more positive or more negative impacts on each of the software quality attributes.

References

[1] M. Fowler, “Patterns [software patterns],” IEEE Softw., vol. 20, no. 2, pp. 56–57, 2003.

[2] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns: Elements of Reusable Object-oriented Software. Boston, MA, USA: Addison-Wesley Longman Publishing Co., Inc., 1995.

[3] P. Hegedüs, D. Bán, R. Ferenc, and T. Gyimóthy, “Myth or Reality? Analyzing the Effect of Design Patterns on Software Maintainability,” in Communications in Computer and Information Science, 2012, vol. 340, pp. 138–145.

[4] F. Khomh and Y.-G. Guéhéneuc, “Perception and Reality: What are Design Patterns Good For?,” 2007.

[5] L. P. Manik and Technische Universiteit Eindhoven (TUE). Stan Ackermans Instituut.

Software Technology (ST), “Modular software architecture for a large complex codebase,”

Technische Universiteit Eindhoven, 2015.

[6] OBJECT MANAGEMENT GROUP, “MDA Guide rev.2.0,” no. June, pp. 1–15, 2014.

[7] T. Černý and M. J. Donahoo, “On separation of platform-independent particles in user interfaces,” Cluster Comput., vol. 18, pp. 1–14, 2015.

[8] S. Ellegaard Borch, J. Winther Jespersen, J. Linvald, and K. Østerbye, “A Model Driven Architecture for REA based systems,” 2003.

[9] J. Huang, “The Research of Model-Driven Architecture in the Embedded System,” in Advanced Development in Automation, Materials and Manufacturing, 2014, vol. 624, pp.

524–527.

[10] R. Calinescu, S. Harris, J. Gibbons, J. Davies, I. Toujilov, and S. B. Nagl, “Model-driven architecture for cancer research,” in SEFM ’07: Proceedings of the Fifth IEEE International Conference on Software Engineering and Formal Methods, 2007, pp. 59–68.

[11] A. di Bari, G. Vetere, and K. Tymoshenko, “Towards Model Driven Architectures for Human Language Technologies,” in Proceedings of the Workshop on Open Infrastructures and Analysis Frameworks for HLT, 2014, pp. 23–33.

[12] B. Atanasovski et al., “On defining a model driven architecture for an enterprise e-health system,” Enterp. Inf. Syst., vol. 12, no. 8–9, pp. 915–941, Sep. 2018.

[13] M. Hamlich, A. Mamouni, Y. Raki, A. Marzak, and A. Belangour, “{ZCM} (Zakat Calculation Model) Models Metamodelling Based on {MDA} (Model Driven Architecture) Concepts,” {SSRN} Electron. J., 2018.

[14] R. Cloutier, “Model Driven Architecture for Systems Engineering,” Stevens Inst. Technol.

Present. INCOSE Int. Work., 2008.

[15] R. Ferenc, L. Langó, I. Siket, T. Gyimóthy, and T. Bakota, “Source Meter Sonar Qube Plug-in,” in 2014 IEEE 14th International Working Conference on Source Code Analysis and Manipulation, 2014, pp. 77–82.

Referensi

Dokumen terkait

35 Menurut ketentuan hukum yang berlaku, di Indonesia Perceraian dapat terjadi karena alasan alasan yang diatur dalam pasal. 19, peraturan pemerintahNomor 9

Kuil Yasukuni sendiri khusus didedikasikan bagi Kami para tentara atau mereka yang tewas dalam peperangan untuk membela Kekaisaran Jepang dalam perang Boshin

Kekerasan dan kandungan total asam buah naga merah super menurun dengan bertambahnya umur panen, sedangkan kandungan total gula dan total padatan terlarut meningkat.. Hal

Dinamometer merupakan suatu mesin elektro-mekanik yang digunakan untuk mengukur torsi dan kecepatan dari tenaga yang diproduksi oleh suatu mesin motor atau penggerak

Beberapa ketentuan dalam Peraturan Pemerintah Nomor 28 Tahun 2000 tentang Usaha dan Peran Masyarakat Jasa Konstruksi (Lembaran Negara Republik Indonesia Tahun 2000

SKPD atau Unit Kerja yang telah memenuhi persyaratan substantif dan persyaratan teknis sebagaimana diatur dalam Peraturan Pemerintah Nomor 23 Tahun 2005 tentang

Puji syukur kehadirat Tuhan yang Maha Kuasa, karena berkat restuNya makalah ini dapat diselesaikan tepat pada waktunya. Budaya sebagai benih identitas suatu bangsa

Proses adaptasi adalah sebuah proses dimana unsur asing yang masuk ke dalam bahasa Indonesia mengalami penyesuaian baik dari segi fonologi maupun morfologinya. Beda halnya