클래스 디자인 : 스레드 안전성 및 테스트 가능성과 관련하여 데이터 파일을 클래스로 마무리합니다.

StackOverflow https://stackoverflow.com/questions/208184

문제

C# (.NET 3.5)에 앱을 작성하고 클래스 디자인에 대한 질문이 있습니다.

파일 (읽기, 쓰기)에 액세스하고 클래스의 사용자 (Instanciators)에게 콘텐츠를 제공하는 클래스를 만들고 싶습니다. 인스턴스에서 가장 일반적인 작업은 파일에서 특정 값을 검색하는 것입니다. 실제 읽기 및 쓰기 (IO) 작업은 비싸기 때문에 파일 데이터를 메모리에 유지하고 모든 인스턴스 가이 데이터에 액세스하도록합니다. 이 클래스는 다양한 응용 프로그램에서 동시에 사용되는 어셈블리에 위치하고 있으므로 스레드 안전에 대해 걱정해야한다고 생각합니다.

스레드 안전성 및 단위 테스트 가능성과 관련하여 이것을 어떻게 설계합니까 (단위 테스트의 경우 운영 코드보다 다른 입력 파일을 사용해야합니까)? 모든 도움은 대단히 감사합니다.

도움이 되었습니까?

해결책

첫째, 클래스가 적절한 인터페이스를 구현하도록하십시오. 이렇게하면 고객은 실제 파일이 전혀 필요없이 자신의 행동을 테스트 할 수 있습니다.

스레드 안전을 테스트하는 것은 어렵습니다. 나는 도구가 없다고 말하는 것은 아니지만 그 전면에서 실제로 유용한 것을 본 적이 없습니다.

수업을 테스트하는 경우 가능하면 파일이 아닌 일반 스트림과 함께 작동해야합니다. 그런 다음 테스트 어셈블리에 다른 테스트 파일을 포함시킬 수 있습니다. getmanifestresourcestream. 나는 과거에 큰 성공을 거두었습니다.

다른 팁

사용 ReaderWriterLock, 문제 설명에 적합하다고 생각합니다.

다음은 빠르고 더러운 구현입니다. 구제 금융 등을 여러 번 시도하는 것처럼 자물쇠를 획득하는 것은 더 똑똑 할 수 있습니다. 그러나 요점을 얻을 수 있습니다.

public class MyFooBarClass
{
   private static ReaderWriterLock readerWriterLock = new ReaderWriterLock();
   private static MemoryStream fileMemoryStream;

   // other instance members here

   public void MyFooBarClass()
   {
     if(fileMemoryStream != null)
     {
        // probably expensive file read here
     }

     // initialize instance members here
   }

   public byte[] ReadBytes()
   {
    try
    {
        try
         {
            readerWriterLock.AcquireReaderLock(1000);
            //... read bytes here
            return bytesRead;
         }
         finally
         {
            readerWriterLock.ReleaseReaderLock();
         }
     }
     catch(System.ApplicationException ex)
     {
        System.Diagnostics.Debug.WriteLine(ex.Message);
     }
   }

   public void WriteBytes(bytes[] bytesToWrite)
   {
    try
    {
        try
         {
            readerWriterLock.AcquireWriterLock(1000);
            //... write bytes here
         }
         finally
         {
            readerWriterLock.ReleaseWriterLock();
         }
     }
     catch(System.ApplicationException ex)
     {
        System.Diagnostics.Debug.WriteLine(ex.Message);
     }
   }
}

스레드 안전과 관련하여 : 여러 스레드가 아니라면 스레드 안전이 문제가되지 않습니다. 단일 응용 프로그램 내에서 동시에 동시에 동시에 수업의 인스턴스를 참조 할 것입니다. 클래스가 프로세스 외부 서버 내에 포함되지 않으면 여러 응용 프로그램이 동시 인스턴스를 동시에 언급 할 수있는 방법이 없습니다. 따라서 볼 수있는 충돌은 스레딩 문제보다는 파일 공유 위반에서 비롯됩니다 (즉, 다른 단어, 다릅니다. 인스턴스 동일하게 읽고 쓰려고 시도하는 수업 파일). 그렇습니다. 파일 공유를 적절하게 처리하려면 코드를 설계해야합니다.

클래스 단위를 테스트 할 수 있도록하는 한 가지 방법은 클래스가 파일에 직접 액세스하지 않고 생성자의 스트림을 클래스에 제공하는 것입니다. 그런 다음 장치 테스트는 예를 들어 파일 스트림을 공급하는 대신 메모리 스트림을 제공 할 수 있습니다.

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