تصميم الطبقة: وفي ختام datafile Cesar: سيزار في فئة فيما يتعلق موضوع السلامة وقابلية الاختبار

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

سؤال

وأنا أكتب التطبيق في C # (.NET 3.5) ولدي سؤال حول تصميم الفئة:

وأود أن إنشاء فئة الذي يصل ملف (القراءة والكتابة)، ويقدم محتواه لمستخدمي (instanciators) للفئة. والعملية الأكثر شيوعا على سبيل المثال أن يكون لاسترداد قيمة معينة من الملف. و(IO) عمليات القراءة والكتابة الفعلية الفيليين مكلفة جدا أود أن إبقاء ملف البيانات في الذاكرة والسماح لجميع الحالات الوصول إلى هذه البيانات. يقع الطبقة في التجمع الذي يتم استخدامه من مختلف التطبيقات simultaniously، لذا أعتقد أنني يجب أن تكون مثيرة للقلق حول السلامة الموضوع.

وكيف يمكنني تصميم هذا فيما يتعلق موضوع سلامة ووحدة قابلية الاختبار (للاختبارات الوحدة، يجب استخدام inputfiles مختلفة من في التعليمات البرمجية التشغيلي)؟ أي مساعدة يحظى بتقدير كبير.

هل كانت مفيدة؟

المحلول

أولا، وجعل صفك تنفيذ واجهة المناسبة. بهذه الطريقة، يمكن للعملاء اختبار سلوكهم دون الحاجة الملفات الحقيقية على الإطلاق.

واختبار سلامة موضوع من الصعب - أنا لم أر قط شيئا وهو أمر مفيد حقا على هذه الجبهة، على الرغم من أن هذا لا يعني الأدوات ليست هناك

لوحدة اختبار الفصل الدراسي، كنت تشير الى أنه إذا أمكن يجب أن يعمل مع تيار العام بدلا من مجرد ملف. ثم يمكنك تضمين الملفات اختبار مختلفة في التجمع الاختبار، والرجوع إليها مع <لأ href = "http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream.aspx" يختلط = "noreferrer نوفولو"> 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