UML에서 C#으로 변환 재실행 시 고려사항

UML에서 C#으로 변환은 생성된 특정 요소에 @generated 태그를 추가합니다. 변환을 재실행할 때 변환이 @generated 태그를 보유하는 특정 요소 위에 겹쳐씁니다. 생성된 코드에 대한 변경사항을 보호하려면 @generated 태그의 특정 인스턴스를 제거해야 합니다. 모델링할 수 없는 C# 요소를 표시하려면 변환 출력에서 사용자 정의 섹션에 코드를 추가하십시오.

변환에서 생성되는 요소

UML에서 C#으로 변환은 다음 요소에 @generated 태그를 추가합니다.

생성된 코드 보호

UML에서 C#으로 변환을 재실행할 때 기본적으로 변환은 변환에서 생성되거나 사용자가 작성하는 메소드 본문을 겹쳐쓰지 않습니다. @generated 태그를 제거하는지 여부에 관계없이 변환은 항상 메소드 본문을 보존합니다.

다음 요소에서 @generated 태그를 제거하지 않는 경우 변환은 최상위 레벨인지 또는 중첩 상태인지 여부에 관계없이 겹쳐씁니다.
  • 클래스
  • 구조체
  • 열거
  • 위임
  • 필드
  • 메소드
  • 특성

변환이 항상 메소드 본문을 보존하더라도, 메소드에서 @generated 태그를 제거하여 메소드에 대한 구조적 변경사항을 보존해야 합니다. 예를 들어, 메소드 서명을 변경하거나 생성자에 개시자(initializer)를 추가하거나 메소드에 예외를 추가하거나 소스 코드에 주석을 추가하는 경우 메소드에 대한 @generated 태그를 제거해야 합니다.

@generated 태그를 제거하지 않는 경우 변환은 @generated 태그가 적용되는 요소 위에 겹쳐씁니다. 변환은 다음 요소도 겹쳐씁니다.
  • 키워드
  • 클래스의 구성원
  • 매개변수
주: 소스 UML 모델에 메소드를 추가하려면 역변환을 실행하십시오.

새 코드 보호

생성되거나 생성되지 않은 소스 아티팩트에 입력하는 코드는 UML에서 코드가 인식되는지 여부에 관계없이 연속 순방향 변환 및 역변환에서 겹쳐쓰지 않도록 보호할 수 있습니다. 예를 들어, C# 프리프로세서 지시문은 인식되지 않지만 보존됩니다. 다음 사용자 코드 영역 및 요소 유형은 보호됩니다.
  • 속성 및 중첩 유형
  • 각 소스 파일의 사용자 정의 섹션
  • 생성된 유형과 유형 구성원 주변의 사전 및 사후 사용자 코드 섹션
사용자가 고의로 @generated 태그를 요소에 추가하지 않는 한, 변환은 사용자가 C# 코드에 추가하는 속성, 중첩 클래스, 구조체 또는 열거를 겹쳐쓰지 않습니다.
주: 소스 UML 모델에 속성, 중첩 클래스, 구조체 또는 열거를 추가하려면 역변환을 실행하십시오.

또한 변환에서 작성되는 사용자 정의 섹션에 코드를 추가할 수도 있습니다. 변환은 사용자 정의 섹션에서 사용자가 지정하는 코드를 제거하거나 겹쳐쓰지 않습니다.

변환은 코드 파일에서 사용자 정의 섹션을 생성합니다. 변환은 이 파일 각각의 맨 앞에 하나의 사용자 정의 섹션을 추가합니다. 이 섹션을 사용하여 using문을 지정할 수 있습니다.
주: 사용자 정의 섹션에 어떤 유형도 입력하지 않아야 합니다. using문을 선언하는 경우에만 사용됩니다.
사용자 코드를 보존할 수 있는 다른 방법은 사전 및 사후 사용자 코드 섹션을 이용하는 것입니다. 이 섹션은 다음과 같은 생성된 C# 요소 주위에 있습니다.
  • 유형 구성원 - 파일, 메소드, 위임 및 이벤트가 포함됩니다.
  • 복합 유형 선언 - 클래스, 구조체 및 인터페이스가 포함됩니다.
  • 위임
  • 열거
  • 네임스페이스

위에 나열된 요소 다음에 바로(사이에 빈 행 없이) 입력하는 사용자 코드는 변환에서 바로 앞에 있는 요소의 사후 사용자 코드로 해석됩니다. 빈 행 다음에 입력하는 모든 사용자 코드는 변환에서 후속 요소의 사전 사용자 코드로 해석됩니다.

@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" 루프와 같이 프리프로세서 결과가 변경되어 컴파일 오류가 발생할 수 있습니다. 개발자는 사용자가 수동으로 요소를 다시 정렬하는 경우에 코드 보존 기능이 예측 불가능함을 인식해야 합니다.


피드백