Требуется предложение по объектно-ориентированному дизайну

Мне нужно некоторое предложение по OOD. Ниже моя ситуация.

Class A{
   private B service_;
   private StopWatch timer_;       
   private Const int MinTimeToWait;

   public SomeOperation(){
        timer_.start();
       //call another method on service_ async and subsribe to event for callback
   }

   private SomeOperationCallback()
   {
         timer_.stop();
         int elapsedTime = timer_.elapsedTime();
         if(elapsedTime < MinTimeToWait)
             Thread.sleep(MinTimeToWait - elapsedTime)

         //Continue after thread resumes
   } 

}

У меня есть класс, который запускает асинхронную операцию, и после возврата асинхронной операции мне нужно проверить, вернулась ли операция asycn меньше, чем MinTimeToWait, если да, дождитесь завершения MinTimeToWait, а затем продолжите другие операции.

Теперь я поступаю правильно, включив логику для проверки времени и ожидания в SomeOperationCallback, или мне следует создать новый класс, который инкапсулирует логику и StopWatch, и использовать этот класс для этой проверки и ожидания?

Заранее спасибо за ваши ответы.


person Sri Harsha Velicheti    schedule 12.02.2013    source источник


Ответы (2)


Я не вижу никаких проблем с вашим подходом. Проблема больше похожа на то, как назвать «A», может быть, «MinWaitProcess». Его ответственность состоит в том, чтобы гарантировать, что процесс ожидает минимальное количество времени.

Теперь я поступаю правильно, включив логику для проверки времени и ожидания в SomeOperationCallback, или мне следует создать новый класс, который инкапсулирует логику и StopWatch, и использовать этот класс для этой проверки и ожидания?

Если бы вы сделали это, я подозреваю, что это выглядело бы точно так же, как у вас с классом А.

person Kelly S. French    schedule 12.02.2013
comment
На самом деле класс A является ViewModel для представления WPF, поэтому он выполняет другие операции, такие как обновление пользовательского интерфейса с результатом, полученным в SomeOperationCallback(). - person Sri Harsha Velicheti; 12.02.2013
comment
В этом случае вопрос сводится к повторному использованию. Есть ли другие места в коде, где вам нужно это сделать? Если так, то да, разбейте его на отдельный класс. Я бы предпочел иметь много маленьких классов с четко определенными обязанностями, чем меньше огромных классов, которые делают слишком много вещей. - person Kelly S. French; 13.02.2013

Как сказала Келли С. Френч, ваш подход достаточно хорош. Если вы хотите использовать этот подход в других классах, лучше определить базовый класс с помощью методов SomeOperation() и OperationCallback. После этого вы можете наследовать от базового класса и, вызывая методы суперкласса, добиться повторного использования. Что-то подобное:

Class Base {

     private B service_;
     private StopWatch timer_;       
     private Const int MinTimeToWait;

     public SomeOperation(){
        timer_.start();
     }

     protected SomeOperationCallback()
     {
         timer_.stop();
         int elapsedTime = timer_.elapsedTime();
         if(elapsedTime < MinTimeToWait)
             Thread.sleep(MinTimeToWait - elapsedTime)
         } 

     }
}
class A:Base {
    SomeOperation() {
        super.SomeOperation();
        // do some actions here
        super.SomeOperationCallback();
    }
}
person skyylex    schedule 14.07.2014