typedef a std :: string - Лучшие практики - PullRequest
5 голосов
/ 01 января 2009

Я пишу библиотеку на стандартном C ++, которая выполняет фонетическое преобразование. Я использовал std :: string на данный момент. Но в будущем мне, возможно, придется изменить это на что-то другое (std :: wstring или что-то еще). Поэтому мне нужно написать свою библиотеку таким образом, чтобы я мог легко это переключать. До сих пор я сделал следующее:

  1. Создан заголовочный файл, который будет использоваться всеми файлами CPP
  2. Добавил «typedef std :: string» к этому и использовал новое имя везде в файле.

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

Спасибо

Ответы [ 5 ]

5 голосов
/ 01 января 2009

Вы можете написать шаблонные функции, которые будут работать с любым типом строки или, в этом отношении, с любыми подходящими методами.

Если вы сделаете typedef так, как вы предлагаете, вам потребуется изменить весь ваш код в будущем, когда вы измените typedef. Я бы рекомендовал против этого.

Редактировать: дело в том, что строка и строка не являются взаимозаменяемыми. Конечно, вы сможете обновить свою библиотеку, изменив одну строку, но это только начало - изменение typedef означает, что вы меняете публичный API вашей библиотеки. Вам придется изменить и протестировать весь код, который взаимодействует с вашей библиотекой, и это может представлять большую часть вовлеченной работы. Возможно даже, что для обновления вашей библиотеки достаточно простого поиска и замены, и тогда typedef вам ничего не купит.

Стоит придерживаться стандартных типов, которые все знают и понимают.

2 голосов
/ 01 января 2009

Я думаю, что определение типа std :: string является разумным. Вы все еще связаны с интерфейсом, хотя. Если вы когда-нибудь переключитесь на строковую реализацию с несовместимым интерфейсом, вы можете изменить значение вашего typedef на некоторый класс адаптера. В C ++ вы можете сделать это с минимальными затратами или без затрат. Изменение на новый тип строки тогда подразумевает изменение класса адаптера. Если вы часто меняете адаптер, вы можете установить его в качестве шаблона.

Вы все еще не застрахованы от других (или самих себя в будущем), забывших о typedef и непосредственно использующих std :: string.

1 голос
/ 01 января 2009

Если вы ожидаете, что строка должна измениться в будущем, рекомендуется абстрагировать ее от остальной части кода.

Typedef или выделенный класс - оба способа сделать это.

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

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

Итак: знай свои потребности и решай.

0 голосов
/ 01 января 2009

Это будет работать до тех пор, пока в будущем все, что вы замените std :: string, будет иметь те же методы, конструкторы и т. Д., Что и std :: string. Например, это не будет работать с std :: wstring, потому что его методы работают с широкими символами, а не с символами.

Если вы действительно планируете поменять тип в будущем, вероятно, будет хорошей идеей инкапсулировать ваши данные в пользовательский класс с необходимым интерфейсом для начала, а затем изменить реализацию, оставив интерфейс так же. std :: string, вероятно, слишком "примитивен" для вашего приложения.

0 голосов
/ 01 января 2009

Я бы создал класс, у которого std :: string в качестве частного члена. Затем вам нужно будет переопределить методы, которые вы хотите использовать, но если вы переключите тип строки в будущем, все, что вам нужно будет сделать, это переписать этот класс.

typedef будет хорошо работать для переключения со строки на wstring, но переключение на класс строки с другим интерфейсом будет не очень простым (т. Е. Qstring).

...