Заголовок не точно значим, но я не доля, что еще назвать его. Я написал код Поколения 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, который должен был быть возвращен, также был сброшен.
Я ценил бы любую справку на этом.
Когда у вас есть единственный параметр 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 разные вещи в зависимости от аргументов метода. И, конечно, юнит-тесты, чтобы вы могли быть уверены, что он делает то, что вы говорите!
Я не знаю, что вы ищете.
Я предполагаю, что вы ожидаете чего-то вроде следующего.
Существующий вызов:
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;
}