Альтернативный способ реализации кода

Заголовок не точно значим, но я не доля, что еще назвать его. Я написал код Поколения TOC когда-то позже. На основе этого я был написанием кода для проверки на дубликаты также. Код следующие

curNumber = getTOCReference(selItem.SNo, IsParent);
CheckForDuplicates(curNumber, IsParent,out realTOCRef);
curNumber = realTOCRef;

И код для CheckForDuplicates

        ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

        if (curItem != null)
        {
            curNumber = this.getTOCReference(curNumber, !IsParent);
            CheckForDuplicates(curNumber, IsParent,out realTOCRef);
        }
        else
        {
            realTOCRef= curNumber;
        }

Что делает этот код, это получает TOC и попытки, которые это находит, существует ли это уже в ObjectListView и получает новый TOC, если существует существующий TOC. После того как это решает, что сгенерированный TOC не находится там в списке, это хранит его в realTOCRef и передает его обратно основному коду вызова.

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

Я ценил бы любую справку на этом.

1
задан 2 revs 23 May 2017 в 11:48
поделиться

2 ответа

Когда у вас есть единственный параметр out, его часто можно удалить, используя это значение в качестве возвращаемого значения для метода. Замена параметра out на возвращаемое значение выглядит так:

String CheckForDuplicates(String curNumber, bool IsParent) 
{
    ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

    if (curItem != null)
    {
        String newNumber = this.getTOCReference(curNumber, !IsParent);
        curNumber = CheckForDuplicates(newNumber, IsParent);
    }
    // else - curNumber is correct - not a duplicate
    return curNumber;
}

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

  • переименуйте getTOCReference в getNextTOCReference, поскольку это действительно то, что он делает - находит значение TOC, которое будет следующим, без проверки дубликатов.
  • создать новый метод GetNextAvailableTOCRefernece. Для меня GetTOCRefernece подразумевает получение какого-то сохраненного состояния и то, что несколько вызовов вернут одно и то же значение. Это не то, что он делает, поэтому новое название проясняет ситуацию. Это выглядит следующим образом:

(по сути, код, который вы привели в начале страницы, рефакторингованный для использования возвращаемого значения, обернутый в метод.)

String GetNextAvailableTOCReference(String curNumber, bool IsParent) 
{
   String newNumber = GetNextTOCRefrence(curNumber, IsParent);
   return CheckForDuplicates(newNumber, IsParent);   
}

С этими изменениями вы вызываете getNextAvailalbeTOCreference, когда вам нужна новая ссылка, и вы можете быть уверены, что она уникальна (нет дубликатов.)

Я оставил стиль кода как есть - я согласен, что вы могли бы быть немного более последовательными, и предоставить комментарии для некоторой логики - особенно getTOCReference, поскольку он делает 4 разные вещи в зависимости от аргументов метода. И, конечно, юнит-тесты, чтобы вы могли быть уверены, что он делает то, что вы говорите!

2
ответ дан 3 September 2019 в 00:30
поделиться

Я не знаю, что вы ищете.

Я предполагаю, что вы ожидаете чего-то вроде следующего.

Существующий вызов:

CheckForDuplicates(curNumber, IsParent,out realTOCRef);
curNumber = realTOCRef;

Требуемый вызов:

curNumber =CheckForDuplicates(curNumber, IsParent);

Если да, просто измените код на следующий: он будет работать.

        ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber);

        if (curItem != null)
        {
            curNumber = this.getTOCReference(curNumber, !IsParent);
            return  CheckForDuplicates(curNumber, IsParent);
        }
        else
        {
            return curNumber;
        }
0
ответ дан 3 September 2019 в 00:30
поделиться