2013-07-10 2 views
2

Я пытаюсь реорганизовать метод, который анализирует файл. Для поддержки файлов произвольного размера используется метод с использованием фиксированного буфера.Использовать анонимный метод, чтобы избежать создания одноразового объекта?

public int Parse() 
{ 
    // Get the initial chunk of data 
    ReadNextChunk(); 

    while (lengthOfDataInBuffer > 0) 
    { 
     [parse through contents of buffer] 

     if (buffer_is_about_to_underflow) 
      ReadNextChunk(); 
    } 

    return result; 
} 

Псевдокод выше, является частью единственной общественной нестатической методы в классе (кроме конструктора). Класс существует только для того, чтобы инкапсулировать состояние, которое нужно отслеживать при анализе через файл. Кроме того, как только этот метод был вызван классом, он не может/не должен быть вызван снова. Таким образом, шаблон использования выглядит так:

var obj = new MyClass(filenameToParse); 

var result = obj.Parse(); 

// Never use 'obj' instance again after this. 

Это меня почему-то вызывает. Я мог бы сделать конструктор MyClass закрытым, изменить Parse на статический метод и использовать метод Parse для экземпляра Parse, привязанного к методу. Это дало бы схему использования, как показано ниже:

var result = MyClass.Parse(filenameToParse); 

MyClass не является статическим классом; Мне все еще нужно создать локальный экземпляр в методе Parse.

Поскольку этот класс имеет только два метода; Parse и (private) ReadNextChunk, мне интересно, может ли быть чище писать Parse как один статический метод, введя логику ReadNextChunk в Parse как анонимный метод. Остальное состояние можно отследить как локальные переменные вместо переменных-членов.

Конечно, я мог бы сделать что-то подобное, сделав ReadNextChunk статическим методом, а затем передав весь контекст, но я помню, что методы anon имели доступ к внешней области.

Это странный и уродливый или разумный подход?

+0

Почему бы не анонимным ТИП? – SimpleVar

+0

Если метод статический, то как вы собираетесь писать для него единичные тесты? Вы тесно связываете файловую систему с вашим парсером. – Romoku

+1

@Romoku Точно так же вы пишете модульные тесты для любых других методов. Это только насмехается над тем, что это сложнее со статическими методами, и если никогда не будет причин издеваться над ним, это не проблема. Я бы сказал, что создание экземпляра, который фактически не держится ни в каком полезном состоянии, будет недостатком дизайна; если метод не нуждается в каком-либо состоянии, он должен быть статическим. Кроме того, заголовок вводит в заблуждение. В теле вопроса ничего не говорится об анонимном, это просто вопрос статического вопроса. – Servy

ответ

4

Возможно, это подходит для проверки кода.

Однако, это мои комментарии по поводу дизайна:

  1. Я не думаю, что это будет иметь значение много о OBJ экземпляра используется только один раз. Если вы прослушивались с ним, есть 2 способа обмануть его:

    • Использование другого метода, такие как:

      public int Parse() 
      { 
          var obj = new MyClass(filenameToParse); 
          return obj.Parse(); 
      } 
      
    • Сделать MyClass реализовать IDisposable и завернуть его в использовании заявление. Я не рекомендую это, так как обычно IDisposable имеет логику в их Dispose() методом

  2. Я думаю, что это лучше сделать ваш MyClass принимать параметр в Parse к Parse(string fileNameToParse). Это сделает MyClass классом обслуживания, сделает его безстоящим, многоразовым и инъекционным.

  3. Относительно воздействия на статический класс. Сначала он добавляет связь между вашим потребителем и MyClass. Иногда, если вы хотите протестировать/протестировать consumer без использования парсера MyClass, будет сложно/невозможно издеваться над MyClass тем, что вы хотите.

0

Все, что вам нужно, это статический метод синтаксического анализа, который создает экземпляр, так же, как то, что вы предлагаете в вашем вопросе

public class MyClass 
{ 
    // your existing code.... but make the members and constructor private. 


    public static int Parse(string filenameToParse) 
    { 
     return new MyClass(filenameToParse).Parse(); 
    } 
} 

затем

просто использовать его, как вы предлагаете ...

var result = MyClass.Parse(filenameToParse); 
0

MyClass не является статическим классом; Мне все еще нужно создать локальный пример в методе Parse.

Вам не нужен статический класс, чтобы использовать статические методы. Например, это работает нормально:

public class MyClass 
{ 
    public static string DoStuff(string input) 
    { 
     Console.WriteLine("Did stuff: " + input); 
     return "Did stuff"; 
    } 
} 

public class Host 
{ 
    public void Main() 
    { 
     MyClass.DoStuff("something"); 
    } 
} 
+0

Я понимаю о статических методах. Я хотел сказать, что я все еще использую экземпляр класса (внутри статического метода) для отслеживания состояния. Вопрос был в том, есть ли элегантный способ вызова блока кода в статическом методе, где этот код имеет доступ к локальным переменным в вызывающем методе. –

+0

Почему бы также не иметь частный статический метод, который принимает переменные, которые вы хотите получить в качестве дополнительных параметров, и публичный вызов называется частным? – nathanchere

Смежные вопросы