|
|
|
Coding style или нет09.02.2012, 19:56. Показов 6237. Ответов 60
Метки нет (Все метки)
Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
0
|
|
| 09.02.2012, 19:56 | |
|
Ответы с готовыми решениями:
60
border-style нет нужного canvas.не меняется brush.style & pen.style Как удалить стиль определенный между <style></style> |
|
|
||
| 10.02.2012, 14:08 | ||
|
0
|
||
|
Заблокирован
|
||
| 10.02.2012, 14:10 | ||
|
Но у меня другой подход - бритва Оккама. Если можно что то не делать - этого делать не нужно. Если данному куску кода не нужен данный объект, то нет ни одной причины вообще создавать этот ненужный объект. Таким образом, кусок кода, которому не нужна сущность - просто не должен её создавать. Итого: мы возвращаемся к моей канонической форме: объявляются необходимые сущности. Используются. Затем чистка (которая по большому счету сводится к ничего не деланию). Иногда бывают особые моменты, когда могут потребоваться дополнительные временные объекты. На самом деле требуются некие услуги, которые можно через них поиметь, а не сами объекты. Можно просто сделать отдельную inline функцию, на которую свалить задачу по предоставлению данной услуги. Это оградит основной алгоритм от ненужных ему подробностей реализации, и избавит от присутствия совершенно не нужных ему временных объектов: //здесь кучка кода ... выходные_данные = foo(входные); //мелкая услуга ... //остальной код ... выходные_данные = foo(входные); //ещё какая нибудь мелкая услуга ... С точки зрения "большого" куска кода, все объекты которые он используют - нужны. Временных, или лишних не существует. Как работают мелкие поставщики услуг - их собственные трудности.
0
|
||
|
|
|||||||
| 10.02.2012, 14:14 | |||||||
0
|
|||||||
|
|
|||||||||
| 10.02.2012, 14:23 | |||||||||
Добавлено через 4 минуты
0
|
|||||||||
|
|
||
| 10.02.2012, 14:32 | ||
|
Evg
но ты ведь вел речь об экономии памяти в стринге ну и о том что он будет висеть до конца процедуры. для этого там есть clear(). и динамическая память очистится. с деструкторами это уже так полезли не в ту сторону. изначальная мысль - в с++ нет удобных средств для очистки памяти пока идет выполнение программы со строкой из твоего примера. возражаю они ЕСТЬ, это либо предусмотренные функции очистки в библиотченых классах. либо кривизна с деструктором. ну а сам по себе стринг много места не занимает - ты сам писал. и уж если и это критично то можно не использовать стринг.
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.02.2012, 14:34 | |
|
AzaKendler, никогда не обнулял указатель в деструкторе. Потому что не для того деструктор предназначен, чтобы когда нам заблагорассудится вызывался. Он должен вызываться для одного объекта один раз, при уничтожении, и точка. Это как с const_cast. Он вроде как есть, и его даже вроде как можно использовать, но если из-за него программа свалится в рантайме, то программист сам дурак.
Ну и плюс к тому, в своих классах можно обо всём позаботиться (напихать ключей, которые будут говорить, закрыт ли файл, разорвано ли соединение, очищена ли память, и проверять всё это в деструкторе), но проблема в том, что мы чаще используем чужой код, а не собственный. И при этом надо знать, что деструктор не предназначен для вызова вручную, и что если такой вызов будет иметь и место и затем будет иметь место падение в рантайме, то программист снова сам дурак.
0
|
|
|
Заблокирован
|
||||||||
| 10.02.2012, 14:36 | ||||||||
Иногда, исключительно для читабельности, есть смысл завести промежуточный объект. Но это переменные типа int какие нибудь... Если же в качестве такого промежуточного объекта просится очень тяжелый объект - явно что то не в порядке в самой архитектуре. Пример того, чего быть не должно: MyClass a,b; //оч тяжелые объекты ... MyClass c = a; a=b; b=c; Пример того, что должно быть: a.Swap(b); //перенацелятся лишь парочка указателей. Никакого копирования. Суть в том, что если объекты тяжелые, но их нужно свапить - для этого заранее должен быть предусмотрена такая возможность. 1. Весь код представляет собой монолитную размазню. 2. Код разбит на функции. И если вспомогательных функций получился десяток другой, значит ваш "нормально читаемый код" просто хардкорно забил их текст внутри себя - монолитная чача. Можно написать все в теле одной мега-раздутой функции. Можно разбить на десяток мелких. Но само по себе "количество" кода либо не изменится, либо уменьшится, но только в случае разбиения на функции.
0
|
||||||||
|
|
|
| 10.02.2012, 14:36 | |
|
silent_1991, немного смысл утерян диалога. я выше в посте пометил почему началась эта тема.
конечно деструктор не нужно дергать дела без дела, а нужно только при необходимости/ А обнулять указатели надо по любому. поскольку в с++ delete нулевого указателя - это не ошибка, просто ничего не делается а вот не обнуленного но уже ссылающегося на очищенную память - краш
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||
| 10.02.2012, 14:45 | |||
|
Evg, Bers прав... Если функция настолько велика, что вынуждает объявлять переменные в ее середине (без явных на то оснований), то это уже "говнокод". От величины и сложности проекта не зависящий.
0
|
|||
|
|
|||
| 10.02.2012, 14:52 | |||
|
Bers, вот тебе фрагмент отладчика gdb: файл infrun.c. См. функцию handle_inferior_event. Это одна большая логическая последоваттельность действий, которая потеряет всякую логику, будучи искусственно разбитой на маленькие запчасти Добавлено через 1 минуту
0
|
|||
|
Заблокирован
|
||
| 10.02.2012, 14:55 | ||
|
Но вот по опыту скажу, что очень рад, что не нулил указатели после удаления. Ибо повторное удаление у меня возникало исключительно из-за программных ошибок. Стало быть, я об этих ошибках узнавал, и исправлял. А если бы программка тихо промолчала - стало быть, и не узнал бы я, что у меня прокрался баг. Из этих соображений, решил я ставить ассерт перед удалением. И ежели указатель уже ноль - стало быть в дебаге мне мой код об этом поведует. А в релизе сохранит работоспособность.
1
|
||
|
|
|||
| 10.02.2012, 15:01 | |||
|
Это уже более философский вопрос, касающийся того "а что за человек писал код". Добавлено через 3 минуты Bers, ну если ты предпочитаешь так проверяться то да. ты практикующий постоянно судя по всему. к тебе можно прислушаться. но при тестах ты можешь и не найти ту ошибку которая приводит к крашу и не обнаружить какие то петли и повторные вызовы. это может произойти у клиента. ну а если будет 0, то будет работать пока ты готовишь апдейты или проводишь доп тесты. ну это такая фантазия я же лишь черпаю информацию из книг и форума. в книгах рекомендуют нулить. Добавлено через 1 минуту
0
|
|||
|
|
||
| 10.02.2012, 15:05 | ||
|
если инит не вызван то указатель так и будет 0, и в деструкторе будет delete 0. если инит отработает то будет что то удалено из памяти в деструкторе как и задумывалось
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.02.2012, 15:05 | |
|
AzaKendler, clear в том же стринге память не очищает. В векторе, например, тоже. Т.е. ни стринг, ни вектор вообще никогда не уменьшают размера. Пример:
http://liveworkspace.org/code/... 8864746f5c Напомню, что capacity возвращает количество элементов, которое контейнер может вместить без очередного выделения памяти.
0
|
|
|
|
|
| 10.02.2012, 15:10 | |
|
silent_1991, тогда resize(0). за клиар сорри. спасибо за уточнения уж если писать то точно.
имел ввиду принцип очистки до удаления. напутал функцию
0
|
|
|
Заблокирован
|
||
| 10.02.2012, 15:11 | ||
|
Дебаг - это версия для отладки. Релиз - это версия для клиента. В дебаге ассерты срабатывают. В релизе, код проверок будит выброшен препроцессором и не будет скомпилирован. Перед удалением у меня стоит ассерт, который сработает, если указатель нулевой. А после удаления, соответственно, зануляет указатель. Таким образом, в дебаге у меня будет проверка на попытку двойного удаления. А в релизе никаких проверок вообще уже не существует. Но так как указатели зануляются, то попытка двойного удаления вреда не нанесет. Поэтому, в дебаге я сразу узнаю, если будет такой косяк. А в релизе - ну.. есть надежда, что приложение выживет. Тут есть свои нюансы: например, если объект в принципе имеет право "не выделять динамическую память". Допустим, при создании, он ещё пустой, и его указатель нулевой. То.. он имеет право делетить нулевой указатель. А если объект при создании автоматически выделяет память - тогда не имеет.
1
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
| 10.02.2012, 15:17 | ||||||
|
AzaKendler, clear и есть resize(0). Невозможно уменьшить размер выделенной в строке памяти извне. Даже reserve(0) не поможет.
Добавлено через 1 минуту Вру. Можно так:
Но это только со строкой. Вектор совершенно отказывается "расти вниз".
0
|
||||||
|
Заблокирован
|
||||||
| 10.02.2012, 15:18 | ||||||
|
silent_1991
0
|
||||||
|
|
|
| 10.02.2012, 15:19 | |
|
silent_1991, чтож остается только swap с пустым классом
0
|
|
| 10.02.2012, 15:19 | |
|
Где хранится element.style или изменить width дива Присвоить div-у атрибут class или style и вписать в них данные SOS Coding Input Good Coding Practices Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|