"Goto" или как оставить код читабельным
От: m_nikolay  
Дата: 22.05.05 22:17
Оценка:
Задача состоит в поэтапной обработке получаемых данных и, при успешной обработке, формировании результата.

Есть ли более читабельные варианты оформления кода решения подобных задач?

Действия по инициализации...

try {
do{
  ... операция 1я ...
  если сбой, то с Id=..; continue;

  ... операция 2я ...
  если сбой, то с Id=..; continue;

  ... операция Nя ...
  если сбой, то с Id=..; continue;

  Ура, все прошло замечательно
  ... передача результата работы ...

} while (false);
} catch (Exception ex){
  сбой с Id = ...failUnknown;
}

Действия по деинициализации...
Re: "Goto" или как оставить код читабельным
От: GarryIV  
Дата: 22.05.05 23:41
Оценка:
Здравствуйте, m_nikolay, Вы писали:

_>Задача состоит в поэтапной обработке получаемых данных и, при успешной обработке, формировании результата.


_>Есть ли более читабельные варианты оформления кода решения подобных задач?


Для начала выдели код занимающийся обработкой в отдельный метод. Тогда точно не понадобиться GOTO или его сурогат в видк do{}while(true).
WBR, Igor Evgrafov
Re: "Goto" или как оставить код читабельным
От: krasin Россия  
Дата: 23.05.05 00:00
Оценка:
_>Задача состоит в поэтапной обработке получаемых данных и, при успешной обработке, формировании результата.

Одним из вариантов решения вашей задачи является следующий.
Пусть вся информация, необходимая для обработки, находится в объекте класса OperationContext.
public interface IOperation
{
   void Perform(OperationContext context);
   
   int Id { get; }
}

public class OperationManager
{
   private IOperation [] operations;

   public OperationManager(params IOperation [] operations)
   {
      this.operations = operations;
   }
   
   public void Perform(OperationContext context)
   {
      foreach (IOperation operation in operations)
      {
         try
         {
            operation.Perform(context);
         }
         catch (Exception ex)
         {
            throw new OperationException(operation.Id, ex);
         }
      }
      //Здесь передаем результаты выполнения куда надо
   }
}


Код, в котором нам надо будет обработать данные, будет выглядеть так:


OperationManager manager = new OperationManager(new Operation1(), 
                                                new Operation2(),
                                                new Operation3());
...
manager.Perform(context);
Re: "Goto" или как оставить код читабельным
От: m_nikolay  
Дата: 23.05.05 02:08
Оценка:
GarryIV, Krasin, благодарю за своевременный ответ.

реализовывать класс ради 3 строчек код, imho уже слишком.
В итоге остановился на циклическом проходе по делегатам:

delegate bool ...Delegate(ref ...result, params object[] parameters)

operations = new ....Delegate[]{
new ....Delegate(..),
new ....Delegate(..)
}

foreach (...Delegate operation in operations)
if (!operation(ref result, data))
break;

Выглядит вполне красиво.
Re[2]: "Goto" или как оставить код читабельным
От: valmond Россия http://blogs.technet.com/valmond/
Дата: 23.05.05 03:28
Оценка:
_>реализовывать класс ради 3 строчек код, imho уже слишком.

А что кол-во строк в классе влияет на скорость?
Или может у нас стоит лимит на кол-во классов в проекте?
уж кол-во строк в классе это последнее на что стоит смотреть.
вернее я бы скорее согласился на выражение "кол-во строк в методе", но не в классе.
Заметки — SharePoint & InfoPath
http://blogs.technet.com/valmond/
Re[3]: "Goto" или как оставить код читабельным
От: m_nikolay  
Дата: 23.05.05 05:04
Оценка:
Здравствуйте, valmond, Вы писали:

V>А что кол-во строк в классе влияет на скорость?

V>Или может у нас стоит лимит на кол-во классов в проекте?
V>уж кол-во строк в классе это последнее на что стоит смотреть.
V>вернее я бы скорее согласился на выражение "кол-во строк в методе", но не в классе.

Считаю, что добавление в проект классов, функциональность которых, состоящая из единственного метода обрабатывающего и изменяющего данные "базового класса", может быть реализована в методах "базового класса", imho приведет к усложнению читабельности кода (см тему сообщения).

Безусловно, для задач связанных со сложной/длительной/логически завершенной обработкой данных, реализация класса видится более целесообразной.
Re: "Goto" или как оставить код читабельным
От: Andrbig  
Дата: 23.05.05 06:08
Оценка:
Здравствуйте, m_nikolay, Вы писали:

_>Задача состоит в поэтапной обработке получаемых данных и, при успешной обработке, формировании результата.


_>Есть ли более читабельные варианты оформления кода решения подобных задач?


private IdType GetId ()
{
try {
  ... операция 1я ...
  если сбой, то return Id1;

  ... операция 2я ...
  если сбой, то return Id2;

  ... операция Nя ...
  если сбой, то return Id3;

  Ура, все прошло замечательно
  ... передача результата работы ...
  return Id_Ok;

} catch (Exception ex){
  return Id_failUnknown;
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.