UML에서 C++로 변환 출력에 대한 모델 및 소스 코드 변경사항의 영향

소스 모델이나 생성된 소스 코드에 대해 작성하는 변경사항은 UML에서 C++로 변환을 재실행할 때 변환 출력에 영향을 줄 수 있습니다. 변환 출력은 모델 요소와 생성된 소스 코드 사이에 파생된 관계를 작성하도록 변환을 구성하는지 여부 또는 생성된 소스 코드에 있는 요소에 대한 @generated 태그를 제거하는지 여부에 따라 다양합니다.

소스 모델 요소 사이에 파생된 관계를 작성하도록 변환을 구성하는 경우 변환은 생성된 소스 코드에 있는 변환 요소마다 고유 ID를 추가합니다.

다음 표에서는 변환을 재실행할 때 소스 모델 변경사항이 이전에 생성된 코드에 영향을 주는 방법을 나열하며, 모델 요소와 생성된 소스 코드 사이에 파생된 관계를 작성하도록 변환이 구성된 것으로 가정합니다.
주: 코드 변경사항을 보존하려면 헤더 파일이나 본문 파일에 있는 요소에 대한 @generated 태그를 삭제할 수 있습니다.
모델 요소 변경 변환을 재실행할 때 이전에 생성된 코드에 대한 영향
속성 이름 바꾸기 또는 이동 속성의 @generated 태그를 삭제하는 경우 속성에 대해 어떤 변경사항도 작성되지 않습니다. 해당되는 getter 및 setter 메소드(생성된 경우)에 대해 어떤 변경사항도 작성되지 않습니다.
속성의 @generated 태그를 삭제하지 않는 경우 다음 조치가 발생합니다.
  • 속성은 이름이 바뀌거나 새 위치로 이동됩니다. 기본 getter 및 setter 메소드(생성된 경우)는 이름이 바뀌거나 이동됩니다.
  • 작성하는 getter 및 setter 메소드는 보존됩니다.
  • 속성이나 해당되는 getter 및 setter 메소드를 참조하는 코드 변경사항은 리팩터되지 않습니다.
클래스 또는 인터페이스 이름 바꾸기 클래스 또는 인터페이스의 @generated 태그를 삭제하는 경우 클래스에 대한 파일의 이름은 바뀌지 않습니다.
@generated 태그를 삭제하지 않는 경우 다음 조치가 발생합니다.
  • 코드에 있는 클래스 이름의 인스턴스와 생성자 및 소멸자(생성된 경우)의 이름이 바뀝니다.
  • 맵핑 모델에 있는 다른 파일 이름으로 맵핑되지 않는 최상위 레벨 클래스의 경우 헤더 및 본문 파일의 이름이 바뀝니다.
  • 이 클래스에 추가한 코드(예: 속성, 메소드, 기본 클래스, 주석 및 클래스 계층 구조)가 보존됩니다.
  • 이름이 바뀐 클래스를 참조하는, 사용자가 추가한 코드는 리팩터되지 않습니다.
  • 이름이 바뀐 클래스를 참조하는 생성된 코드(예: 이름이 바뀐 클래스와 동일한 유형의 리턴 값, 속성 또는 매개변수)가 리팩터됩니다.
  • 최상위 레벨 클래스의 경우에는 변환 구성에서 사용되지 않는 파일 삭제 옵션을 선택하고 다른 최상위 레벨 클래스를 포함하는 파일에 원래 UML 클래스를 맵핑하지 않은 경우 이전에 생성된 파일이 삭제됩니다. 그렇지 않으면 이전에 생성된 파일이 변경되지 않습니다.
최상위 레벨 클래스 또는 인터페이스 이동 최상위 레벨 클래스나 인터페이스의 @generated 태그를 삭제하는 경우 클래스에 대한 파일이 변경되지 않습니다.
@generated 태그를 삭제하지 않는 경우 다음 조치가 발생합니다.
  • UML 클래스의 새 위치에 해당되는 위치에서 새 소스 코드 파일이 생성됩니다. 맵핑 모델이 존재하지 않는 경우 다음 조치가 발생합니다.
    • 중첩 UML 클래스가 비중첩 상태가 되면 새 소스 코드 파일이 생성됩니다.
    • 비중첩 UML 클래스가 중첩 상태가 되면 새 소스 코드 파일이 생성되지 않습니다.
  • 맵핑 모델이 있는 경우 변환은 맵핑 모델의 맵핑에 해당되는 소스 코드 파일을 생성합니다.
  • 소스 코드에 대해 작성하는 변경사항(예: 속성, 메소드, 기본 클래스, 주석, 클래스 계층 구조 추가)은 새 소스 코드 파일에서 보존됩니다. 변경사항은 중첩 상태가 되는 비중첩 클래스에 적용되고 반대로 비중첩 상태가 되는 중첩 클래스에도 적용됩니다.
  • 원래 클래스를 참조하는 코드 변경사항은 리팩터되지 않습니다.
  • 변환 구성에서 사용되지 않는 파일 삭제 옵션이 선택되는 경우 사용되지 않는 파일이 삭제됩니다.
오퍼레이션 리턴 유형이나 서명 이름 바꾸기, 이동 또는 수정 오퍼레이션의 @generated 태그를 삭제하는 경우 오퍼레이션에 대해 어떤 변경사항도 작성되지 않습니다.
@generated 태그를 삭제하지 않는 경우 다음 조치가 발생합니다.
  • 오퍼레이션 소스 코드에 대해 동일한 변경사항이 작성됩니다.
  • 오퍼레이션의 본문에 대한 변경사항이 보존됩니다.
  • 오퍼레이션을 참조하는 코드에 대한 변경사항이 리팩터되지 않습니다.
패키지 이름 바꾸기 또는 이동 생성된 원래 폴더에 있는 파일이 새 폴더로 이동됩니다.

변환 구성에서 사용되지 않는 파일 삭제 옵션이 선택되는 경우
사용되지 않는 폴더 및 파일이 삭제됩니다.

«cpp_namespace»가 적용된 패키지 NamespaceName 특성 이름 바꾸기 생성된 모든 소스 파일에서 네임스페이스의 이름이 바뀝니다. 원래 네임스페이스를 참조하는 코드 변경사항이 리팩터되지 않습니다.
패키지 이름 바꾸기 패키지에 고유 ID가 없으므로 코드가 리팩터되고 이름이 바뀐 패키지로 이동됩니다.

변환을 재실행할 때 생성된 코드의 예제

다음 예제는 고유 ID 및 @generated 태그의 존재 여부에 따라 변환을 재실행할 때 코드에 대한 변경사항을 표시합니다.

이 예제의 UML 소스 모델에 다음 클래스가 있는 것으로 가정합니다.

이 이미지는 attribute1이라고 하는 정수 속성을 가지고 있는 Class1 UML 클래스와 Operation1 오퍼레이션을 보여 줍니다.
이 예제에서는 Operation1에 Operation1 ([in] Parameter1 : Integer) 서명이 있고, 0 값을 갖는 정수를 리턴한다고 가정합니다.

다음 표는 변환이 생성하는 코드를 보여 줍니다.
Class1.h Class1.cpp
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Begin section for Class1
    //TODO: Add attributes that you want preserved
    //End section for Class1

    private:

 	//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

};  //end class Class1
#include "Class1.h"
//Begin section for file Class1.cpp
//TODO: Add definitions that you want preserved
//End section for file Class1.cpp


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1(int Parameter1) 
{
    //TODO Auto-generated method stub
    return 0;
}
사용자가 다음 변경사항을 작성한다고 가정합니다.
  • 생성된 코드에서 사용자가 Operation1을 구현합니다.
    int Class1::Operation1(int Parameter1) 
    {
        return Parameter1;
    }
  • 소스 모델에서, 사용자가 이름 Operation1을 Operation2로 바꿉니다.
변환에서 생성되는 코드는 다음 이벤트에 따라 다릅니다.
  • @generated 태그를 지원하는 요소마다 고유 ID를 생성하는 추적 관계를 생성하도록 변환을 구성하는지 여부. 추적 관계를 작성하도록 변환을 구성할 때 변환이 생성하는 코드를 보려면 고유 ID가 있는 코드 표를 참조하십시오. 추적 관계를 생성하도록 변환을 구성하지 않을 경우 변환이 생성하는 코드를 보려면 고유 ID가 없는 코드 표를 참조하십시오.
  • 생성된 소스 코드에서 @generated 태그를 삭제하는지 여부
다음 표는 파생된 관계를 생성하도록 구성된 변환을 재실행할 때 변환이 생성하는 코드를 보여 줍니다. 이 변환은 @generated 태그를 지원하는 각 요소의 소스 코드 주석에 고유 ID를 추가합니다.
고유 ID가 있는 코드
@generated 태그가 삭제되지 않음
코드는 다음 변경사항을 보여 줍니다.
  • 변환이 이름 Operation1을 Operation2로 바꿉니다.
  • Operation1에 지정된 구현이 Operation2에 표시됩니다.

Class1.h:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Begin section for Class1
    //TODO: Add attributes that you want preserved
    //End section for Class1

    private:

 	//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation2(int Parameter1);

};  //end class Class1
Class1.cpp:
#include "Class1.h"
//Begin section for file Class1.cpp
//TODO: Add definitions that you want preserved
//End section for file Class1.cpp


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    return Parameter1;
}
Class1.h 또는 Class1.cpp에서 @generated 태그가 삭제됨
변환이 고유 ID를 사용하여 모델에서 이름 Operation1이 Operation2로 바뀌었음을 판별하지만 메소드의 @generated 태그를 삭제했으므로 변환이 Operation1에 대한 변경사항을 보존합니다. 따라서 Operation1은 Class1.h 또는 Class1.cpp에서 변경되지 않고 변환은 Operation2 메소드를 생성하지 않습니다.
Class1.h:
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Begin section for Class1
    //TODO: Add attributes that you want preserved
    //End section for Class1

    private:

 	//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

};  //end class Class1
Class1.cpp:
#include "Class1.h"
//Begin section for file Class1.cpp
//TODO: Add definitions that you want preserved
//End section for file Class1.cpp


int Class1::Operation1(int Parameter1) 
{
    return Parameter1;
}

다음 표는 파생된 관계를 생성하도록 구성되지 않은 변환을 재실행할 때 변환이 생성하는 코드를 보여 줍니다. 고유 ID가 없는 경우 변환은 완전한 이름 및 메소드 서명을 사용하여 모델 요소를 소스 코드 요소에 링크합니다. 리팩토링도 지원되지 않습니다.

고유 ID가 없는 코드
@generated 태그가 삭제되지 않음
코드는 다음 변경사항을 보여 줍니다.
  • 변환이 이름 Operation1을 Operation2로 바꿉니다.
  • 변환은 Operation1의 사용자 구현을 기본 구현으로 겹쳐씁니다. 고유 ID가 없는 경우 새 메소드 이름을 원래 메소드에 링크할 수 없기 때문입니다. @generated 태그가 삭제되지 않았으므로 겹쳐쓰기가 발생합니다.
일반적으로, 변환은 함수 본문에 대한 변경사항을 보존하지만 이 예제에서는 변환이 이름 바뀐 메소드를 찾을 수 없어서 변경사항이 보존되지 않습니다.
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Begin section for file Class1.h
//TODO: Add definitions that you want preserved
//End section for file Class1.h

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Begin section for Class1
    //TODO: Add attributes that you want preserved
    //End section for Class1

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2(int Parameter1);

};  //end class Class1
Class1.cpp:
//Begin section for file Class1.cpp
//TODO: Add definitions that you want preserved
//End section for file Class1.cpp


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    //TODO Auto-generated method stub
    return 0;
}
Class1.h 또는 Class1.cpp에서 @generated 태그가 삭제됨
고유 ID가 없는 경우 변환은 Operation2가 새 메소드임을 판별합니다.
코드는 다음 변경사항을 보여 줍니다.
  • 변환은 Operation2에서 기본 메소드 본문을 생성합니다.
  • 변환은 Operation1에 대한 변경사항을 보존합니다. @generated 태그가 삭제되었으므로, 변환은 UML 모델에 일치하는 메소드가 없는 경우에도 변경사항을 보존합니다.
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Begin section for file Class1.h
//TODO: Add definitions that you want preserved
//End section for file Class1.h

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Begin section for Class1
    //TODO: Add attributes that you want preserved
    //End section for Class1

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        int Operation1(int Parameter1);

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2(int Parameter1);

};  //end class Class1

#endif
Class1.cpp:
#include "Class1.h"
//Begin section for file Class1.cpp
//TODO: Add definitions that you want preserved
//End section for file Class1.cpp


int Class1::Operation1(int Parameter1) 
{
	return Parameter1;
}

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    //TODO Auto-generated method stub
    return 0;
}

피드백