как объединить 2 метода с разными объектами (одинаковый код в обоих методах) - PullRequest
0 голосов
/ 08 ноября 2019

Новый постер здесь, но я уже давно использую SO.

Я немного устал от C #-кодирования и у меня есть кое-что, что я хотел бы оптимизировать в своем коде. У меня есть 2 метода, которые имеют точно такой же код, но с другим объектом (у объекта есть несколько разных свойств, но те, которые используются, одинаковы в обоих методах). Запрос строится по-разному перед вызовом метода. Есть ли способ легко объединить методы, чтобы я все еще мог использовать его с одним или другим объектом?

private static void SetQueryMainFilters(DocumentQueryObject documentQuery, DocumentQuery repeaterQuery, out DocumentQuery outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}

private static void SetQueryMainFilters(DocumentQueryObject documentQuery, MultiDocumentQuery repeaterQuery, out MultiDocumentQuery outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}

Один из методов, который вызывает дублированный метод

public static MultiDocumentQuery RepeaterMultiDocumentQuery(DocumentQueryObject documentQuery)
{
    MultiDocumentQuery repeaterQuery = new MultiDocumentQuery();
    [...]
    SetQueryMainFilters(documentQuery, repeaterQuery, out repeaterQuery);

    return repeaterQuery;
}

В настоящее время у меня есть объект MultiDocumentQuery и DocumentQueryObject. Код одинаков в обоих методах, но объект различен.

Есть ли правильный способ сделать это, чтобы избежать дублирования кода? Если у вас есть лучшее решение, чтобы предложить мне, у меня открыты уши для предложений. Мне нужно иметь возможность вызывать построитель нескольких запросов или обычный построитель запросов с почти одинаковыми свойствами, но с другим поведением. Он использует Kentico DocumentQuery и MultiDocumentQuery.

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 ноября 2019
private static void SetQueryMainFilters<TQuery>(DocumentQueryObject documentQuery, TQuery repeaterQuery, out TQuery outRepeaterQuery) where TQuery : DataQueryBase<TQuery>, new()
{ 
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}
1 голос
/ 08 ноября 2019

Вы можете объявить базовый класс, от которого наследуются DocumentQuery и MultiDocumentQuery, и указанный базовый класс должен содержать метод WhereEquals().

public class DocumentBase
{
    public void WhereEquals() { }
}

public class DocumentQuery : DocumentBase
{
    // Other stuff
}

public class MultiDocumentQuery : DocumentBase
{
    // Other stuff
}

public class DocumentQueryObject
{
    public int NodeID { get; set; }
    public int DocumentID { get; set; }
}

Затем вы можете объединить дваметоды, такие как:

private static void SetQueryMainFilters(
    DocumentQueryObject documentQuery, 
    DocumentBase repeaterQuery, 
    out DocumentBase outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals();
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals();
    }

    outRepeaterQuery = repeaterQuery;
}

И это будет означать, что при вызове вам нужно будет создать объект базового класса, но new использует соответствующий тип.

DocumentBase single = new DocumentQuery();
SetQueryMainFilters(documentQuery, single, out single);
DocumentBase multi = new MultiDocumentQuery();
SetQueryMainFilters(documentQuery, multi, out multi);
...