문제

최근 부분 방법에 대해 읽었습니다. C# 언어 사양, 그래서 원리는 알겠는데 실제로 사람들이 어떻게 사용하고 있는지 궁금하네요.부분 방법의 이점을 얻을 수 있는 특정 디자인 패턴이 있습니까?

도움이 되었습니까?

해결책

부분 클래스가 .Net 2에 있었던 이유와 비슷한 이유로 부분 메서드가 도입되었습니다.

부분 클래스는 여러 파일로 분할할 수 있는 클래스입니다. 컴파일러는 실행 시 해당 파일을 모두 하나의 파일로 만듭니다.

이것의 장점은 Visual Studio가 클래스의 일부에 그래픽 디자이너를 제공하고 코더가 다른 클래스에서 작업할 수 있다는 것입니다.

가장 일반적인 예는 양식 디자이너입니다.개발자는 대부분의 경우 버튼, 입력 상자 등의 위치를 ​​수동으로 지정하는 것을 원하지 않습니다.

  • .Net 1에서는 자동 생성된 코드였습니다. #region 차단하다
  • .Net 2에서는 이러한 클래스가 별도의 디자이너 클래스가 되었습니다. 양식은 여전히 ​​하나의 클래스이며 개발자가 편집한 파일과 양식 디자이너가 편집한 파일로 분할됩니다.

이렇게 하면 둘 다 유지 관리가 훨씬 쉬워집니다.병합이 더 간단해지고 VS 양식 디자이너가 코더의 수동 변경 사항을 실수로 취소할 위험이 줄어듭니다.

.Net 3.5에서는 Linq가 도입되었습니다.Linq에는 데이터 구조를 구축하고 자동 코드를 생성하는 DBML 디자이너가 있습니다.

여기서 추가로 필요한 부분은 개발자가 작성하고 싶어할 수 있는 메서드를 제공하는 데 필요한 코드입니다.

개발자는 추가 부분 파일을 사용하여 이러한 클래스를 확장하므로 여기에서는 추상 메서드를 사용할 수 없습니다.

또 다른 문제는 대부분의 경우 이러한 메서드가 호출되지 않으며 빈 메서드를 호출하는 것은 시간 낭비라는 것입니다.

빈 메소드 최적화되지 않았습니다.

따라서 Linq는 빈 부분 메서드를 생성합니다.완성하기 위해 자신만의 부분을 생성하지 않으면 C# 컴파일러는 해당 부분을 최적화할 것입니다.

이 부분 메서드를 수행할 수 있도록 항상 void를 반환합니다.

새로운 Linq DBML 파일을 생성하면 다음과 같은 부분 클래스가 자동 생성됩니다.

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

그런 다음 자신의 부분 파일에서 다음을 확장할 수 있습니다.

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

이러한 메서드를 확장하지 않으면 바로 최적화됩니다.

부분 메서드는 공개될 수 없습니다. 다른 클래스가 호출하려면 부분 메서드가 있어야 하기 때문입니다.자신만의 코드 생성기를 작성하면 유용하다는 것을 알 수 있지만 그렇지 않은 경우에는 VS 디자이너에게만 유용합니다.

앞서 언급한 예는 한 가지 가능성입니다.

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

또 다른 잠재적인 용도는 크고 복잡한 클래스가 여러 파일에 분산되어 있는 경우 호출 파일에서 부분 참조를 원할 수 있다는 것입니다.하지만 그런 경우에는 먼저 수업을 단순화하는 것을 고려해야 한다고 생각합니다.

다른 팁

부분 방법은 GoF와 개념이 매우 유사합니다. 템플릿 방법 행동 패턴 (디자인 패턴, p325).

이를 통해 알고리즘이나 작업의 동작을 한 곳에서 정의하고 다른 곳에서 구현하거나 변경할 수 있으므로 확장성과 사용자 정의가 가능합니다.C# 3.0에서는 코드가 더 깔끔하다고 생각하기 때문에 템플릿 메서드 대신 부분 메서드를 사용하기 시작했습니다.

한 가지 좋은 기능은 구현되지 않은 부분 메서드가 컴파일될 때 런타임 오버헤드가 발생하지 않는다는 것입니다.

코드 생성 이것이 존재하는 주요 이유 중 하나이며 이를 사용하는 주요 이유 중 하나입니다.


편집하다:해당 링크는 Visual Basic과 관련된 정보에 대한 것이지만 C#에도 동일한 기본 원칙이 적용됩니다.

나는 그것들을 가벼운 이벤트로 본다.재사용 가능한 코드 파일(일반적으로 자동 생성되지만 반드시 그런 것은 아님)을 가질 수 있으며 각 구현에 대해 부분 클래스에서 관심 있는 이벤트를 처리하기만 하면 됩니다.실제로 이것이 LINQ to SQL에서 사용되는 방식입니다(그리고 언어 기능이 발명된 이유도 마찬가지입니다).

C#.NET 3.0의 부분 클래스에 대한 최고의 리소스는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

저는 부분 클래스를 사용하지 않으려고 노력합니다(디자이너 파일용으로 Visual Studio에서 만든 부분 클래스는 제외).정말 훌륭해요).나에게는 클래스의 모든 코드를 한 곳에 두는 것이 더 중요합니다.클래스가 잘 설계되어 있고 한 가지를 나타내는 경우(단일 책임 원칙), 그러면 해당 항목에 대한 모든 코드가 한 곳에 있어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top