SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

AndroMDAでMDAの世界を体験する

AndroMDAでMDAの世界を体験する(コード分析編)

AndroMDAで自動生成されたStruts、Spring、Hibernateのコードを読み解く


  • X ポスト
  • このエントリーをはてなブックマークに追加

MDA対応ツールのAndroMDAはUMLから実行可能なJ2EEアプリケーションの自動生成が可能です。本稿では、AndroMDAによって自動生成されたStruts、Spring、Hibernateのコードを解析します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 「AndroMDAでMDAの世界を体験する(コード生成編)」では、モデリングツールで作成したモデルをもとにAndroMDAでアプリケーションを自動生成し、実行するところまでを紹介しました。本稿では、AndroMDAによって自動生成されたアプリケーションコードの解析をします。

対象読者

 JavaでWebアプリケーションを開発した事がある方を対象とします。

必要な環境

 サンプルは以下の環境で動作確認を行っています。

自動生成されたアプリケーション(PSMとソースコード)

 AndroMDAによって自動生成されたリソースは、以下のように分類できます。

自動生成されるリソース
分類リソース
ソースコード・ページJavaソースコード、JSPファイル
設定ファイルJBoss、EARファイルDDファイル、WebアプリケーションDDファイル、Struts、Hibernate
その他SQLファイル

全体図

 以下の図にアプリケーション全体のアーキテクチャーを示します。PIMのモデルと画面仕様がPSMに変換され、StrutsSpringHibernateを活用したJ2EEのアーキテクチャーが構成されています。DBのトランザクション設定はSpringによって管理されています。

クラス図

 以下の自動生成されたクラス群と設定ファイルをクラス図に示します。

  • ドメインクラスとHibernate設定ファイル
  • ビジネスサービスとDAO(Data Access Object)
  • プレゼンテーション層

ドメインクラスとHibenate設定ファイル

 DBのテーブルにO/Rマッピングするクラス(Item,Category)とValueObject(ItemValueObject,CategoryValueObject)、Hibernateの設定ファイルを図に示しています。

ドメインクラス

 自動生成されたドメインクラスはPOJO(Plain Old Java Object)クラスとValue Objectに分類できます。

  1. POJO(Plain Old Java Object)クラス
  2. ItemクラスとCategoryクラスが作成され、それぞれのクラスを継承したItemImplクラスとCategoryImplクラスが作成されています。Item,Categoryクラスのそれぞれには、id,nameなどの属性とそれぞれのゲッター・セッターメソッドが定義されており、POJO(Plain Old Java Object)と呼ばれる構造のクラスとなっています。
    以下がItemクラスの抜粋です。itemcodenameidcategoriesの属性が定義され、それそれのセッター・ゲッターメソッドが定義されています。
    「Item.java」
    public abstract class Item implements java.io.Serializable{
    
        private java.lang.String itemcode;
        // 省略 itemcode setter,getterメソッド
    
        private java.lang.String name;
        // 省略 name setter,getterメソッド
    
        private java.lang.Long id;
        // 省略 id setter,getterメソッド
    
        private java.util.Collection categories = 
            new java.util.HashSet();
        // 省略 categories setter,getterメソッド
    }
    
  3. Value Object
  4. ItemValueObjectCategoryValueObjectが作成されています。AndroMDAが自動生成したソースでは、Hibernateによって取得したPOJO(ItemImpl,CategoryImpl)をValueObjectに格納し直しています(ManageableServiceLocatorクラスのtoValueObjectメソッド)。このようにPOJOクラスをラッピングした形で、クラスを作成するとHibernateのマッピングファイルに定義された以外のフィールドをクラスに定義したい場合などに便利です。今回のサンプルではItemValueObjectcategoryLabelsCategoryValueObjectitemLabelsというフィールドが定義されています。
    以下がItemValueObjectのコードの抜粋です。
    「ItemValueObject.java」
    public final class ItemValueObject 
        implements java.io.Serializable{
    
        private java.lang.String itemcode;
        // 省略 itemcode setter,getter
    
        private java.lang.String name;
        // 省略 name setter,getter
    
        private java.lang.Long id;
        // 省略 id setter,getter
    
        private java.util.Collection categories;
        // 省略 categories setter,getter
        
        // ValueObjectに追加されたフィールド
        private java.util.Collection categoriesLabels;
        // 省略 categoriesLabels setter,getter
    
    }
    

定義ファイル

  1. Hibernateマッピングファイル
  2. 「Item.hbm.xml」と「Category.hbm.xml」は、Hibernateのマッピングファイルです。テーブルとJavaクラスの関連付けを定義します。マッピングファイルには、主に以下の内容が定義されています。
    • ItemImplクラスと「ITEM」テーブル、CategoryImplクラスと「CATEGORY」テーブルのマッピング
    • id要素で主キーフィールド(フィールド名:id)を定義。id要素の子要素のgenerator要素で、新規インスタンスのid値の設定方法を定義。id要素のclass属性のnativeは、データベースの種類(Oracle、DB2、PostgreSQL、MySQL、HSQLDBなど)ごとにもっとも適したID連番採番方法がHibernateによって適用されるという事を意味します。
    • many-to-many要素で、商品とカテゴリの多対多の関連を定義。マッピングするテーブルは「CATEGORIES2ITEMS」。
    以下にItemのマッピングファイルを示します。CategoryのマッピングファイルもItemと同様にmany-to-manyの関連が定義されます。
    「Item.hbm.xml」
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping default-cascade="none">
      <class name="to.msn.wings.codezine.item.ItemImpl" 
        table="ITEM" dynamic-insert="false" 
        dynamic-update="false">
        <id name="id" type="java.lang.Long" unsaved-value="null">
          <column name="ID" sql-type="BIGINT"/>
          <generator class="native">
          </generator>
        </id>
        <property name="itemcode" type="java.lang.String">
          <column name="ITEMCODE" not-null="true" 
            unique="true" sql-type="VARCHAR(256)"/>
        </property>
        <property name="name" type="java.lang.String">
          <column name="NAME" not-null="true" 
            unique="false" sql-type="VARCHAR(256)"/>
        </property>
        <set name="categories" table="CATEGORIES2ITEMS" 
          order-by="CATEGORIES_FK" 
          fetch="select" lazy="true" inverse="true">
          <key foreign-key="CATEGORY_ITEMS_FKC">
            <column name="ITEMS_FK" sql-type="BIGINT"/>
          </key>
          <many-to-many 
            class="to.msn.wings.codezine.category.CategoryImpl"
            foreign-key="ITEM_CATEGORIES_FKC">
            <column name="CATEGORIES_FK" sql-type="BIGINT"/>
          </many-to-many>
        </set>
      </class>
    </hibernate-mapping>
    
  3. Hibernate設定ファイル
  4. 以下のHibernateの設定ファイルが自動生成されています。
    Hinbernate用設定ファイル
    ファイル名概要
    encache.xmlHibernateのキャッシュ機構設定ファイル
    hibernate.cfg.xmlHibernateのSessionFactoryのデータソース、マッピングなどを設定する
    hibernate.propertiesHibernateで使用するデータソース、データベースDirectなどを設定。本稿のサンプルでは「hibernate.cfg.xml」を参照する設定となっている
    jbpm.propertiesJBPM(Java Business Process Management)の設定ファイル

ビジネスサービスとDAO(Data Access Object)

 SpringによってBeanのライフサイクルが管理されるビジネスサービス、DAOクラスそしてSpring設定ファイルです。

  1. Service Locator
  2. ManageableServiceLocatorは、Springフレームワークが提供しているBeanFactoryReferenceクラスを属性として保持し、Spring軽量コンテナへのアクセス手段であるApplicationContextを返すgetContextメソッドを実装しています。これによりSpringが管理しているビジネスサービスオブジェクトへのアクセスを提供するgetItemManageableServiceメソッドとgetCategoryManageableServiceメソッドを提供しています。
    「ManageableServiceLocator.java」
    public class ManageableServiceLocator{
        // Spring Bean定義ファイル
        private final String DEFAULT_BEAN_REFERENCE_LOCATION = 
            "beanRefFactory.xml";
        // Spring BeanFactoryReference のインスタンス
        private org.springframework.beans.factory.
            access.BeanFactoryReference beanFactoryReference;
    
        // SpringのApplicationContextを取得
        protected synchronized org.springframework.
            context.ApplicationContext getContext(){
            // 省略
            return (org.springframework.context.ApplicationContext)
                this.beanFactoryReference.getFactory();
        }
    
        // ItemManageableServiceの取得
        public final to.msn.wings.codezine.item.
            crud.ItemManageableService 
            getItemManageableService(){
            return (to.msn.wings.codezine.
                item.crud.ItemManageableService)
                getContext().getBean("ItemManageableService");
        }
    
  3. ビジネスサービスクラス
  4. ビジネスサービスのインターフェースとしてItemManageableServiceCategoryManageableServiceが作成され、その実装クラスとしてItemManageableServiceBaseCategoryManageableServiceBaseが作成されています。ItemManageableServiceBaseCategoryManageableServiceBaseはその属性としてDAOを保持しています。ビジネスサービスとDAOオブジェクトの関連付けはSpringの定義ファイルに設定されています。
    「applicationContext-manageable.xml」では、ビジネスサービスのBean定義とトランザクション設定を行っています。「ItemManageableService」サービスに関する設定の関連を以下の図に示します。なお、Springによる宣言的トランザクションはSpringのAOP機能を使用して実現されており、下図内でアスペクト指向の概念はかっこ【】で囲まれています。
    以下の表に簡単にAspect指向の基本用語を説明します。
    Aspect指向の概念
    用語説明
    Aspect横断的関心時をモジュール化したもの。トランザクション処理、ロギング処理など。
    Weaver本流の処理にAdviceの処理を組み込むこと。
    Advice処理がJoinPointに達した時に実行されるコード。
    JoinPointAdviceが実行可能なプログラムコード上の位置。フィールドへのアクセス、コンストラクタの呼び出し、メソッド呼び出しなど意味のある位置を表したもの。
    PointCutJoinPointの集合。
    Adviceにはいくつかのタイプが定義されており、Around Advice、Before Advice、Throw Advice、After Returning Adviceなどが存在し、タイプごとにJoinPointでAdviceが実行されるタイミングが異なります。Springでは「Around Advice」の事を「Interceptor」と呼び、これはメソッドの前後で実行されるAdviceです。Spring宣言的トランザクションでは、「Around Advice(Interceptor)」を使用してトランザクション処理を実現します。
    では、実際に「applicationContext-manageable.xml」の中身をみてみましょう。
    「applicationContext-manageable.xml」
    <bean id="ItemManageableService" 
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- Beanの実装処理 -->
        <property name="target">
            <ref local="ItemManageableServiceBase"/></property>
        <!-- インターセプト対象のメソッドを定義した
            Javaインターフェース名-->
        <property name="proxyInterfaces">
            <value>to.msn.wings.codezine.item.crud.
    ItemManageableService</value>
        </property>
        <!-- インターセプター(Interceptor)の名前 -->
        <property name="interceptorNames">
            <list>
                <!-- トランザクション用 -->
                <value>manageableServiceTransactionInterceptor
                </value>
                <!-- Hibernate用 -->
                <value>hibernateInterceptor</value>
            </list>
        </property>
    </bean>
    
    <bean id="ItemManageableServiceBase" 
        class="to.msn.wings.codezine.item.crud.
    ItemManageableServiceBase">
        <property name="dao"><ref local="ItemManageableDao"/>
        </property>
    </bean>
    
    「ItemManageableService」Beanはclass属性で「org.springframework.aop.framework.ProxyFactoryBean」を指定しています。Proxy Factory Beanの「Proxy」とは、アスペクト指向の「Weaver」と同義で本処理のコードにAspectを「Weaving」し実行します。
    「ItemManageableService」のinterceptorNamesプロパティで指定されている「manageableServiceTransactionInterceptor」は、「applicationContext-manageable.xml」に、「hibernateInterceptor」は、「applicationContext.xml」に定義されています。
    「applicationContext-manageable.xml」では、Springで用意されている「org.springframework.transaction.interceptor.TransactionInterceptor」というトランザクション用のインターセプターを設定しています。
    「applicationContext-manageable.xml」
    <bean id="manageableServiceTransactionInterceptor" 
        class="org.springframework.transaction.interceptor.
    TransactionInterceptor">
    
        <!-- トランザクションマネージャーへの参照 -->
        <property name="transactionManager">
            <ref bean="transactionManager"/></property>
    
        <!-- トランザクション属性 -->
        <property name="transactionAttributeSource">
            <value>
            <!--「PROPAGATION_REQUIRED」
            =トランザクションが開始されていない場合
            トランザクションを開始
            -->
            to.msn.wings.codezine.item.crud.
    ItemManageableService.create=PROPAGATION_REQUIRED
            to.msn.wings.codezine.item.crud.
    ItemManageableService.read=PROPAGATION_REQUIRED
                // (省略)
            </value>
        </property>
    </bean>
    
    以下はトランザクションマネージャーの定義です。クラスには「org.springframework.transaction.jta.JtaTransactionManager」を指定しています。
    「applicationContext-dataSource.xml」
    <bean id="transactionManager"  class="org.springframework.
    transaction.jta.JtaTransactionManager"></bean>
    
    以下は「hibernateInterceptor」インターセプターとHibernateの「sessionFactory」の定義です。「SessionFactory」はHibernateのSessionオブジェクトを取得するためのインターフェースです。Hibernateの「Session」とはDBのコネクションと同じようなものと考えて良いでしょう。
    「applicationContext.xml」
    <!-- Hibernateインターセプター -->
    <bean id="hibernateInterceptor" class="org.springframework.
    orm.hibernate3.HibernateInterceptor">
      <!-- Hibernate Session Factoryへの参照 -->
      <property name="sessionFactory"><ref bean="sessionFactory"/>
      </property>
    </bean>
    
    <!-- Hibernate Session Factory -->
    <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.
    LocalSessionFactoryBean">
      <!-- データソースへの参照 -->
      <property name="dataSource"><ref bean="dataSource"/>
      </property>
      <property name="mappingResources">
        <list>
          <value>to/msn/wings/codezine/item/Item.hbm.xml</value>
          <value>to/msn/wings/codezine/category/Category.hbm.xml
          </value>
        </list>
      </property>
      <!-- Hibernateのプロパティ -->
      <property name="hibernateProperties">
        <props>
          <prop key="hibernate.show_sql">true</prop>
          <prop key="hibernate.dialect">
            org.hibernate.dialect.HSQLDialect</prop>
          <prop key="hibernate.cache.use_query_cache">false</prop>
          <prop key="hibernate.cache.provider_class">
            org.hibernate.cache.EhCacheProvider</prop>
          <prop key="hibernate.cache.query_cache_factory">
            org.hibernate.cache.StandardQueryCacheFactory</prop>
        </props>
      </property>
    </bean>
    
    「applicationContext-dataSource.xml」
    <!-- データソースの定義 -->
    <bean id="dataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName"><value>java:/DefaultDS
      </value></property>
    </bean>
    
    以下が、ビジネスサービスの実装です。モデルを登録(create)・参照(read)・更新(update)、削除(delete)するためのメソッドが実装されています。
    「ItemManageableServiceBase.java」
    public final class ItemManageableServiceBase 
        implements ItemManageableService{
    
        private to.msn.wings.codezine.item.crud.ItemManageableDao 
            dao;
    
        public void setDao(to.msn.wings.codezine.item.
            crud.ItemManageableDao dao){
            this.dao = dao;
        }
        // Item INSERT
        public void create(java.lang.String itemcode, 
            java.lang.String name, java.lang.Long id, 
            java.lang.Long[] categories)
            throws Exception{
            // 省略(引数チェック)
            dao.create(itemcode, name, id, categories);
        }
        // Item SELECT
        public java.util.List 
            read(java.lang.String itemcode, java.lang.String name, 
            java.lang.Long id, java.lang.Long[] categories)
            throws Exception{
            return toValueObjects(dao.read(
                itemcode, name, id, categories));
        }
    
  5. DAO(Data Access Object)
  6. DAOはビジネスサービスから呼び出されます。DAOも「ProxyFactoryBean」によるインターセプターの仕組みが使用されています。トランザクションはビジネスサービスで既に開始されていますので「hibernateInterceptor」インターセプターのみ参照しています。
    以下がDAOのBean定義です。
    「applicationContext-manageable.xml」
    <bean id="ItemManageableDao" 
      class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target"><ref local="ItemManageableDaoBase"/>
      </property>
      <property name="proxyInterfaces">
        <value>to.msn.wings.codezine.item.crud.ItemManageableDao
        </value>
      </property>
      <!-- インターセプター -->
      <property name="interceptorNames">
        <list>
          <value>hibernateInterceptor</value>
        </list>
      </property>
    </bean>
    
    <bean id="ItemManageableDaoBase" 
      class="to.msn.wings.codezine.item.crud.ItemManageableDaoBase">
      <property name="sessionFactory"><ref bean="sessionFactory"/>
      </property>
      <!-- Item DAO参照 -->
      <property name="dao"><ref bean="itemDao"/></property>
      <!-- Category DAO参照 -->
      <property name="categoriesDao"><ref bean="categoryDao"/>
      </property>
    </bean>
    
    以下がitemDaoの定義です。「itemDaoTarget」で指定されているto.msn.wings.codezine.item.ItemDaoImplクラスがDAOの実装クラスになります。
    「applicationContext.xml」
    <bean id="itemDao" 
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- DAO実装への参照 -->
        <property name="target"><ref bean="itemDaoTarget"/>
        </property>
        <!-- インターセプト対象のインターフェース -->
        <property name="proxyInterfaces">
            <value>to.msn.wings.codezine.item.ItemDao</value>
        </property>
        <!-- インターセプター -->
        <property name="interceptorNames">
            <list>
                <value>hibernateInterceptor</value>
            </list>
        </property>
    </bean>
    
    <!-- Item DAOの実装 -->
    <bean id="itemDaoTarget" 
        class="to.msn.wings.codezine.item.ItemDaoImpl">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>
    
    DAO実装クラスは、Springが提供しているHibernateDaoSupportクラスを継承しています。データを操作しているソースの抜粋を以下の表に示します。
    DAO実装クラスのHibernate呼び出し箇所
    データ操作ソース
    データ抽出時(SELECT)this.getHibernateTemplate().find("from to.msn.wings.codezine.item.Item as entity where entity.id = ?", id);
    新規登録時(INSERT)Object identifier = this.getHibernateTemplate().save(item);
    更新時(UPDATE)this.getHibernateTemplate().update(item);
    削除時(DELETE)this.getHibernateTemplate().delete(item);
    以下がDao実装クラスの具体的なソースです。
    「ItemDaoBase.java」
    public abstract class ItemDaoBase
        extends org.springframework.orm.hibernate3.support.
            HibernateDaoSupport
        implements to.msn.wings.codezine.item.ItemDao{
    
         // SELECT
        public Object load(final int transform, 
            final java.lang.Long id){
            // 省略(引数チェック )
            final java.util.List list = 
                this.getHibernateTemplate().find(
                "from to.msn.wings.codezine.item.Item as entity 
    where entity.id = ?", id);
            final Object entity = 
                list != null && !list.isEmpty() ? 
                    list.iterator().next() : null;
            return transformEntity(
                transform, (to.msn.wings.codezine.item.Item)entity);
        }
    
        // INSERT
        public Object create(final int transform, 
            final to.msn.wings.codezine.item.Item item){
            // 省略(引数チェック)
            Object identifier = 
                this.getHibernateTemplate().save(item);
            item.setId((java.lang.Long)identifier);
            return this.transformEntity(transform, item);
        }
        // UPDATE,DELETE省略
    

プレゼンテーション層

 プレゼンテーション層は、Strutsによって提供されるDispatchActionValidatorFormを継承したサブクラス、JSPクラス、Struts設定ファイルなどが自動生成されます。

 コントローラクラスは、Strutsが提供しているDispatchActionを継承しています。各クラスにはcreatereadupdatedeleteなどデータ操作を実行するためのメソッドが実装されます。以下がItem用のコントローラクラスの抜粋です。

「ManageItem.java」
public final class ManageItem extends DispatchAction
{
    public ActionForward create(
        ActionMapping mapping, ActionForm actionForm, 
        HttpServletRequest request, HttpServletResponse response) 
        throws Exception{

        final to.msn.wings.codezine.item.crud.ItemForm form = 
            (to.msn.wings.codezine.item.crud.ItemForm)actionForm;

        to.msn.wings.codezine.ManageableServiceLocator.instance().
          getItemManageableService().create(
          StringUtils.isBlank(request.getParameter("itemcode"))) ? 
            null : form.getItemcode()
          , (StringUtils.isBlank(request.getParameter("name"))) ? 
            null : form.getName()
          , (StringUtils.isBlank(request.getParameter("id"))) ? 
            null : form.getId()
          , (StringUtils.isBlank(request.getParameter("categories")))?
            null : form.getCategories()
        );
        return preload(mapping, actionForm, request, response);
    }

    public ActionForward read(
        ActionMapping mapping, ActionForm actionForm, 
        HttpServletRequest request, HttpServletResponse response) 
        throws Exception{

        final to.msn.wings.codezine.item.crud.ItemForm form = 
            (to.msn.wings.codezine.item.crud.ItemForm)actionForm;
        final java.util.List list = 
          to.msn.wings.codezine.ManageableServiceLocator.instance().
            getItemManageableService().read(
          (StringUtils.isBlank(request.getParameter("itemcode"))) ? 
            null : form.getItemcode()
          , (StringUtils.isBlank(request.getParameter("name"))) ? 
            null : form.getName()
          , (StringUtils.isBlank(request.getParameter("id"))) ? 
            null : form.getId()
          , (StringUtils.isBlank(request.getParameter("categories")))?
            null : form.getCategories()
        );
        form.setManageableList(list);
        // 省略
        return mapping.getInputForward();
    }
}

データベース

 AndroMDAではPIMモデルからスキーマ作成用のSQL文を生成します。本稿でAndorMDAが自動生成したSQL文では、「CATEGORIES2ITEMS」という関連テーブルが作成され、「ITEM」「CATEGORY」の両テーブルにIDフィールドが主キーとして作成されています。また、「ITEM」と「CATEGORIES2ITEMS」、そして「CATEGORY」と「CATEGORIES2ITEMS」の間に外部キー制約も作成されています。

「create-table.sql」
create table ITEM (
    ID BIGINT generated by default as identity (start with 1),
    ITEMCODE VARCHAR(256) not null,
    NAME VARCHAR(256) not null,
    primary key (ID),
    unique (ITEMCODE)
);
create table CATEGORY (
    ID BIGINT generated by default as identity (start with 1),
    CATEGORYCODE VARCHAR(256) not null,
    NAME VARCHAR(256) not null,
    primary key (ID),
    unique (CATEGORYCODE)
);
create table CATEGORIES2ITEMS (
    CATEGORIES_FK BIGINT not null,
    ITEMS_FK BIGINT not null,
    primary key (CATEGORIES_FK, ITEMS_FK)
);
alter table CATEGORIES2ITEMS 
    add constraint CATEGORY_ITEMS_FKC 
    foreign key (ITEMS_FK) 
    references ITEM;
alter table CATEGORIES2ITEMS 
    add constraint ITEM_CATEGORIES_FKC 
    foreign key (CATEGORIES_FK) 
    references CATEGORY;

データベースモデルへの変換時に適用されるルール

 今回のモデルで適用された変換ルールを以下に示します。

  1. データベースモデルの各テーブルに主キーの連番IDフィールドを付加する。
  2. 多対多のモデルは、各モデルそれぞれにマッピングするテーブルと関係テーブルの3つを作成。

 これらは、システム開発のテーブル設計時に適用される一般的なルールなので、AndroMDAは自動的に変換を行っています。

まとめ

 本稿でみたようにPIMのモデルはシンプルでも、Javaの実装に依存したモデル(PSM)になると、モデルは数多くのクラスで構成されるようになります。これらのモデルを正確に作成するには多くの手間が必要となりミスも多くなります。

 AndroMDAのようなMDA対応ツールでモデルやソースを自動生成することにより開発の多くの手間は削減され、さらには品質の向上も期待できます。いきなり全てを自動生成する事は難しいですが、MDAのコンセプトを適用可能な部分から実践して行くことにより、MDA実現に一歩一歩近づいていくのではないでしょうか。

参考資料

  1. AndroMDA
  2. 『独習オブジェクト指向開発』 古川正寿 著、翔泳社、2004年10月
  3. 『MDAのエッセンス』 Stephen J. Mellor・Kendall Scott・Axel Uhl・Dirk Weise 著、株式会社テクノロジックアート 訳、二上貴夫・長瀬嘉秀 監訳、翔泳社、2004年12月
  4. 『MDA導入ガイド』 Anneke Kleppe・Jos Warmer・Wim Bast 著、株式会社テクノロジックアート 訳、長瀬嘉秀 監修、インプレス、2003年12月
  5. 『Spring入門』 長谷川裕一・伊藤清人・岩永寿来・大野渉 著、技術評論社、2005年5月
  6. 『Spring Framework』 河村嘉之・首藤智大・竹内祐介・吉尾真祐 著、日経BP社、2005年5月
  7. 『Hibernate』 James Elliott 著、佐藤直生 訳、オライリー・ジャパン、2004年12月

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
AndroMDAでMDAの世界を体験する連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/133 2006/10/11 19:34

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング