Элегантные способы избежать многочисленных изменений кода в следующем устаревшем коде - PullRequest
3 голосов
/ 02 декабря 2011

В некоторых устаревших кодах встречаются сотни следующих фрагментов кода:

myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;

... тогда как «ReportGenerator» и «ReportingObj» являются экземплярами сторонней библиотеки и поэтому не могут быть изменены.

Этот код хорошо работал в Windows XP, но для запуска программы в Windows 7 требуется следующая дополнительная строка кода:

reportingObj.Render();
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;

К сожалению, есть сотни вхождений этого фрагмента кода во всю кодовую базу, и ручной поиск их звучит как довольно подверженный ошибкам процесс.

Поскольку "ReportGenerator" и "reportsObj" являются сторонними, я не могу изменить их метод получения / установки.

Каковы элегантные способы решения такой проблемы?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2011

Вы можете обернуть ReportingObj в свой собственный класс, в котором вы просто делегируете исходному ReportingObj, но для проверки свойства PreviewDocument, чтобы увидеть, был ли вызван Render(), а если нет, - что-то вроде этого :

public Foo PreviewDocument
{
    get
    {
        if (!_rendered)
        {
            _originalreportingObj.Render();
            _rendered = true;
        }
        return _originalreportingObj.PreviewDocument;
    }
}
1 голос
/ 02 декабря 2011

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

public class Previewer
{
     public static PreviewDocumentType PreviewDocument(ReportingObject reportingObj) {
       reportingObj.Render();
       return reportingObj.PreviewDocument;
     }
}

, где PreviewDocumentType - это тип, возвращаемый из PreviewDocument, а ReportingObject - тип объекта отчетности.

Затем можно заменить

reportingObj.PreviewDocument;

на

Previewer.PreviewDocument(reportingObj);
1 голос
/ 02 декабря 2011

Вы можете изменить класс myObj, который, как я полагаю, находится под вашим контролем, и иметь свойство ReportGenerator, возвращающее класс-оболочку, который либо вызывает исходный установщик Preview, либо вызывает его после вызова Render():

public class ReportGeneratorWrapper
{
     private ReportGenerator m_InnerReportGenerator;

     public PreviewDocument Preview
     {
         get
         {
             return m_InnerReportGenerator;
         }
         set
         {
             if (IsNT6OrAbove)
                 value.Render();

             m_InnerReportGenerator = value;
         }
     }
}
...