Форум программистов, компьютерный форум, киберфорум
Наши страницы
C (Си)
Войти
Регистрация
Восстановить пароль
 
maksspace
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
#1

Динамические строки - дать оценку коду

08.11.2015, 22:21. Просмотров 377. Ответов 8
Метки нет (Все метки)

Всем привет. Только что написал пробную реализацию динамических строк на си. Товаарищи, дайте отзыв о этой библиотеке. Качество кода и так далее) Ссылка: https://github.com/maksspace/dynamic-string
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 22:21
Ответы с готовыми решениями:

Дать пояснения к коду шифрования строки
#include <stdio.h> int main() { const int n = 26, k = 15; int A, i; char...

Дать пояснения к коду
я не понимаю выделенные моменты помогите пож-та #include <iostream> ...

Дать на вход программе файл через аргументы командной строки
Как реализовать в Visual Studio две вещи 1)Дать на вход программе файл...

динамические строки в си ++
помогите с обрашением к символам динамической строки. Заранее спасибо ...

Объединить две динамические строки
Здравствуйте. Я хочу объединить две строки: char*dir="dir "; char *p;...

8
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
09.11.2015, 11:23 #2
В общем глянул одним глазом. Сразу скажу, что встал с утра не с той ноги, так что не обессудьте.

Общие замечания:
1) названия хэдера и соответствующего сишника лучше заменить, чтобы у пользователя путаницы не возникало;
2) стиль кодирования хромает. Почитайте гайды, выберите что-то для себя и применяйте.
3) конст-корректность как следствие п.2
4) названия функций не точно отражают суть. Например функция str_delete на самом деле не удаляет строку, а освобождает память. Соответственно было бы логично назвать str_release к примеру. То же самое относится к функции конкатенации и другим;
5) нет механизма определения и обработки ошибочных ситуаций.

Частные:
1) функция
C
1
2
3
4
5
6
7
8
void str_delete(string_t * strptr)
{
    if(strptr != NULL)
    {
        free(strptr);
        strptr = NULL;
    }
}
содержит баг. Утекает память по указателю на данные.
2) напрасно не используете функции стандартной библиотеки в str_addstr, str_print и других.
3) функцию str_addchr было бы логично сделать с использованием str_addstr как частный случай. То же самое можно сказать про пару str_isequal/str_isequalchars.

Ну и вообще интуитивно не понятно как использовать. Вот я прочитал описание функции
C
1
2
3
4
5
6
/**
 * Make empty string
 * @param pointer to string_t
 * @return void
 */
void str_mkempty(string_t * strptr)
Ок, пробуем:
C
1
2
3
4
5
6
7
int main(void)
{
  string_t str;
 
  str_mkempty(&str);
  return 0;
}
Крэш... Такие дела.
2
maksspace
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
10.11.2015, 22:25  [ТС] #3
Меня уже ткнули носом на linux.org) Я переписал эту библиотеку и много что понял) если не сложно посмотри ее еще раз) ДУмаю теперь ситуация стала лучше)

https://github.com/maksspace/dynamic-string

Добавлено через 2 минуты
А почему стиль кодирования хромает)?
0
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
11.11.2015, 12:00 #4
Цитата Сообщение от maksspace Посмотреть сообщение
ДУмаю теперь ситуация стала лучше)
Имхо, стало только хуже... Стиль вообще превратился... Я даже не знаю, как это словами выразить. Вы что за образец взяли? Ассерты ни к селу, ни городу навтыкали повсюду... Жесть.

Продумайте архитектуру вцелом. А то сброд и шатание какое-то. Вот этот геморрой
C
1
int PrivateDynStr_CapacityResize(DynStr_t *str, size_t new_capacity)
вообще лечится ключевым словом статик. И не надо наворачивать приваты какие-то... Пораскиньте мозгами еще.
0
maksspace
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
11.11.2015, 15:48  [ТС] #5
Я про стиль честно говоря не понимаю, почему он стал еще хуже. Из-за длинных названий функций и не c-шного варианта именования? Для меня так strcasestr не чуть не понятнее чем DynStr_CaseStrCh, длиннее - очевидно да, но не понятнее. Какой стиль вы считаете хорошим? Если можно пример) Я думал как сделать назвать функции, что бы они давали ощущение какой-то высокоуровневости. А почему асерты не в тему? Там есть где нужно бы убрать, но они же не везде лишние? Например где указатели на строки ? Дайте пожалуйста пример хорошего стиля, я хочу понять что не так.
0
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
11.11.2015, 16:17 #6
Он у вас стал менее консистентным что-ли. Я пока не могу на человеческую мысль это переложить. Вот смотрите у вас то полные названия функций, то с сокращениями, то вообще с верхним регистром:
C
1
2
3
4
5
int PrivateDynStr_CapacityResize(DynStr_t *str, size_t new_capacity)
/*...*/
void DynStr_AppendStrCh(DynStr_t *dst, const char *src)
/*...*/
void DynStr_AppendDYNSTR(DynStr_t *dst, const DynStr_t *src)
То же касательно параметров кстати.
Цитата Сообщение от maksspace Посмотреть сообщение
что бы они давали ощущение какой-то высокоуровневости
Вот этого не надо. Они должны:
а) быть понятными
б) работать
Все.

Что касается ассертов. Это средство отлова багов. Именно багов, а не ошибочных ситуаций. То есть, если у вас грамотно поставлена обработка ошибок, то пользователь может иметь возможность:
а) как-то своим способом их обработать и, по желанию, сохранить имеющиеся данные
б) продолжить выполнение в нужном ему ключе.
Ассерт же просто вырубит все к черту, что есть очень и очень плохо.

По поводу стиля, почитайте о стиле кодирования в гугле, id software. Тут на форуме по-моему где-то была тема с ссылками на всякие гайды. Поищите.
0
maksspace
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
11.11.2015, 16:32  [ТС] #7
А как вообще тогда правильно обрабатывать скажем нулевой указатель на строчку или что то совсем не валидное? Асерт понятно сразу закончит выполнять код, выдав сообщение с описанием ошибки. Получается входные данные лучше вообще не проверять внутри методов библиотеки, оставляя это на совести пользователя? или если и проверять то писать в stderr сообщение об ошибке ?
0
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
11.11.2015, 16:50 #8
Цитата Сообщение от maksspace Посмотреть сообщение
Получается входные данные лучше вообще не проверять внутри методов библиотеки, оставляя это на совести пользователя?
Почему, обязательно. Вопрос в том, что делать в каждом случае. Для этого, на этапе продумывания архитектуры каждой функции нужно определять все возможные ошибочные ситуации и решать, что делать в каждом конкретном случае. Например, вот у вас есть возможность там, где это уместно, возвращать коды ошибок. Так и сделайте это. Вам ничто не мешает.
1
maksspace
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
14.11.2015, 12:29  [ТС] #9
вот текущая версия: https://github.com/maksspace/dynamic-string. что скажете? )
0
14.11.2015, 12:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2015, 12:29

Формирование символьной строки, что соответствует двоичному коду
Всем добрый день, прошу помочы с программой: Условие: Разработать функцию,...

Объединить две динамические строки
Здравствуйте. Я хочу объединить две строки: char*dir="dir "; char *p;...

Прошу дать примерную оценку стоимости
ЦП DualCore AMD Athlon 64 X2, 2400 MHz (10 x 240) 3800+ Системная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru