Выполнить вокруг в C # - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь реализовать шаблон Execute Around , описанный в шаблонах лучших практик Кент Бека Smalltalk. Пример на Java можно найти здесь .

По сути, я неоднократно открываю и закрываю PDF-документ при выполнении различных операций, например,

public void Parse()
{
    // Open the document
    PdfLoadedDocument loadedDocument = new PdfLoadedDocument("plan.pdf");

    List<string> annotations = Build(loadedDocument);

    // Close the document
    loadedDocument.Save();
    loadedDocument.Close();
}

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

Вот что я попробовал:

public void BuildAnnotations()
{
    List<string> annotations = null;

    ExecuteAction("plan.pdf", (PdfLoadedDocument loadedDocument) =>
    {
        annotations = Build(loadedDocument);
    });
}

private void ExecuteAction(string path, Action<PdfLoadedDocument> perform)
{
    PdfLoadedDocument loadedDocument = new PdfLoadedDocument(path);

    try
    {
        perform(loadedDocument);
    }
    catch(Exception e)
    {
        Console.WriteLine($"An error occured. {e}");
    }

    loadedDocument.Save();
    loadedDocument.Close();
}

У меня такой вопрос: хорошая ли передача лямбды делегату от действия? Я не настолько знаком с делегатами, действиями и лямбдами (кроме как использовать их в запросах linq). Есть ли другие лучшие альтернативы?

1 Ответ

2 голосов
/ 06 мая 2019

Рассматривали ли вы реализацию интерфейса IDisposable, чтобы позже вы могли использовать ключевое слово using, например ::

using (PdfLoadedDocument loadedDocument = new PdfLoadedDocument(path))
{
    List<string> annotations = Build(loadedDocument);
}

public class PdfLoadedDocument : IDisposable
{
    public void Close()
    {

    }

    public void Save()
    {

    }

    public void Dispose()
    {
        Save();
        Close();
    }
}
...