I am trying to implement the Execute Around pattern described in Kent Beck's Smalltalk Best Practice Patterns. An example in Java could be found here.
Basically, I am repeatedly opening and closing a pdf document while performing various operations, something like,
public void Parse()
{
// Open the document
PdfLoadedDocument loadedDocument = new PdfLoadedDocument("plan.pdf");
List<string> annotations = Build(loadedDocument);
// work with annotations.
// Close the document
loadedDocument.Save();
loadedDocument.Close();
}
I would like to move the opening and closing the document in a centralized place, as I have tens of similar methods. All these methods open the document, perform an action, and close the document, and it's easy to forget to close the document.
Here is what I tried:
public void BuildAnnotations()
{
List<string> annotations = null;
ExecuteAction("plan.pdf", (PdfLoadedDocument loadedDocument) =>
{
annotations = Build(loadedDocument);
// work with annotations
});
}
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();
}
My question is, is passing a lambda to an Action delegate a good idea? I am not that familiar with delegates, Actions, and lambdas (other than using them in linq queries). Are there any other better alternatives?
Parse
method doesn't do any work and you do not use the result ofBuild
anywhere. I suppose this is not your real code but some shortened version. Please update your question and post what you currently have and what you are trying to improve. We need to see the real and complete code. \$\endgroup\$annotations
. \$\endgroup\$