Я разрабатываю класс, который хранит (кэширует) набор данных. Я хочу посмотреть значение, если класс содержит значение, затем использовать его и изменить свойство класса. Я обеспокоен дизайном общедоступного интерфейса.
Вот как будет использоваться класс:
ClassItem *pClassItem = myClass.Lookup(value);
if (pClassItem)
{ // item is found in class so modify and use it
pClassItem->SetAttribute(something);
... // use myClass
}
else
{ // value doesn't exist in the class so add it
myClass.Add(value, something);
}
Однако я не хочу предоставлять ClassItem этому клиенту (ClassItem - это деталь реализации MyClass).
Чтобы обойти это, можно рассмотреть следующее:
bool found = myClass.Lookup(value);
if (found)
{ // item is found in class so modify and use it
myClass.ModifyAttribute(value, something);
... // use myClass
}
else
{ // value doesn't exist in the class so add it
myClass.Add(value, something);
}
Однако это неэффективно, так как Modify должен будет выполнить поиск снова. Это предполагает использование метода lookupAndModify:
bool found = myClass.LookupAndModify(value, something);
if (found)
{ // item is found in class
... // use myClass
}
else
{ // value doesn't exist in the class so add it
myClass.Add(value, something);
}
Но объединение LookupAndModify в один метод кажется очень плохим дизайном. Он также изменяется только в том случае, если значение найдено, поэтому имя не только громоздко, но и вводит в заблуждение.
Есть ли другой лучший дизайн, который обходит эту проблему? Какие-нибудь шаблоны дизайна для этого (я не мог найти что-либо через Google)?