The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск пакетного менеджера Pacman 5.0, opennews (ok), 31-Янв-16, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


9. "Выпуск пакетного менеджера Pacman 5.0"  –8 +/
Сообщение от pethead (ok), 31-Янв-16, 05:41 
Ппкс.
Systemd не дураки делали.
Он очень строен и красив.
Ответить | Правка | Наверх | Cообщить модератору

49. "Выпуск пакетного менеджера Pacman 5.0"  +2 +/
Сообщение от Yet_Another_Anonymous (?), 31-Янв-16, 22:31 
> Ппкс.
> Systemd не дураки делали.
> Он очень строен и красив.

Функции на 500 строк кода, принимающие 15 аргументов — это стройно и красиво?

Ответить | Правка | Наверх | Cообщить модератору

50. "Выпуск пакетного менеджера Pacman 5.0"  –2 +/
Сообщение от systemdhater (?), 31-Янв-16, 22:51 
> Функции на 500 строк кода, принимающие 15 аргументов — это стройно и красиво?

Вот извините, конечно, но качество кода (не в плане архитектуры, а в плане стиля) в systemd как раз хорошее.

Когда я последний раз просил продемонстрировать "функцию на 500 строк" мне показали какой-то switch с кучей case. Заменить это они хотели, наверное, виртуальными функциями и 500 разными классами, каждый из которых реализовал бы один case.

Можете продемонстрировать ваше утверждение? Например, показав функцию с 15 аргументами?

Вся ненависть к systemd связана с политикой навязывания и непродуманным поведением, но никак не с качеством кода.

Ответить | Правка | Наверх | Cообщить модератору

68. "Выпуск пакетного менеджера Pacman 5.0"  +1 +/
Сообщение от Нимано (?), 01-Фев-16, 18:44 
> Вот извините, конечно, но качество кода (не в плане архитектуры, а в плане стиля) в systemd как раз хорошее.


strcpy(mempcpy(mempcpy(r, f, a + 1), i, b), e);
...
if (!path_is_absolute(option+7))
...
arg_header = strdup(option+7);
...
ret = new(char, (e - slice) + 1 + strlen(name) + 6 + 1);

Ага, прям офигительное.
Ответить | Правка | Наверх | Cообщить модератору

71. "Выпуск пакетного менеджера Pacman 5.0"  –2 +/
Сообщение от Аноним (-), 01-Фев-16, 20:57 
> strcpy(mempcpy(mempcpy(r, f, a + 1), i, b), e);

Из контекста не вырывайте, пожалуйста. Конечно, в этом случае значительно читабельнее было бы что-то типа

strcpy(mempcpy(mempcpy(function_result, file_name, character_before_last_slash_index_in_file_name + 1), new_file_name, last_slash_index_in_new_file_name), file_extension);

или

char *function_result_directory_path_end = mempcpy(function_result, file_name, last_slash_index_in_file_name + 1);

char *function_result_directory_and_basename_path_end = mempcpy(function_result_directory_path_end, new_file_name, last_slash_index_in_new_file_name);

strcpy(function_result_directory_and_basename_path_end, file_extension);

а ещё лучше

char *function_result_directory_path_end = copy_memory_slice_and_return_pointer_to_the_end(function_result, file_name, last_slash_index_in_file_name + 1);

char *function_result_directory_and_basename_path_end = copy_memory_slice_and_return_pointer_to_the_end(function_result_directory_path_end, new_file_name, last_slash_index_in_new_file_name);

copy_string_to(function_result_directory_and_basename_path_end, file_extension);

но это вам в яву.

Не могу сказать без просмотра всей функции, но наверняка у каждой переменной есть смысл, очевидный, если смотреть всю функцию в целом. Например, r - result, f - filename, e - extension, и т.д. И лично мне удобнее прочитать этот однострочник, чем то, чем его пытаются обычно заменить (см. выше).

Ответить | Правка | Наверх | Cообщить модератору

73. "Выпуск пакетного менеджера Pacman 5.0"  +1 +/
Сообщение от Нимано (?), 02-Фев-16, 03:20 
>> strcpy(mempcpy(mempcpy(r, f, a + 1), i, b), e);
> Из контекста не вырывайте, пожалуйста.

https://github.com/systemd/systemd/blob/fdb4ee00f022863ceee9...


int unit_name_replace_instance(const char *f, const char *i, char **ret) {
        const char *p, *e;
        char *s;
        size_t a, b;

        assert(f);
        assert(i);
        assert(ret);

        if (!unit_name_is_valid(f, UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE))
                return -EINVAL;
        if (!unit_instance_is_valid(i))
                return -EINVAL;

        assert_se(p = strchr(f, '@'));
        assert_se(e = strrchr(f, '.'));

        a = p - f;
        b = strlen(i);

        s = new(char, a + 1 + b + strlen(e) + 1);
        if (!s)
                return -ENOMEM;

        strcpy(mempcpy(mempcpy(s, f, a + 1), i, b), e);

        *ret = s;
        return 0;
}

> strcpy(mempcpy(mempcpy(function_result, file_name, character_before_last_slash_index_in_file_name + 1), new_file_name, last_slash_index_in_new_file_name), file_extension);

не передергивайте.

Ответить | Правка | Наверх | Cообщить модератору

77. "Выпуск пакетного менеджера Pacman 5.0"  –1 +/
Сообщение от Аноним (-), 02-Фев-16, 21:57 
> не передергивайте.

Ну давайте расскажу, как _я_ воспринимаю этот код.

30 секунд просмотра функции, и я понимаю следующее: f обозначает filename, i - instance, ret - возвращаемое значение. Имена a и b ничего не обозначают (но по коду далее видно, что они хранят длины соответственно первой и второй незаменяемых частей юнита).

Сам я systemd не пользовался, поэтому не знал, для чего нужна @ в именах юнитов. Добавим сюда ещё 5 минут гугления, какой формат имеет имя юнита, и чтения (точнее, чтения первого абзаца, содержащего символ @) http://man7.org/linux/man-pages/man5/systemd.unit.5.html (тот, кто правит код systemd имхо должен знать ту часть, что необходима для понимания данного фрагмента).

Теперь также ясно, что e - extension, p - либо part (заменяемая часть, типа tty3 с ведущим символом @), либо pointer, s - просто string, так же как циклах принято делать итерацию по i (от integer).

Из имени функции я предполагаю, что она должна заменять инстанс юнита f (на который указывает p+1) инстансом i.

"s = new" - выделение памяти.

А пример со вложенным вызовом mempcpy взят из man mempcpy и может считаться стандартным.

Возможно, я не прав и сказывается собственный сишный опыт, но для меня понять, что делает конкретно озвученная ранее строка, не проблема. При этом мне не надо постоянно переходить по разным методам, как это принято в java и c++ , у меня вся функция помещается на одном экране. И лично для меня идентификаторы p и e выглядят более "различными визуально", чем, например, "unit_name_part и unit_name_ext".

Я бы сказал, что это пример каноничного C, где идентификаторы сокращаются насколько это возможно (но не меньше), по этой же причине при итерации вы пишете "for (i=0; i<10; i++)", а не "for(index=0; index<10; index++)".

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру