UML에서 C#으로 변환은 다음 요소에 @generated 태그를 추가합니다.
UML에서 C#으로 변환을 재실행할 때 기본적으로 변환은 변환에서 생성되거나 사용자가 작성하는 메소드 본문을 겹쳐쓰지 않습니다. @generated 태그를 제거하는지 여부에 관계없이 변환은 항상 메소드 본문을 보존합니다.
변환이 항상 메소드 본문을 보존하더라도, 메소드에서 @generated 태그를 제거하여 메소드에 대한 구조적 변경사항을 보존해야 합니다. 예를 들어, 메소드 서명을 변경하거나 생성자에 개시자(initializer)를 추가하거나 메소드에 예외를 추가하거나 소스 코드에 주석을 추가하는 경우 메소드에 대한 @generated 태그를 제거해야 합니다.
또한 변환에서 작성되는 사용자 정의 섹션에 코드를 추가할 수도 있습니다. 변환은 사용자 정의 섹션에서 사용자가 지정하는 코드를 제거하거나 겹쳐쓰지 않습니다.
위에 나열된 요소 다음에 바로(사이에 빈 행 없이) 입력하는 사용자 코드는 변환에서 바로 앞에 있는 요소의 사후 사용자 코드로 해석됩니다. 빈 행 다음에 입력하는 모든 사용자 코드는 변환에서 후속 요소의 사전 사용자 코드로 해석됩니다.
@generated 태그와 사용자 정의, 사전 사용자 코드 및 사후 사용자 코드 섹션이 가능한 문제점을 피하기 위한 융통성을 제공하여도, 생성된 코드 대신 소스 UML 모델에 대한 구조적 변경을 작성해야 합니다. 또한 역변환을 실행하여 새 메소드나 속성을 소스 UML 모델에 추가할 수도 있습니다.
일반적인 요소, 네임스페이스 및 주석에 대해 사전 및 사후 사용자 코드 구현 변형이 존재합니다.
일반적인 요소
다음 코드 스니펫을 고려하십시오.
#if DEBUG
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_KBkvkMtZEd2IB4RiswwPkg
// ]
public void Operation1()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
#endif
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_UxwLEc2-Ed2itJx87rzLyg
// ]
public void Operation2()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
위의 예제에서, #endif 지시문은 Operation1 요소의 사후 사용자 코드 섹션입니다. 두 요소 사이에 공백 행이 없는 경우 첫 번째 요소의 끝에서 @generated, @C#_transform [ 또는 다음 요소의 맨 앞까지의 모든 코드는 첫 번째 요소의 사후 사용자 코드로 간주됩니다. 공간 경계 식별 규칙에 대한 예외로, 뒤에 사용자 코드가 있지만 추가 요소가 없는 요소 다음에 공간이 있는 경우 사용자 코드는 다음 예제와 같이 이전 요소의 사후 사용자 코드로 첨부됩니다.
public class Class1
{
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_KBkvkMtZEd2IB4RiswwPkg
// ]
public void Operation1()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_UxwLEc2-Ed2itJx87rzLyg
// ]
public void Operation2()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
#endif
}
네임스페이스 및 #define문
네임스페이스 내의 요소는 컴파일 단위 사이에서 동일한 네임스페이스의 요소와 병합되거나 분할될 수 있습니다. 일반적인 원리로, 네임스페이스 내의 복합 유형 선언, 열거 또는 위임이 다른 컴파일 단위로 이동하는 경우(예: 맵핑 모델을 사용하여) 소스 단위에서 대상 단위의 네임스페이스로 엔클로징 네임스페이스의 사용자 코드를 전송하고 대상의 기존 사용자 코드에 추가합니다.
Class1.cs에 대한 다음 샘플 코드를 고려하십시오.
public class Class1
{
}
#region com-Class1
namespace com
{
public class Class3
{
}
public class Class4
{
}
}
#endregion
Class2.cs:
public class Class2
{
}
#region com-Class2
namespace com
{
public class Class5
{
}
}
#endregion
com.Class4가 Class2.cs로 이동되도록 맵핑 모델을 수정하는 경우 순방향 변환 이후의 결과 코드는 다음 예제와 같이 생성됩니다.
Class1.cs
public class Class1
{
}
#region com-Class1
namespace com
{
public class Class3
{
}
}
#endregion
Class2.cs
public class Class2
{
}
#region com-Class2
#region com-Class1
namespace com
{
public class Class4
{
}
public class Class5
{
}
}
#endregion
#endregion
사전 및 사후 사용자 코드 요소 #region com-Class1 및 #endregion이 변환에 의해 기존 사용자 코드에 추가됩니다. 사후 사용자 코드가 prepend되는 동안 사전 사용자 코드가 추가됩니다.
마찬가지로, 복합 유형 선언 또는 네임스페이스가 맵핑 모델을 통해 하나의 컴파일 단위에서 다른 컴파일 단위로 이동할 때 소스 단위의 #define 및 #undef문이 대상 단위에 추가됩니다.
주석
프리프로세서 지시문 위에 위치되는 주석은 지시문에 관련된 것으로 간주되고, 사용자 코드와 같이 보존됩니다. 주석 및 프리프로세서 지시문의 순서 지정은 유지보수됩니다. 다음 코드 스니펫을 고려하십시오.
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_0o-fIOhIEd2SdrLLRilfrw
// ]
public class Class1
{
#region c
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_S4TRgOkaEd2owca4Ri32gw
// ]
public void Operation2()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
//region ends
#endregion
//comment for a
#region a
//comment for b
#region b
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_vZgVUOhjEd2vc-H9Qq-k_Q
// ]
public void Operation1()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
//end b
#endregion
//end a
#endregion
}
Operation2() 다음부터 #endregion 지시문까지의 코드가 메소드의 사후 사용자 코드로 지정됩니다. 빈 행이 발생한 후, 마지막 프리프로세서 지시문까지의 모든 것이 Operation1()에 대한 사전 사용자 코드로 지정됩니다. 여기에는 주석도 포함됩니다. 사전 사용자 코드에는 주석 //region ends가, 사후 사용자 코드에는 주석 //comment for a 및 //comment for b가 수반됩니다. 이로서 지시문에 관련된 주석이 보존됩니다.
변환 및 모델 특성에 관련된 UML 문서는 사용자 코드로 저장되지 않습니다. 대신, UML 문서는 모델로 저장됩니다. 프리프로세서 지시문이 모델링되지 않은 요소로 포함되는 경우, 변환을 다시 적용하면 문서는 모델링되지 않은 모든 요소에 대해 보존되지만 모델링된 요소의 문서는 모델의 문서 탭에서 가져옵니다.
사전 사용자 및 사후 사용자 코드 섹션을 추가한 후 UML에서 C#으로 변환을 재실행하는 경우, 변환은 소스 코드에서 특정 요소를 다시 정렬합니다.
예를 들어, UML에서 C#으로 변환에 의해 생성된 다음 코드 스니펫에서 소프트웨어 개발자는 Operation2() 및 Operation1() 사이에 attribute1 속성을 추가했습니다.
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_GXpy8Nr5Ed2zKbxEG_6cmQ
// ]
public class Class2
{
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_tnNPwNsGEd2zKbxEG_6cmQ
// ]
public void Operation2()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
#if DEBUG
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_HEXH8Nr5Ed2zKbxEG_6cmQ
// ]
private Object attribute1;
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_HYxRsNr5Ed2zKbxEG_6cmQ
// ]
public void Operation1()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
#endif
}
개발자가 UML에서 C#으로 변환을 재실행할 때 attribute 1 속성은 첨부된 사전 사용자 코드와 함께 코드의 맨 위로 이동합니다. 수정된 코드는 다음 예제와 유사합니다.
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_GXpy8Nr5Ed2zKbxEG_6cmQ
// ]
public class Class2
{
#if DEBUG
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_HEXH8Nr5Ed2zKbxEG_6cmQ
// ]
private Object attribute1;
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_tnNPwNsGEd2zKbxEG_6cmQ
// ]
public void Operation2()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
// @generated
// @C#_transform [
// _URI=platform:/resource/GraphicsLibraryProject/GraphicsModel.emx#_HYxRsNr5Ed2zKbxEG_6cmQ
// ]
public void Operation1()
{
//TODO: Auto-generated method stub
throw new System.NotImplementedException();
}
#endif
}
요소가 다시 정렬되면 위에 있는 예제의 "#if" 루프와 같이 프리프로세서 결과가 변경되어 컴파일 오류가 발생할 수 있습니다. 개발자는 사용자가 수동으로 요소를 다시 정렬하는 경우에 코드 보존 기능이 예측 불가능함을 인식해야 합니다.