Windows Phone 8 및 Windows 8 플랫폼 차이 처리

2014-06-18

처음에는 한 플랫폼과 관련된 기능을 구현해야 하므로 사용하는 코드가 이 섹션에서 설명하는 공유 기술에 적합하지 않은 것처럼 보이는 경우가 있습니다. 그러나 몇 가지 리팩터링을 사용하면 공용 코드를 공유한 후 다음과 같은 일반적인 코딩 기술 중 하나를 사용하여 특수화할 수 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

Windows Phone 8 및 Windows 8 앱에 대한 앱 논리가 플랫폼에 따라 약간 다른 방식으로 구현되어야 하는 경우가 있습니다. 이런 경우 한 코드 경로는 Windows Phone 8 에 대해 컴파일되고 다른 코드 경로는 Windows 8 에 대해 컴파일되도록 지시문을 정의할 수 있습니다. 이 기술은 확장성이 우수하지 않으므로 유지 관리가 더 어려운 코드를 만들 수 있지만 다른 공유 패턴을 구현하지 않으려는 경우에는 매우 유용합니다. 자세한 내용은 전처리기 지시문을 사용한 조건부 컴파일을 참조하세요.

.NET Framework에서는 클래스, 인터페이스 또는 구조를 partial 클래스로 분할할 수 있으며, partial 클래스는 각각 클래스의 일부를 구현하는 여러 개의 파일입니다.


namespace ProjectB
{
    public class MyClass
    {
        public void CommonMethodA()
        {
            // code that is common to Windows Phone 8 and Windows 8
        }
 
        public int CommonMethodB()
        {
            int result = 0;
 
            // code that is common to Windows Phone 8 and Windows 8
 
            return result;
        }
 
        public void PlatformSpecificMethod()
        {
            // code that must be written for each platform
        }
    }
}


이 코드 예제에서는 Windows Phone 8 및 Windows 8 에 대해 특별히 구현해야 하는 메서드를 사용합니다. 이 메서드는 코드에서 플랫폼 관련 API를 사용하는 경우에 필요할 수 있습니다. 하나의 partial 클래스는 공용 코드를 구현하고 다른 partial 클래스는 플랫폼 관련 코드를 구현하도록 코드를 리팩터링할 수 있습니다. 다음 코드 예제에서는 이를 수행하는 방법을 보여 줍니다. 아래에서 partial 키워드의 사용 방법에 주의하세요. 이 partial 클래스는 두 앱에서 공유할 수 있는 메서드를 정의합니다. 이 클래스를 프로젝트 폴더 외부에 있는 공용 공유 폴더에 저장한 다음 링크로 추가를 사용하여 각 프로젝트에 추가할 수 있습니다. 파일은 한 번 작성되지만 두 앱에서 공유됩니다.


 
namespace App.Linked
{
    public partial class MyClass
    {
        public void CommonMethodA()
        {
            // code that is common to Windows Phone 8 and Windows 8
        }
 
        public int CommonMethodB()
        {
            int result = 0;
 
 
            // code that is common to Windows Phone 8 and Windows 8
 
            return result;
        }
 
    }
}


그런 다음 각 프로젝트에서 새 클래스를 만들고 해당 클래스에서 플랫폼 관련 코드를 구현합니다.


namespace ProjectB
{
    public partial class MyClass
    {
        public void PlatformSpecificMethod()
        {
            // code that must be written for each platform
        }
    }
}


이는 관리 코드에서 공통 기능을 추출하여 각 플랫폼을 대상으로 하는 플랫폼 관련 기능을 구현하는 간단한 방법입니다. 공용 코드의 양은 플랫폼 관련 코드의 양에 비해 크지만 이 코드 공유 방법은 매우 유용할 수 있습니다. 이 방법과 관련하여 한 가지 주의할 사항은 각 플랫폼 관련 partial 클래스에서 구현해야 하는 항목을 지정할 수 없다는 점입니다. 이 분기 기능에는 장단점이 있을 수 있습니다. 컴파일러는 메서드 구현이 누락된 경우를 catch하지만 디자인 타임에 계약이 없습니다. partial 클래스 사용에 대한 자세한 내용은 Partial 클래스 및 메서드(C# 프로그래밍 가이드)Partial(Visual Basic)을 참조하세요.

두 클래스에서 공용 코드를 사용하고 둘 다 공용 형식에 속하는 경우 부모 또는 기본 클래스를 만들고 공용 코드를 해당 클래스로 이동할 수 있습니다. 이런 방식으로 중복 코드를 제거할 수 있습니다. 또한 기본 클래스는 클래스의 소스 코드는 제어할 수 없지만 일부 동작을 추가하거나 변경하려는 경우 확장성을 위해서도 사용됩니다. 상속을 사용하고 특정 메서드를 재정의할 수 있습니다. 현재 사용 중인 앱의 경우 공용 코드가 있지만 각 플랫폼에 대해 클래스의 특정 부분을 구현해야 합니다. 이전 섹션과 동일한 클래스를 사용하여 이 작업을 수행할 수 있습니다.


namespace ProjectB
{
    public class MyClass
    {
        public void CommonMethodA()
        {
            // code that is common to Windows Phone 8 and Windows 8
        }
 
        public int CommonMethodB()
        {
            int result = 0;
 
            // code that is common to Windows Phone 8 and Windows 8
 
            return result;
        }
 
        public void PlatformSpecificMethod()
        {
            // code that must be written for each platform
        }
    }
}


이번에는 기본 코드를 리팩터링하여 정의합니다.


namespace ProjectB
{
    public abstract class MyBaseClass
    {
        public void CommonMethodA()
        {
            // code that is common to Windows Phone 8 and Windows 8
        }
 
        public int CommonMethodB()
        {
            int result = 0;
 
            // code that is common to Windows Phone 8 and Windows 8
 
            return result;
        }
 
   public abstract void PlatformSpecificMethod();
    }
}


추상 클래스이므로 인스턴스화할 수 없습니다. 대신 이 기본 클래스에서 파생되는 클래스를 정의해야 합니다. 또한 두 플랫폼에서 구현해야 하는 메서드는 기본 클래스에서 추상 메서드로 정의됩니다. 이 메서드는 파생 클래스에서 구현되어야 합니다. 기본 클래스는 링크로 추가를 사용하여 연결된 파일로 각 앱 프로젝트와 공유할 수 있습니다. 이 클래스는 한 번 작성된 다음 프로젝트 간에 공유됩니다. 또는 이 클래스를 이식 가능한 클래스 라이브러리에 추가하고 앱 간에 이 하나의 이진을 공유할 수 있습니다. 이식 가능한 클래스 라이브러리 공유에 대한 자세한 내용은 이식 가능한 클래스 라이브러리를 사용하여 기능 공유를 참조하세요. 기본 클래스를 정의한 다음에는 플랫폼 관련 클래스를 파생하고 해당 클래스에서 플랫폼 관련 기능을 구현할 수 있습니다.


public class MyWin8Class : MyBaseClass
{
    public override void PlatformSpecificMethod()
    {
        // Implement this method specific to Windows 8
    }
}
 
public class MyWP8Class : MyBaseClass
{
    public override void PlatformSpecificMethod()
    {
        // Implement this method specific to Windows Phone 8
    }
}


기본 클래스에서 파생되고 플랫폼 관련 메서드를 구현하는 클래스를 각 프로젝트에서 구현한 것을 확인할 수 있습니다. 추상 클래스 사용에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)MustInherit(Visual Basic)를 참조하세요.

인터페이스는 런타임 다형성이 필요한 경우에 유용합니다. 인터페이스의 용도는 여러 가지로 구현할 수 있도록 기능을 정의하는 것입니다. 기능을 사용하는 코드에서는 특정 구현 대신 인터페이스를 참조할 수만 있습니다. 구현이 무엇인지 알 필요 없이 인터페이스의 메서드를 호출합니다. 이전 예제에서 이미 사용된 코드와 유사한 코드를 사용하여 인터페이스를 매개 변수로 사용하는 생성자를 만들도록 클래스를 수정합니다. 이 매개 변수를 _platformImpl이라는 클래스 구성원에 할당합니다. 그런 다음 PlatformSpecificMethod 호출에서는 단순히 인터페이스에서 메서드를 호출합니다.


namespace ProjectB
    {
        public interface IPlatformSpecificCode
        {
            void PlatformSpecificMethodImpl();
        }

        public class MyClass
        {
            private IPlatformSpecificCode _platformImpl;

            public MyClass(IPlatformSpecificCode platformImpl)
            {
                _platformImpl = platformImpl;
            }

            public void CommonMethodA()
            {
                // code that is common to Windows Phone 8 and Windows 8
            }

            public int CommonMethodB()
            {
                int result = 0;

                // code that is common to Windows Phone 8 and Windows 8

                return result;
            }

            public void PlatformSpecificMethod()
            {
                _platformImpl.PlatformSpecificMethodImpl();
            }
        }

        // Windows 8 app project
        public class MyWin8Implementation : IPlatformSpecificCode
        {

            public void PlatformSpecificMethod()
            {
                // Implemented for Windows 8
            }
        }

        // Windows Phone 8 app project
        public class MyWP8Implementation : IPlatformSpecificCode
        {

            public void PlatformSpecificMethod()
            {
                // Implemented for Windows Phone 8
            }
        }

이 코드에서는 각 앱 프로젝트에 인터페이스를 구현하고 해당 프로젝트에서 MyClass를 만든 다음 구현을 통해 전달합니다. 다음 코드 조각에서 이를 확인할 수 있습니다.


            // Construct MyClass, passing in the Windows 8 implementation of the interface
            MyClass myClass = new MyClass(new MyWin8Implementation());

           // Construct MyClass, passing in the Windows Phone 8 implementation of the interface
            MyClass myClass = new MyClass(new MyWP8Implementation());

인터페이스를 사용하여 플랫폼에 종속적인 코드를 삽입하는 것은 매우 강력한 패턴이며 이 간단한 가정을 기반으로 좀더 복잡한 패턴을 만들었습니다. 서비스 로케이터, 팩토리 및 종속성 삽입, Inversion of Control 및 IoC 컨테이너를 사용한 종속성 삽입은 모두 이 개념을 기반으로 하는 잘 알려진 패턴입니다. 이러한 패턴의 구현을 제공하는 많은 타사 도구 키트 및 프레임워크를 사용할 수 있습니다. MVVM과 함께 사용되어 필요한 경우 구현을 공유하고 특수화를 삽입하는 매우 강력한 방식을 구성합니다.

인터페이스 사용의 또 다른 장점은 단위 테스트가 더 쉽다는 것입니다. 클래스에서 코드를 실행하도록 작성된 단위 테스트에서는 인터페이스 구현을 모방하여 테스트에 예측 가능한 동작을 삽입하거나 단위 테스트에 서비스, 데이터 연결 또는 다른 종속성이 필요하지 않도록 인터페이스를 구현하여 테스트를 단순화할 수 있습니다.

표시:
© 2014 Microsoft