0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
1

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

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

Студворк — интернет-сервис помощи студентам
Всем привет. Только что написал пробную реализацию динамических строк на си. Товаарищи, дайте отзыв о этой библиотеке. Качество кода и так далее) Ссылка: https://github.com/maksspace/dynamic-string
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2015, 22:21
Ответы с готовыми решениями:

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

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

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

Прошу дать оценку оптимизации сайта
Собственно интересует один поисковый запрос, не считая НЧ - они сами нашлись... Сайт:...

8
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 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
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
10.11.2015, 22:25  [ТС] 3
Меня уже ткнули носом на linux.org) Я переписал эту библиотеку и много что понял) если не сложно посмотри ее еще раз) ДУмаю теперь ситуация стала лучше)

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

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

Продумайте архитектуру вцелом. А то сброд и шатание какое-то. Вот этот геморрой
C
1
int PrivateDynStr_CapacityResize(DynStr_t *str, size_t new_capacity)
вообще лечится ключевым словом статик. И не надо наворачивать приваты какие-то... Пораскиньте мозгами еще.
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
11.11.2015, 15:48  [ТС] 5
Я про стиль честно говоря не понимаю, почему он стал еще хуже. Из-за длинных названий функций и не c-шного варианта именования? Для меня так strcasestr не чуть не понятнее чем DynStr_CaseStrCh, длиннее - очевидно да, но не понятнее. Какой стиль вы считаете хорошим? Если можно пример) Я думал как сделать назвать функции, что бы они давали ощущение какой-то высокоуровневости. А почему асерты не в тему? Там есть где нужно бы убрать, но они же не везде лишние? Например где указатели на строки ? Дайте пожалуйста пример хорошего стиля, я хочу понять что не так.
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 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
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
11.11.2015, 16:32  [ТС] 7
А как вообще тогда правильно обрабатывать скажем нулевой указатель на строчку или что то совсем не валидное? Асерт понятно сразу закончит выполнять код, выдав сообщение с описанием ошибки. Получается входные данные лучше вообще не проверять внутри методов библиотеки, оставляя это на совести пользователя? или если и проверять то писать в stderr сообщение об ошибке ?
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
11.11.2015, 16:50 8
Цитата Сообщение от maksspace Посмотреть сообщение
Получается входные данные лучше вообще не проверять внутри методов библиотеки, оставляя это на совести пользователя?
Почему, обязательно. Вопрос в том, что делать в каждом случае. Для этого, на этапе продумывания архитектуры каждой функции нужно определять все возможные ошибочные ситуации и решать, что делать в каждом конкретном случае. Например, вот у вас есть возможность там, где это уместно, возвращать коды ошибок. Так и сделайте это. Вам ничто не мешает.
1
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 10
14.11.2015, 12:29  [ТС] 9
вот текущая версия: https://github.com/maksspace/dynamic-string. что скажете? )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2015, 12:29
Помогаю со студенческими работами здесь

Прошу дать оценку проделанной работе...
Здравствуйте уважаемые гуру-форумчане! Хочу попросить Вас дать оценку сайту...

Дать оценку книге И. Квинт - HTML и CSS
Кто учился по этой книге? И. Квинт HTML и CSS. кто что может о ней рассказать? удобная ли книга для...

Нужно дать оценку кода shortstory.tpl
Добрый день. Делаю адаптацию шаблона под dle 11. На данный момент редактирую shortstory.tpl (...

Прошу дать оценку связке проц+видеокарта. Подбор комплектующих
Добрый день! Тяготею пока к связке Процессор Intel Core i3-8100 + GeForce GTX 1050 Ti OC. Сам...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru