Использование объекта против строки против перечисления - PullRequest
0 голосов
/ 09 июня 2009

У меня есть ситуация, которая может показаться нелепой, но я не смог найти достаточно хорошего решения. Чтобы упростить задачу, проблема заключается в следующем: предположим, что у вас есть объект, такой как «Производитель», у которого есть свойство названия страны (например, car.Manufacturer.CountryName), и вы хотите быть уверены, что у свойства названия страны не может быть дубликатов, орфографических ошибок или других ошибок.

Это в основном строковое свойство, но строка может быть чем-то, что мне не нужно. Объект кажется излишним, а перечисление означает, что мне нужно перекомпилировать, если нужно добавить новые страны или изменить существующие.

Я мог бы легко контролировать это в графическом интерфейсе, но мне нужно контролировать это в коде приложения. Таким образом, у меня есть объект со свойством, которое может быть строкой, объектом или перечислением (или другим), и я не могу решить, какой использовать. Итак, мои варианты примерно такие:

a) Управляйте этим в графическом интерфейсе и не проверяйте это в коде приложения, рискуя получить «нелегальные» названия стран.

b) Создайте объект (Страна) и используйте его, который является избыточным и усложняет код, но я полностью контролирую дубликаты и все такое.

в) Используйте перечисление и надейтесь, что мне не придется перекомпилировать слишком часто. Это простое и эффективное, но статичное решение.

d) Использовать внутренний список строк допустимых названий стран, указав CountryName в качестве строкового свойства и убедиться, что оно проверено на соответствие этой строке. Я получаю подтверждение, и CountryName - это простая строка, но что, если я изменю эту внутреннюю строку с допустимыми названиями стран? После того, как я должен сделать код, он снова проверяет все объекты-изготовители в программе, чтобы удостовериться, что у них все еще есть правильные имена.

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

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

К счастью, ваш! Hal

Ответы [ 5 ]

1 голос
/ 09 июня 2009

Я бы использовал словарь, хранящийся в отдельном файле, например Список свойств XML , что-то вроде:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>UK</key> 
    <string>United Kingdom</string> 
    <key>FR</key>
    <string>France</string>
    <key>SP</key>
    <string>Spain</string>
</dict> 
</plist> 
1 голос
/ 09 июня 2009

Идите с объектом.

Это действительно сводится к случаю выполнения «сложной» работы сейчас, и жизнь становится проще в дальнейшем, или выбирайте легкий путь сейчас, а жизнь может быть более «сложной» позже.

Кроме того, учитывая, что вы на самом деле беспокоитесь обо всех негативах вариантов b, c & d, просто удалите свои заботы!

Также, как другие предлагали, ваши данные должны храниться снаружи в коде (база данных, XML-файл и т. Д.), И запись объекта для переноса будет вашим лучшим решением.

1 голос
/ 09 июня 2009

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

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

1 голос
/ 09 июня 2009

в) Используйте перечисление и надейтесь, что мне не придется перекомпилировать слишком часто. Это простое и эффективное, но статичное решение.

Из этого утверждения я могу сделать вывод, что ваши данные могут быть изменены. В этих ситуациях я предлагаю использовать внешнее хранилище данных (база данных, текстовый файл, файл XML и т. Д.).

0 голосов
/ 09 июня 2009

Может быть другой вариант:

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

Другая хитрость заключается в использовании отдельного объекта (который имеет только один экземпляр) для обработки названий стран. Это гарантирует, что все объекты используют самую последнюю версию списка названий стран. В этом случае объекты производителя не имеют списка строк, но имеют ссылку на уникальный объект, содержащий список строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...