Какие соглашения об именах вы придерживаетесь с функциями, которые выделяют память? - PullRequest
2 голосов
/ 19 ноября 2010

Итак, вот две функции, которые делают почти одно и то же.

Как бы вы назвали каждый из них, если бы вам пришлось включить оба в ваш проект?

void strToLower1(char* str)
{
    int len = strlen(str);

    int i;
    for (i=0; i<len; i++)
        str[i] = tolower(str[i]);
}

char* strToLower2(const char* inputStr)
{
    char* str = strdup(inputStr);
    strToLower1(str);
    return str;   // must be freed
}

РЕДАКТИРОВАТЬ: я изменил приведенный выше пример для корректности кода (sheesh)

Ответы [ 4 ]

2 голосов
/ 19 ноября 2010

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

http://pcroot.cern.ch/TaligentDocs/TaligentOnline/DocumentRoot/1.0/Docs/books/WM/WM_67.html#0

Используйте специальные имена для копирования, создания, и принять процедуры

Подпрограммы, которые распределяют, управляют или взять на себя ответственность за хранение есть специальные имена и соблюдать следующие рекомендации:

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

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

Рутины, которые оставляют объект и передать ответственность за удаление на звонящий начинается с сироты ...

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

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

[Содержание] [Предыдущий] [Следующий] Нажмите значок для отправки вопросов или исправления об этом материале Талигентный персонал. Copyright © 1995 Taligent, Inc. Все права защищены.

После этого первый метод может называться createLowerCaseStr() или copyAsLowercaseStr(). Ведущие ключевые слова create и copy указывают новую память, которая должна управляться вызывающей стороной.

Лично я бы назвал 2-ю функцию transformIntoLowercase() или mutateIntoLowercase(), но я склонен к длинным именам. Хотя Taligent не указывает, я вижу ключевые ключевые слова transform и mutate как подсказки для преобразования, выполненного на месте.

1 голос
/ 19 ноября 2010

1-й: char *copylo(char *dst, const char *src); (без ассигнований!)
2-й: char *lowerize(char *data);

1 голос
/ 19 ноября 2010

Если strToLowerInPlace вернул 'str', вы можете просто написать new_s = strToLowerInPlace(strdup(s)).Таким образом, я бы отбросил «InPlace» и предположил бы, что все было на месте, и вызывающая сторона может дублировать при необходимости.

(И если у вас будет две функции, по крайней мере, сделайтекопирование одного звонка на место одного!)

0 голосов
/ 19 ноября 2010
  • есть функция с именем tolower(), нет необходимости проводить сумасшедшее тестирование и жестко запрограммированное преобразование
  • , если у вас уже есть функция, создающая нижний регистр на месте, почему вы переопределяете код вверсия "не на месте"?
  • название ок
...