вы уж извините за прямоту, но это говнокод. от первой до последней строчки
LVV>typedef unsigned int node; // -- узел -- LVV>typedef unsigned short nline; // -- строка решетки -- пока достатчно short -- LVV>typedef unsigned short npos; // -- позиция в строке решетки -- достатчно short --
что мешает назвать node, node_line, node_line_position ?
LVV>int nArg; // -- количество параметров командной строки --
commandLineArgN или commandLineArgQty, или commandLineArgCount
LVV>npos L; // -- можно signed short
а тут почему не написали что такое L ?
.... и еще куча примеров как не надо писать код
LVV>// -- исправлено 26.03.11 ------- LVV> //if(orient != dominanta) // для доминанты считаем в конце цикла -- LVV> // can[orient] = NCheck(orient); // -- можно ли в принципе разместить по данной ориентации -- LVV> Condition = can[dominanta] = NCheck(dominanta); // -- условия окончания --
для этого есть система контроля версий
коментировать нужно не что код делает, а ПОЧЕМУ он это делает.
что делает код есть в нем самом, а почему — есть только в говах авторов
как пример:
у нас в софтину встроен бэкап\рестор базы. При ресторе файл бэкапа, который выбрал пользователь, сначала копируется в temp. Это сделано потому что файл может находиться на терминалке или на замаэпленом сетевом диске, которые сиквел-сервер не видит конечно же. Это не очевидно, и без коментариев кажется что код делает какие-то ненужные бестолковые операции.
Здравствуйте, monah_tuk, Вы писали:
Pzz>>У этого есть обратная сторона: чем понятнее выглядит ваш код, тем больше найдется желающих поковырять его по своему усмотрению, а потом объяснить вам, что если код в результате сломался — то это ваша бага, которую вы должны немедленно починить, потому что из-за вас вся работа стоит
_>Для этого есть контроль версий: бить того, кто поломал.
Вы не понимаете. В один прекрасный день вы получаете письмо от какого-нубудь Прабата Гавносранежада примерно следующего содержания: "Дорогой Алекс, я нашел в файле xxx функцию yyy(), которая делает практически то, что мне надо. Правда, когда я ее позвал, сработал ассерт в строке NNN, но я его закомментировал, и теперь программа работает почти как надо, только падает через полчаса. Пожалуйста, исправь эту багу ASAP, потому что нам надо успеть все сделать к следующему релизу, который по плану должен произойти неделю назад, а данный issue является show stopper'ом, и без его исправления мы не можем двигаться дальше.".
И вот сиди потом и думай, как объяснить Прабату, который уже записал себе в союзники Большое Начальство, что данная функция (кстати, локальная в файле) не предназначена для такого использования, и что если использовать ее именно таким образом, это ломает мои тщательно продуманные планы на развитие этого кода на следующие полгода вперед, и вообще, нужная ему функциональность была там чисто случайно и временно, а через неделю я планировал это место сильно изменить. Большое Начальство, разумеется, выступает на стороне Прабата, потому что ему тоже нужен следующий релиз (который и так уже опаздывает), а своими темпами Прабат его и через месяц не сделает.
И приходят в голову иногда такие мысли: а ведь если бы в том файле не было комментариев, Прабат эту функцию ни в жизнь бы не нашел
P.S. Все имена и фамилии являются вымышленными, любое совпадение является случайностью
Здравствуйте, LaptevVV, Вы писали:
LVV>Не, не люблю писать длинно... LVV>Ваши предположения — беспочвенны. С самого начала было npos. Комментарий — себе, просто напоминание. LVV>Его и не требуется сопровождать. Работа конкретная и разовая. Заказчика — устраивает достигнутый результат. LVV>Меня в ДАННОМ СЛУЧАЕ устраивает мой стиль, в котором разбираться только мне.
Научник? На одном заводе по сдельному договору писал программу, воплощала результаты какого-то исследования, научники в работе сделали реализацию алгоритма (видать тоже в стол работали, как они предполагали), мне предстояло использовать его... По сути дали его как чёрный ящик. Да вот только при определённых условиях он работал некорректно, пришлось лезть разбираться. Наверное не нужно говорить, что писателя мне хотелось убить. Поэтому в любой программе руководствуйся правилами:
1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл)
2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку).
Потомки тебе спасибо скажут. Тем более уже даже не только в IDE, даже простых редакторах есть автодополнение по тексту и прочие вкусности.
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Это 2 крайности, бросаться в которые глупо.
Глупо писать комментарии на каждый чих, так же глупо не писать их вовсе, да хоть какой бы там у вас читаемый код не был.
Комментарии должны быть написаны человеком, человеческим языком, для человека. Цель комментария — прояснить какие то детали читающему.
Как он будет эту цель достигать всё равно. Хоть "по фене" пиши если это поможет раскрыть тему и донести до читателя самою суть.
Вот как то так.
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Ну, традиционный подход заключается в том, что комментарии описывают, ЧТО программа делает, а код — КАК она это делает. Плюс, неочевидные места тоже надо описывать.
Если комментировать все, что можно, за комментариями сути не видно. А писать код так, чтобы комментарии были не нужны, невозможно. Вернее, возможно, но при одном условии: код тоже никому не нужен
> у нас в софтину встроен бэкап\рестор базы. сначала копируется в temp. Это сделано потому что файл может находиться на терминалке или на замаэпленом сетевом диске, которые сиквел-сервер не видит конечно же. Это не очевидно
А если бы код был нормальный, в нем бы проверялось — находится ли файл на терминалке или на замепленном диске и если не находится, то
1) лишних операций бы не выполнялось
2) было бы из кода понятно, почему эти операции нужны
Здравствуйте, Pzz, Вы писали:
Pzz>Пожалуйста, исправь эту багу ASAP...
Немного не в тему, но как же я ненавижу этот чертов АСАААП. Вечно он меня вгонял в когнитивный диссонанс. Ну что значит "так быстро как только возможно"? Да я вот на горшке сижу, и могу прямо сейчас оторваться и пойти делать это, но кто, блин, позаботится о последствиях?
PS. Кроме этого выражения еще больше в практике "планирования", я ненавижу только "надо было вчера". Ответ напрашивается только один: "Ах, вчера?, Ну так уже опоздали, значит можно ничего и не делать."
AN>могу точно сказать, что классы несколько упрощают понимание программы
это все зависит.. это фактически конвертация линейной простыни в развесистый нелинейный граф. И если сущности которые ты выделяешь в отдельные классы/функции имеют четкую, понятную семантику , то это может быть хорошо. Иначе это может быть кошмарней линейной простыни.
Замечу, что многие люди предпочитают линейные ман-страницы и линейные статьи нелинейным info и гипертексту.
Здравствуйте, Sheridan, Вы писали:
n>> И что он принципиально меняет? S>Генерирует документацию из ничего практически. А если еще документировать в его стиле — то очень красиво выходит.
Если документация нужна, чтобы отчитаться перед начальством, что она есть, доксиген — прекрасная тулза. Если же документация пишется для людей, чтобы они ее читали, доксиген идет лесом.
Здравствуйте, Abyx, Вы писали: A>вы уж извините за прямоту, но это говнокод. от первой до последней строчки
Ради Бога...
А судьи — кто? LVV>>typedef unsigned int node; // -- узел -- LVV>>typedef unsigned short nline; // -- строка решетки -- пока достатчно short -- LVV>>typedef unsigned short npos; // -- позиция в строке решетки -- достатчно short -- A>что мешает назвать node, node_line, node_line_position ?
Писать длинно... LVV>>int nArg; // -- количество параметров командной строки -- A>commandLineArgN или commandLineArgQty, или commandLineArgCount
Опять же — длинно. Тем более, что используется один раз. LVV>>npos L; // -- можно signed short A>а тут почему не написали что такое L ?
Это я и так помню... А вам — не нужно... A>.... и еще куча примеров как не надо писать код
Не пишите... LVV>>// -- исправлено 26.03.11 ------- LVV>> //if(orient != dominanta) // для доминанты считаем в конце цикла -- LVV>> // can[orient] = NCheck(orient); // -- можно ли в принципе разместить по данной ориентации -- LVV>> Condition = can[dominanta] = NCheck(dominanta); // -- условия окончания -- A>для этого есть система контроля версий
Овчинка выделки не стОит.
Вы спрашивали о комментариях — получили развернутый ответ.
А код я обсуждать не собираюсь.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Писать длинно...
да, длинно. А иногда ОЧЕНЬ длинно. Зато читабельно.
Зато можно в меню рефакторинга ткнуть "переименовать", и мгновенно переименовать. с комментриями так не получится.
Идентификатор он атомарен, его можно копировать, менять, при этом средство рефакторинга может найти все идентификаторы, а компилятор проверить.
А вот комментарии не имеют надежной привязки к тому что они комментируют.
Вот у вас написано LVV>npos L; // -- можно signed short
наверное там было в начале написано
signed short L; // -- можно signed short
а потом стало
npos L; // -- можно signed short
и комментарий стал бесполезным
завтра npos станет signed int, а комментарий останется. и это будет уже не бесполезный, а вредный комментарий.
Но это ваш код. Вы можете писать там что хотите, я только надеюсь что мне никогда не придется поддерживать этот ваш код.
_>1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл) _>2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку).
Да, ещё третье правило:
3. "Свой" код становится "чужим" через некоторое (часто крайне малое) время.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
LVV>>int nArg; // -- количество параметров командной строки -- A>commandLineArgN или commandLineArgQty, или commandLineArgCount
А если nArg — глобальная переменная, которая используется в большом проекте 1000 раз?
(Прошу не вдаваться в дискуссию о пользе/вреде глоб.переменных!!!)
Или, например,
Здравствуйте, monah_tuk, Вы писали:
_>1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл) _>2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку).
У этого есть обратная сторона: чем понятнее выглядит ваш код, тем больше найдется желающих поковырять его по своему усмотрению, а потом объяснить вам, что если код в результате сломался — то это ваша бага, которую вы должны немедленно починить, потому что из-за вас вся работа стоит
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Золотая середина должна быть во всём.
Комментарий — к функции — это святое, ибо кошерно.
Комментарий внутри функции — как правило для кусков, которые можно было бы выделить в отдельные функции, но бессмысленно, ибо нужно один раз и только здесь — т.е. как бы в одной функции есть составное действие.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, LaptevVV, Вы писали:
LVV>>В результате моей работы код стал: короче, понятнее, намного быстрее (это основное, что требовалось) CC>Этот код ещё вылизывать и вылизывать. Оформление кошмарное.
Как известно, абсолютных критерие "красоты" и "кошмарности" — не существует... А на вкус и цвет...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Sheridan, Вы писали:
n>> S>Откройте же для себя doxygen
n>> И что он принципиально меняет? S>Генерирует документацию из ничего практически. А если еще документировать в его стиле — то очень красиво выходит.
Данный тред посвящён комментариям к тому, что и как делается в коде, а не тому, как описать его деление на функции. Doxygen и аналоги обсуждаемому здесь полностью ортогональны.
Здравствуйте, monah_tuk, Вы писали:
_>Здравствуйте, LaptevVV, Вы писали:
LVV>>Не, не люблю писать длинно... LVV>>Ваши предположения — беспочвенны. С самого начала было npos. Комментарий — себе, просто напоминание. LVV>>Его и не требуется сопровождать. Работа конкретная и разовая. Заказчика — устраивает достигнутый результат. LVV>>Меня в ДАННОМ СЛУЧАЕ устраивает мой стиль, в котором разбираться только мне.
_>Научник? На одном заводе по сдельному договору писал программу, воплощала результаты какого-то исследования, научники в работе сделали реализацию алгоритма (видать тоже в стол работали, как они предполагали), мне предстояло использовать его... По сути дали его как чёрный ящик. Да вот только при определённых условиях он работал некорректно, пришлось лезть разбираться.
Это работа по гранту РФФИ.
Я как раз тот, который после научника...
Меня позвали, чтоб я ускорил работу той проги, что они сами там наваяли.
В результате моей работы код стал: короче, понятнее, намного быстрее (это основное, что требовалось) _>Наверное не нужно говорить, что писателя мне хотелось убить. Поэтому в любой программе руководствуйся правилами: _>1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл) _>2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку).
Те девочки, которые писали до меня, в моем коде прекрасног разбираются. Тем более, что все имена переменных я оставил по их просьбе прежними... _>Потомки тебе спасибо скажут. Тем более уже даже не только в IDE, даже простых редакторах есть автодополнение по тексту и прочие вкусности.
Не... Мне требуется один и тот же код пускать в Code::Blocks и Студии. И получать одинаковые результаты.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Чили, Вы писали:
Ч>А если nArg — глобальная переменная, которая используется в большом проекте 1000 раз?
то от нее надо избавиться
Ч>Или, например,
не проще использовать nArg !!!
не проще и не лучше.
надо вынести этот код в отдельную функцию (или несколько фукций), и передавать туда commandLineArgCount как аргумент.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, monah_tuk, Вы писали:
Pzz>>>У этого есть обратная сторона: чем понятнее выглядит ваш код, тем больше найдется желающих поковырять его по своему усмотрению, а потом объяснить вам, что если код в результате сломался — то это ваша бага, которую вы должны немедленно починить, потому что из-за вас вся работа стоит
_>>Для этого есть контроль версий: бить того, кто поломал.
Pzz>Вы не понимаете. В один прекрасный день вы получаете письмо от какого-нубудь Прабата Гавносранежада примерно следующего содержания: "Дорогой Алекс, я нашел в файле xxx функцию yyy(), ... Pzz>И приходят в голову иногда такие мысли: а ведь если бы в том файле не было комментариев, Прабат эту функцию ни в жизнь бы не нашел
Как раз то комментариев было недостаточно. Если язык не позволяет делать private функции, так хоть в комментариях надо было написать что только для внутреннего употребления.
Здравствуйте, dilmah, Вы писали:
D>нормальность вовсе не очевидна. Чтобы это проверить нужно писать дополнительный непереносимый (и возможно ненадежный) код. Если дополнительное копирование не приносит каких-то нетерпимых задержек, то я был бы против добавления проверок о которых ты пишешь.
Пользователи вам очень благодарны за безусловное копирование. Сколько там бэкап БД весит, несколько гигабайт, или несколько сотен гигабайт?
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>Комментарий должен отвечать на 3 вопроса: Ф>0) Кем и когда написан этот код
для этого есть система контроля версий
Ф>1) Для чего написан этот код Ф>2) Почему написан этот код
для этого есть commit сообщение в системе контроля версий
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, Философ, Вы писали:
Ф>>Комментарий должен отвечать на 3 вопроса: Ф>>0) Кем и когда написан этот код A>для этого есть система контроля версий
Ф>>1) Для чего написан этот код Ф>>2) Почему написан этот код A>для этого есть commit сообщение в системе контроля версий
Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую.
Особенно это прикольно если проект живет лет этак двадцать.
И первая версия работала еще на VAX/VMS и Apollo.
Здравствуйте, Sheridan, Вы писали:
S>Приветствую, Pzz, вы писали:
Pzz>> Если же документация пишется для людей, чтобы они ее читали, доксиген идет лесом. S>Ты не умеешь, видимо, готовить. Или не осилил, хотя там осиливать нечего. Или лень тебе. S>Вот такая телепатия.
Моя телепатия говорит, что ты или тупо троллишь, или с утра забыл, что кроме документации-справочника существует множество других видов документации. Да и справочник из doxygen, мягко говоря, односторонний, там даже расшифровки содержания enum'а не будет.
Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям
1) Комментируем все, что можно
2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум
Есть ли у вас требования на работе к комментариям, и если есть то какие ?
02.04.11 13:19: Перенесено из 'C/C++'
09.04.11 01:33: Перенесено модератором из 'Священные войны' — AndrewVK
не всегда но часто если пишеш комментарий (код необычный)
значит написал говнокод можно подумать как переписать
прозрачно без частей требующий комментарий
Требования например у нас такие комментрии в doxygen, так как генериться портал с документацией, иногда помогает.
Используется стиль с++, т.е. никаких /* */.
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Требований особых нет, но жизнь заставляет.
Волт сейчас для одной научной лаборатории делаю несколько прог на С++.
Проги небольшие (менее 100 строк), поэтому с классами не заморачиваюсь.
Но:
1. Комментирую КАЖДУЮ переменную и константу.
2. Комментирую назначение каждой функции и ее параметров
3. Комментирую последовательность действий в больших (более 10 строк) функциях. Это требуется, ибо словарь предметной области несколько отличается от привычного...
4. Частенько добавляю комментарии о последствиях изменения того или иного участка кода.
5. Включил в проект ReadMe.txt, в котором записываю основные задачи, схемы решений и вопросы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
AS>А если бы код был нормальный, в нем бы проверялось — находится ли файл на терминалке или на замепленном диске и если не находится, то
нормальность вовсе не очевидна. Чтобы это проверить нужно писать дополнительный непереносимый (и возможно ненадежный) код. Если дополнительное копирование не приносит каких-то нетерпимых задержек, то я был бы против добавления проверок о которых ты пишешь.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, alexey_sz, Вы писали:
LVV>1. Комментирую КАЖДУЮ переменную и константу. LVV>2. Комментирую назначение каждой функции и ее параметров
покажите пожалуйста пример кода
LVV>3. Комментирую последовательность действий в больших (более 10 строк) функциях. Это требуется, ибо словарь предметной области несколько отличается от привычного...
обычно вместо этого функция разбивается на функции с говорящими именами
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, alexey_sz, Вы писали:
LVV>>1. Комментирую КАЖДУЮ переменную и константу. LVV>>2. Комментирую назначение каждой функции и ее параметров A>покажите пожалуйста пример кода
1. Данные
#include <deque>
#include <vector>
#include <string>
#include"mersennetwister.h"using namespace std;
typedef signed char byte;
typedef unsigned int node; // -- узел --typedef unsigned short nline; // -- строка решетки -- пока достатчно short --typedef unsigned short npos; // -- позиция в строке решетки -- достатчно short --
/* -- Исходные данные:
1. L -- длина стороны решетки, 2^10 < L < 2^16
2. mera -- длина k-меры, 2 < k < L/100
3. S -- степень анизотропии, S = [-1,1]
S определяет процент вертикальных и горизонтальных к-мер.
Схема:
генерируется действительное число pS =[0,1]
приводится к диапазону [-1,+1]
если pS < S, то ориентация горизонтальная
если pS >= S, то ориентация вертикальная
можно и наоборот - это волевое решение
4. cN - количество полных jammings --
*/
// -- глобальные переменные, нужные всем --int nArg; // -- количество параметров командной строки --
// -- параметры генерации - входные данные -- из командной строки --
npos L; // -- можно signed short
npos mera; // -- можно signed shortdouble S; // -- степень анизотропиunsigned int cN; // -- количество полных jummings --
//--double pmin, pmax; // -- min и max степени заполнения решетки --
//--double step; // -- шаг степени заполнения --
// -------------------------
/* -- Нужно считать:
-- Количество занятых узлов --
-- количество вертикальных и горизонтальных занятых узлов --
-- доли заполненных узлов --
-- доля заполненных к_мер = заполненные узлы / к_мера
-- доля вертикальных мер --
-- доля горизонтальных мер --
-- степень анизотропии после заполнения --
-- для оптимизации нужно --
-- общее количество попыток = количество итераций цикла --
-- количество удачных --
-- удачные вертикальные --
-- удачные горизонтальные --
-- количество неудачных --
-- неудачные вертикальные --
-- неудачные горизонтальные --
всего попыток = удачные+неудачные
доля удачных = удачные / попытки
*/
node countU; // -- количество узлов решетки = L*L
node countD; // -- счетчик занятых узлов --
// -- горизонтальные - номер 0 = g
// -- вертикальные - номер 1 = vdouble cM[2]; // -- количество размещенных мер --double cU[2]; // -- количество размещенных узлов --double countP; // -- количество проб размещения --
// -- countP = количество итераций одного цикла заполнения решетки --double D; // -- текущая доля заполнения решетки, D = countD/double(countU);
// -- счетчики проблемных попыток и узлов --double cEmpty; // -- количество неудачных проб --double cR; // -- попытки по занятым-удаляемым узлам --double countRN; // количество редуцирований Nodes
// -- горизонтальные - номер 0 = g
// -- вертикальные - номер 1 = vdouble cE[2]; // -- неудачные пробы по can[orient] = NCheck(orient);double cnN[2]; // -- количество "плохих" свободных узловdouble p_cnN[2]; // -- количество "плохих" свободных узлов НА ПРЕДЫДУЩЕМ ШАГЕ! ---
// -- "плохой" узел - это свободный узел, от которого нельзя разместить меру --bool can[2]; // -- можно разместить меру -- по Nodes считается --double practS; // -- практическая S на каждом вычислении --
// -- она же - вычисление текущего S после каждого прогона --
vector<double> pD; // -- вектор текущих S для вычисления отклонения --extern const double kS = 1.984; // -- коэффициент для доверительного интервала --double Sigma;
// -- средние --double mD; // -- средняя доля заполненияdouble mpS; // -- средняя practS --
// -- пока не считаются --double mUg; // -- средняя доля горизонтальных узлов --double mUv; // -- средняя доля вертикальных узлов --double probably; // вероятность ориентации -- для посмотреть --enum Orientation { g, v };
Orientation orient; // -- случайная ориентация меры --
Orientation dominanta; // -- доминирующее направление по анизотропии --
// -- заполнение решетки Grid --extern const byte vd = -1; // -- вертикальный узел --extern const byte nd = 0; // -- свободный узел --extern const byte gd = +1; // -- горизонтальный узел --
// -----------------------------------typedef deque<node> Free;
Free Nodes; // -- множество свободных узлов --double porog; // -- порог сжатия списка свободных узлов --extern const double porogD = 0.6; // -- оптимальный порог заполнения решетки,
// --------------------------------------- после котрого нужно создать список свободных узлов --
// -----------------------------------
// -- битовая решетка
// -- заполнять ее при размещении меры интервала --typedef vector<byte> Line;
vector<Line> Grid; // -- решетка для демонстрации --
Line Mera; // -- мера - для поиска --
MtRng64 mtS; // анизотропия
MtRng32 mt; // -- координаты -- один общий для всех
// -- генерируемая позиция --
nline ci = -1; // -- номер строки в Grid --
npos cj = -1; // -- номер столбца в Grid --
// -- номер позиции в Nodes --
node nU = -1;
// -- для отладки -- вывод на экран --
// -- определяются в файле Debug.txt --
// -- Определен и открывается в input() - файл main.cppbool Debug = false; // -- показывать счетчики --bool showN = false; // -- показывать список Nodes после редукции --bool showGr = false; // -- показывать ли решетку --bool showDbg = false; // -- пошаговая выдача данных с решеткой --
// -- для сохранения в файле --bool saveF = true; // -- писать 4 числа в файл после N прогонов --bool DsaveR = false; // -- писать счетчики в файл JValue.txt --bool saveV = false; // -- писать все значения S после каждого размещения --bool saveGr = false; // -- писать решетку в файл --
string rFile = "JResult.txt"; // -- имя файла результатов --
FILE *Result; // -- файловая переменная для вывода результатов --
string vFile = "JValue.txt"; // -- имя файла для текущей S--
FILE *Value; // -- открывается и закрывается в main.cpp --
// -- КОНТРОЛЬНЫЕ --посчитанные по Grid -- пока не используются --double grUg; // -- узлы по горизонтали --double grUv; // -- узлы по вертикали (но считаются по строкам) --double grUn; // -- пустые узлы --
2. Код-1
// -- восстановление -- для нового цикла --void nulling()
{ printf("\nNulling");
countD = 0;
cM[g] = cM[v] = 0;
cU[g] = cU[v] = 0;
// -----------------------------
cEmpty = 0; cR = 0; countRN = 0; // -- cG = 0;
cE[g] = cE[v] = 0;
cnN[g] = cnN[v] = 0.0;
p_cnN[g] = p_cnN[v] = 0.0;
// -- восстановление решетки --
can[g] = can[v] = true;
for(nline i = 0; i < L; ++i)
{ Grid[i].assign(L, nd); // -- обнуление решетки
}
/* -- в данной версии - формируется в процессе работы --
// -- восстановление списка свободных узлов --
Nodes.resize(countU);
for(node i = 0; i < countU; ++i)
Nodes[i] = i;
*/
}
//-----------------------------------------------------------------
// -- занесение меры в решетку --
// -- заполнение на стыке --void fillJoint(nline ci, npos cj, byte ch)
{ npos Finish = (cj+mera) % L;
npos j = cj;
while(j != Finish)
{ Grid[ci][j] = ch;
j = (j + 1) % L;
}
}
// -- заполнение в доминантном направлении --inline
void dmSet(nline ci, npos cj, byte ch)
{ Line::iterator Begin = Grid[ci].begin() + cj;
npos cjR = (cj + mera) % L;
if(cj < cjR) // -- не стыковой случай --
fill_n(Begin, mera, ch);
else
fillJoint(ci, cj, ch);
}
// -- заполнение в альтернативном направлении --void nmSet(nline ci, npos cj, byte ch)
{ npos Finish = (ci+mera) % L;
npos i = ci;
while(i != Finish)
{ Grid[i][cj] = ch;
i = (i + 1) % L;
}
}
// -- занесение меры в Grid --inline
void setMera(Orientation orient, nline row, npos col)
{ byte ch;
if(orient == g) ch = gd; else ch = vd;
if(orient == dominanta) dmSet(ci,cj,ch);
else nmSet(ci,cj,ch);
}
//-----------------------------------------------------------------
// -- проверка прямо по Grid - можно ли разместить меру --
// -- проверка стыкового интервала --bool dmJoint(nline ci, npos cj)
{ bool yes = true;
npos j = cj;
npos Finish = (cj+mera) % L;
while(yes && (j != Finish))
{ if(Grid[ci][j] != nd) yes = false ;
j = (j + 1) % L;
}
return yes;
}
// -- проверка в доминантном направлении - стандартными алгоритмами --inline
bool dmCheck(nline ci, npos cj)
{ bool yes = true;
npos jR = (cj+mera) % L;
if(cj < jR)
{ Line::iterator Begin = Grid[ci].begin() + cj;
Line::iterator End = Begin + mera;
yes = equal(Begin, End, Mera.begin());
}
else yes = dmJoint(ci, cj); // проверка стыка --return yes;
}
// -- проверка в альтернативном направлении - циклом --bool nmCheck(nline ci, npos cj)
{ bool yes = true;
npos i = ci;
npos Finish = (ci+mera) % L;
while(yes && (i != Finish))
{ if(Grid[i][cj] != nd) yes = false ;
i = (i + 1) % L;
}
return yes;
}
// -- проверка размещения меры --inline
bool mCheck(Orientation orient, nline ci, npos cj)
{ bool yes = false;
if(orient == dominanta) yes = dmCheck(ci, cj);
else yes = nmCheck(ci, cj);
return yes;
}
// ----------------------------------------------
// -- удаление узла из списка --inline
void Remove(node nU)
{ swap(Nodes[nU], Nodes.back()); // -- это нарушает сортировку --
Nodes.pop_back();
}
//-----------------------------------------------
// -- проверка возможности разместить меру по свободным узлам --
// -- для доминантного направления работает на каждом цикле --bool NCheck(Orientation orient)
{ bool yes = false;
nline ci;
npos cj;
cnN[orient] = 0.0; // -- количество "плохих" узлов --
Free::iterator iN = Nodes.begin();
while(!yes && (iN != Nodes.end()))
{ ci = (*iN) / L;
cj = (*iN) % L;
yes = mCheck(orient, ci, cj);
if(!yes) ++cnN[orient];
++iN;
}
return yes;
}
3. Большая функция --
// -- однократное заполнение решетки --
// -- окончание - полное заполнение решетки основного направления --
// -- метод 2: для данной анизотропии генерим координаты до упора --void Method2()
{ clock_t t0 = tTime("Before nulling ");
nulling();
clock_t t1 = tTime("After nulling ");
printf("\nTime nulling = %12.3lf", double(t1 - t0)/CLOCKS_PER_SEC);
// -- начинаем --
countP = 0; // оно же - счетчик итераций цикла --
printf("\n-----------------------------------");
bool yes = false; // разместили ли меру --
clock_t start, end, start1, end1;
start = tTime("Before Loop ");
/* -- окончание работы: невозможно разместить меру доминантного направления --
-- Первый цикл: безусловное заполнение решетки до порога
координаты генерятся и проверяются непосредственно на решетке --
-- Создание списка "хороших" свободных узлов
-- Второй цикл: генерация координат из списка свободных узлов --
*/
// -- первый цикл- заполнение до порога --
D = countD/double(countU); // -- доля заполнения решетки --bool Condition = (D < porogD); // -- условие - по доле заполнения --
start1 = tTime("Before Loop---1 ");
while(Condition) // -- текущая доля не превышает порога --
{ ++countP; // -- количество попыток размещения мер --
// -------------------------------------------------
// -- генерируем ориентацию --
probably = mtS.getReal1();
// -- pS = round() * 2 - 1
// -- [-1,S) - горизонталь --
// -- [S,+1] - вертикаль --
// -- Чем больше S, тем больше горизонтальных и меньше вертикальных --double pS = probably * 2.0 - 1.0;
if (pS < S) orient = g; else orient = v;
// -- для заданной ориентации генерим координаты, пока не разместим меру --
yes = false; // -- размещается ли мера
ci = cj = -1;
// --------------------------------------------------
// -- генерация узлов --
// -- если доминанта - горизонталь, то ci - номер строки Grid --
// -- если доминанта - вертикаль, то ci - номер столбца Grid --
nU = mt.getUint() % countU; // -- генерим номер узла --
ci = nU / L; // -- номер строки --
cj = nU % L; // -- номер столбца --
yes = mCheck(orient, ci, cj); // -- проверяем данный узел --
// -- генерим до упора --while(!yes) // -- до упора генерим --
{ ++cEmpty; // -- неудачная попытка --
nU = mt.getUint() % countU;
ci = nU / L;
cj = nU % L;
yes = mCheck(orient, ci, cj);
}
// -- все-таки попали на нужный узел - размещаем меру --
setMera(orient, ci, cj); // -- заполняем решетку --
countD += mera; ++cM[orient]; // -- прибавить узлов и мер --
cU[orient] += mera; // -- прибавить ориетированных узлов --if(saveV) // -- если нужны все промежуточные S --
{ practS = (cM[g]-cM[v])/(cM[g]+cM[v]);
fprintf(Value,"%12.9lf\n", practS);
}
D = countD/double(countU); // -- доля заполнения --
Condition = (D < porogD); // can[dominanta] = NCheck(dominanta); // -- условия окончания --
// ----- отладочное ------------------------------------if(showDbg) printDbg();
} // -- конец цикла ------------------------------
end1 = tTime("After Loop---1 ");
printf("\nTime = %12.3lf", double(end1 - start1)/CLOCKS_PER_SEC);
// -- создание списка свободных узлов --
clock_t start_mN = tTime("Before make Nds ");
makeNodes();
clock_t finish_mN = tTime("After make Nds ");
printf("\nTime = %12.3lf", double(finish_mN - start_mN)/CLOCKS_PER_SEC);
// -- второй цикл --
start1 = tTime("Before Loop---2 ");
clock_t fin1, fin2;
Condition = true; // -- для первого входа по списку свободных узлов --while(Condition) // -- текущая доля не превышает порога --
{ ++countP; // -- количество попыток размещения мер --
// -------------------------------------------------
// -- генерируем ориентацию --
probably = mtS.getReal1();
// -- pS = round() * 2 - 1
// -- [-1,S) - горизонталь --
// -- [S,+1] - вертикаль --
// -- Чем больше S, тем больше горизонтальных и меньше вертикальных --double pS = probably * 2.0 - 1.0;
if (pS < S) orient = g; else orient = v;
// -- для заданной ориентации генерим координаты, пока не разместим меру --
yes = false; // -- размещается ли мера
ci = cj = -1;
// --------------------------------------------------
// -- оптимизация списка свободных узлов --
// -- условие запуска gNodes() - эвристическое --if((cnN[g] != p_cnN[g])&&(cnN[v] != p_cnN[v]))
if((cnN[g]+cnN[v] > porog)&& // -- порог - тут возможны варианты --
(Nodes.size() > porog) // -- чтобы мелкие не оптимизировать --
)
gNodes(); // -- удаляем "плохие" узлы --
// --------------------------------------------------
// -- генерация узлов --
// -- если доминанта - горизонталь, то ci - номер строки Grid --
// -- если доминанта - вертикаль, то ci - номер столбца Grid --
nU = mt.getUint() % Nodes.size();
ci = Nodes[nU] / L;
cj = Nodes[nU] % L;
// -- исправлено 26.03.11 -------
// -- проверку надо ДО, а не после --if(orient != dominanta) // для доминанты считаем в конце цикла --
can[orient] = NCheck(orient); // -- можно ли в принципе разместить по данной ориентации --if(can[orient]) // если размещение возможно --
{ yes = mCheck(orient, ci, cj); // -- проверяем данный узел --while(!yes) // -- до упора генерим --
{ ++cEmpty; // -- неудачная попытка --if(Grid[ci][cj] != nd) // -- узел "плохой"
{ Remove(nU); ++cR; } // -- удаляем его из списка свободных узлов --
nU = mt.getUint() % Nodes.size();
ci = Nodes[nU] / L;
cj = Nodes[nU] % L;
yes = mCheck(orient, ci, cj);
// -- здесь получалось иногда так:
// ---- ориентация - недоминантная --
// -- узлы свободные по доминантной ориентации есть, а по недоминантной - нет
// ---- происходит зацикливание -- !!! --
/* -----
fin1 = tTime("Inside while ", false);
if(double(fin1 - start1)/CLOCKS_PER_SEC > 1.0)
{ printf("\nInside while - stop! ");
printCoord();
printGrid();
printNodes();
system("pause");
}
----- */
}
// -- все-таки попали на нужный узел - размещаем меру --
setMera(orient, ci, cj); // -- заполняем решетку --
countD += mera; ++cM[orient]; // -- прибавить узлов и мер --
cU[orient] += mera; // -- прибавить ориетированных узлов --
Remove(nU); ++cR; // -- удаляем размещенный узел --
// -- выводим текущее S --if(saveV)
{ practS = (cM[g]-cM[v])/(cM[g]+cM[v]);
fprintf(Value,"%12.9lf\n", practS);
}
} // -- меру по данному направлению разместить нельзяelse// -- нет хороших узлов --
{ ++cE[orient]; ++cEmpty; }
// -- исправлено 26.03.11 -------
//if(orient != dominanta) // для доминанты считаем в конце цикла --
// can[orient] = NCheck(orient); // -- можно ли в принципе разместить по данной ориентации --
Condition = can[dominanta] = NCheck(dominanta); // -- условия окончания --
// ----- отладочное ------------------------------------if(showDbg) printDbg();
} // -- конец цикла ------------------------------
end1 = tTime("After Loop---2 ");
printf("\nTime = %12.3lf", double(end1 - start1)/CLOCKS_PER_SEC);
end = tTime("After Loop ");
printf("\nTime = %12.3lf", double(end - start)/CLOCKS_PER_SEC);
D = countD/double(countU); // -- доля заполнения --
practS = (cM[g]-cM[v])/(cM[g]+cM[v]); // -- последний штрих --
printResult(Debug); // -- вывод результатов на экран --
saveResult(DsaveR); // -- пишем в файл JResult.txt --
//if(Debug) system("pause");
} // -- конец функции --
LVV>>3. Комментирую последовательность действий в больших (более 10 строк) функциях. Это требуется, ибо словарь предметной области несколько отличается от привычного... A>обычно вместо этого функция разбивается на функции с говорящими именами
Имена говорящие. Но теория перколяции — вам что-нить говорит?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, alexey_sz, Вы писали:
_>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум
только так и никак иначе
ниже приведен код с комментариями.
я считаю что он читается достаточно нормально и без комментариев, однако на всякий случай там есть комментарий для объяснения потенциально сложной идиомы
(код плохой изза опасной копипасты, но мы счя не об этом)
Здравствуйте, Abyx, Вы писали:
LVV>>Писать длинно... A>да, длинно. А иногда ОЧЕНЬ длинно. Зато читабельно. A>Зато можно в меню рефакторинга ткнуть "переименовать", и мгновенно переименовать. с комментриями так не получится. A>Идентификатор он атомарен, его можно копировать, менять, при этом средство рефакторинга может найти все идентификаторы, а компилятор проверить.
Не, не люблю писать длинно... A>А вот комментарии не имеют надежной привязки к тому что они комментируют. A>Вот у вас написано LVV>>npos L; // -- можно signed short A>наверное там было в начале написано A>signed short L; // -- можно signed short A>а потом стало A>npos L; // -- можно signed short A>и комментарий стал бесполезным A>завтра npos станет signed int, а комментарий останется. и это будет уже не бесполезный, а вредный комментарий.
Ваши предположения — беспочвенны. С самого начала было npos. Комментарий — себе, просто напоминание. A>Но это ваш код. Вы можете писать там что хотите, я только надеюсь что мне никогда не придется поддерживать этот ваш код.
Его и не требуется сопровождать. Работа конкретная и разовая. Заказчика — устраивает достигнутый результат.
Меня в ДАННОМ СЛУЧАЕ устраивает мой стиль, в котором разбираться только мне.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV> Вот сейчас для одной научной лаборатории делаю несколько прог на С++. LVV> Проги небольшие (менее 100 строк), поэтому с классами не заморачиваюсь.
Тогда это тогда не С++, а С и классы не заморочка
LVV> Но: LVV> 1. Комментирую КАЖДУЮ переменную и константу. LVV> 2. Комментирую назначение каждой функции и ее параметров LVV> 3. Комментирую последовательность действий в больших (более 10 строк) функциях. Это требуется, ибо словарь предметной области несколько отличается от привычного... LVV> 4. Частенько добавляю комментарии о последствиях изменения того или иного участка кода.
Глянул код с комментами, как для меня так их слишком много.
LVV> 5. Включил в проект ReadMe.txt, в котором записываю основные задачи, схемы решений и вопросы.
Лучше бы там записать псевдокод программы с "большими" комментами, а в коде оставить не больше одной линии на коммент внутри функции.
Здравствуйте, AlexNek, Вы писали:
AN>Здравствуйте, LaptevVV, Вы писали:
LVV>> Вот сейчас для одной научной лаборатории делаю несколько прог на С++. LVV>> Проги небольшие (менее 100 строк), поэтому с классами не заморачиваюсь. AN>Тогда это тогда не С++, а С и классы не заморочка
Только я STL использую.
Векторы, деки, списки и стандартные алгоритмы. LVV>> Но: LVV>> 1. Комментирую КАЖДУЮ переменную и константу. LVV>> 2. Комментирую назначение каждой функции и ее параметров LVV>> 3. Комментирую последовательность действий в больших (более 10 строк) функциях. Это требуется, ибо словарь предметной области несколько отличается от привычного... LVV>> 4. Частенько добавляю комментарии о последствиях изменения того или иного участка кода. AN>Глянул код с комментами, как для меня так их слишком много.
Предметная область мне незнакомая. Алгориттмы — специфические. Поэтому комментю, чтобы не забывать... LVV>> 5. Включил в проект ReadMe.txt, в котором записываю основные задачи, схемы решений и вопросы. AN>Лучше бы там записать псевдокод программы с "большими" комментами, а в коде оставить не больше одной линии на коммент внутри функции.
Частично я так и делаю. Для отдельный частей задачи.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Пишу шапку к файлу, классу/структуре/определению типа, методу/функции, макросам (если назначение неочевидно), эти комментарии в стиле doxygen, в коде — неочевидные места.
Здравствуйте, LaptevVV, Вы писали:
LVV> LVV>> Вот сейчас для одной научной лаборатории делаю несколько прог на С++. LVV> LVV>> Проги небольшие (менее 100 строк), поэтому с классами не заморачиваюсь.
LVV> AN>Тогда это тогда не С++, а С и классы не заморочка
LVV> Только я STL использую. LVV> Векторы, деки, списки и стандартные алгоритмы. Ну так как мы в "войнах" можно и продолжить
Но от этого Ваш код не стал ОО.
Мне как то пришлось "очеловечивать" подобные "С++" исходники написанные одним математиком. Поэтому могу точно сказать, что классы несколько упрощают понимание программы. Правда у него длина функции измерялась в метрах.
Здравствуйте, AlexNek, Вы писали:
LVV>> LVV>> Вот сейчас для одной научной лаборатории делаю несколько прог на С++. LVV>> LVV>> Проги небольшие (менее 100 строк), поэтому с классами не заморачиваюсь. LVV>> AN>Тогда это тогда не С++, а С и классы не заморочка LVV>> Только я STL использую. LVV>> Векторы, деки, списки и стандартные алгоритмы. AN>Ну так как мы в "войнах" можно и продолжить AN>Но от этого Ваш код не стал ОО.
Естественно... AN>Мне как то пришлось "очеловечивать" подобные "С++" исходники написанные одним математиком. Поэтому могу точно сказать, что классы несколько упрощают понимание программы. Правда у него длина функции измерялась в метрах.
Ну, он, наверное, STL не использовал. Если б мне пришлось стандартные контейнеры и алгоритмы писать самому — тоже получились бы метры...
В данном случае можно завернуть в класс все операции с решеткой узлов.
Но просто не вижу смысла это делать.
Если при решении последующих задач текст будет разрастаться -я, конечно, предприму шаги подобного рода.
И Меркурий уже установил — на случай как раз разбухания задачи...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV> AN>Мне как то пришлось "очеловечивать" подобные "С++" исходники написанные одним математиком. Поэтому могу точно сказать, что классы несколько упрощают понимание программы. Правда у него длина функции измерялась в метрах.
LVV> Ну, он, наверное, STL не использовал. Если б мне пришлось стандартные контейнеры и алгоритмы писать самому — тоже получились бы метры...
А у него не было вообще ничего стандартного только NP-сложная задача LVV> В данном случае можно завернуть в класс все операции с решеткой узлов. LVV> Но просто не вижу смысла это делать.
Попробуйте просто ради интереса LVV> Если при решении последующих задач текст будет разрастаться -я, конечно, предприму шаги подобного рода.
тогда это может быть уже поздно
Здравствуйте, AlexNek, Вы писали:
AN>Здравствуйте, LaptevVV, Вы писали:
LVV>> AN>Мне как то пришлось "очеловечивать" подобные "С++" исходники написанные одним математиком. Поэтому могу точно сказать, что классы несколько упрощают понимание программы. Правда у него длина функции измерялась в метрах.
LVV>> Ну, он, наверное, STL не использовал. Если б мне пришлось стандартные контейнеры и алгоритмы писать самому — тоже получились бы метры... AN>А у него не было вообще ничего стандартного только NP-сложная задача LVV>> В данном случае можно завернуть в класс все операции с решеткой узлов. LVV>> Но просто не вижу смысла это делать. AN>Попробуйте просто ради интереса LVV>> Если при решении последующих задач текст будет разрастаться -я, конечно, предприму шаги подобного рода. AN>тогда это может быть уже поздно
Никогда не поздно. На полное переписывание хватает одного дня — такого размера текст. И я его стараюсь в таком объеме поддерживать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Я как раз тот, который после научника... LVV>Меня позвали, чтоб я ускорил работу той проги, что они сами там наваяли. LVV>В результате моей работы код стал: короче, _понятнее_, намного быстрее (это основное, что требовалось)
особенно понятнее
_>>Наверное не нужно говорить, что писателя мне хотелось убить. Поэтому в любой программе руководствуйся правилами: _>>1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл) _>>2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку). LVV>Те девочки, которые писали до меня, в моем коде прекрасног разбираются. Тем более, что все имена переменных я оставил по их просьбе прежними...
Неверно. Девушек переехал каток, тебя переехал каток, код передали другому человеку. Правила простые, легче им следовать всегда и улучшать свою карму, когда твой код, волей судеб достанется другому человеку, и он скажет спасибо.
Вообще, мне нравится как обстоит дело с морским узлом: правильно завязанный узел — красивый. Неправильно завязанный выдержит меньшую нагрузку или вообще развяжется при минимальной оной. Было бы прекрасно, если бы некрасивые программы не запускались бы.
_>>Потомки тебе спасибо скажут. Тем более уже даже не только в IDE, даже простых редакторах есть автодополнение по тексту и прочие вкусности. LVV>Не... Мне требуется один и тот же код пускать в Code::Blocks и Студии. И получать одинаковые результаты.
эээ, и там и там автодополнение есть, какая разница в чём код писать? я же не про логику, я про стилистику и оформление.
Здравствуйте, monah_tuk, Вы писали:
LVV>>Те девочки, которые писали до меня, в моем коде прекрасног разбираются. Тем более, что все имена переменных я оставил по их просьбе прежними... _>Неверно. Девушек переехал каток, тебя переехал каток, код передали другому человеку.
Зачем настраиваться на проблемы — они и без наших усилий нас найдут... _>Правила простые, легче им следовать всегда и улучшать свою карму, когда твой код, волей судеб достанется другому человеку, и он скажет спасибо.
У нас в провинции все друг-друга знают, поэтому с улицы человека не возьмутт, а остальных мы всех знаем... _>Вообще, мне нравится как обстоит дело с морским узлом: правильно завязанный узел — красивый. Неправильно завязанный выдержит меньшую нагрузку или вообще развяжется при минимальной оной. Было бы прекрасно, если бы некрасивые программы не запускались бы. _>>>Потомки тебе спасибо скажут. Тем более уже даже не только в IDE, даже простых редакторах есть автодополнение по тексту и прочие вкусности. LVV>>Не... Мне требуется один и тот же код пускать в Code::Blocks и Студии. И получать одинаковые результаты. _>эээ, и там и там автодополнение есть, какая разница в чём код писать? я же не про логику, я про стилистику и оформление.
Мне подсказки в Студии — мешают. Я и так знаю, что хочу набрать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, alexey_sz, Вы писали:
_>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
когда был наёмным работником иногда заставляли комментировать те или иные участки кода, сейчас комментарии никогда не делаю.
Здравствуйте, LaptevVV, Вы писали:
LVV>Мне подсказки в Студии — мешают. Я и так знаю, что хочу набрать.
Странно, отчего тогда народ еще за плагины которые больше подсказок делает платит?
Кстати с ними длинные имена набирать не проблема
Здравствуйте, LaptevVV, Вы писали:
LVV> LVV>> В данном случае можно завернуть в класс все операции с решеткой узлов. LVV> LVV>> Но просто не вижу смысла это делать.
LVV> AN>Попробуйте просто ради интереса
LVV> LVV>> Если при решении последующих задач текст будет разрастаться -я, конечно, предприму шаги подобного рода.
LVV> AN>тогда это может быть уже поздно
LVV> Никогда не поздно. На полное переписывание хватает одного дня — такого размера текст. И я его стараюсь в таком объеме поддерживать.
Это просто два разных "концепта" и думается в них совершенно по другому.
Ну типа если мне надо в "С" изменить "поведение" функции, я думаю где бы мне вставить if, а если в "плюсах", то какую функцию перекрыть. То есть развитие кода идет просто по другому пути и "переписывая" его позже это будет тот же код, но завернутый в классы. Тогда конечно нет в этом смысла.
Здравствуйте, dilmah, Вы писали:
d> AN>могу точно сказать, что классы несколько упрощают понимание программы
d> это все зависит.. это фактически конвертация линейной простыни в развесистый нелинейный граф. И если сущности которые ты выделяешь в отдельные классы/функции имеют четкую, понятную семантику , то это может быть хорошо. Иначе это может быть кошмарней линейной простыни.
Ну я исходил из того что все сделано правильно. Испортить можно все что угодно.
Кроме того, вы упустили одну вещь, что я получаю "обзор" графа, ну типа диаграммы классов.
d> Замечу, что многие люди предпочитают линейные ман-страницы и линейные статьи нелинейным info и гипертексту.
Ну книгу я тоже больше люблю в пдф читать
Мне вот только интересно, как в "С" по заголовкам отделить private и public функции.
Здравствуйте, alexey_sz, Вы писали:
_>Собственно немного флеймовая тема, но тем не менее. Есть два диаметральных подхода к комментариям _>1) Комментируем все, что можно _>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум _>Есть ли у вас требования на работе к комментариям, и если есть то какие ?
Хочешь устроить драку среди коллег — затей спор на тему "как лучше комментировать" и "как правильно ставить скобки".
Результат хорошо виден по ответам
А ответ-то простой: РАЗУМНО.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, monah_tuk, Вы писали:
_>>1. Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает где вы живёте (Стив Макконнелл) _>>2. Код пишется один раз, а читается — множество. Пишите его читабельным. (тоже откуда-то взято на заметку).
Pzz>У этого есть обратная сторона: чем понятнее выглядит ваш код, тем больше найдется желающих поковырять его по своему усмотрению, а потом объяснить вам, что если код в результате сломался — то это ваша бага, которую вы должны немедленно починить, потому что из-за вас вся работа стоит
Для этого есть контроль версий: бить того, кто поломал.
Здравствуйте, LaptevVV, Вы писали:
LVV>В результате моей работы код стал: короче, понятнее, намного быстрее (это основное, что требовалось)
Этот код ещё вылизывать и вылизывать. Оформление кошмарное.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Pzz, Вы писали:
Pzz>У этого есть обратная сторона: чем понятнее выглядит ваш код, тем больше найдется желающих поковырять его по своему усмотрению, а потом объяснить вам, что если код в результате сломался — то это ваша бага, которую вы должны немедленно починить, потому что из-за вас вся работа стоит
SVN Blame таким в наглую харю!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Pzz, Вы писали:
Pzz>И вот сиди потом и думай, как объяснить Прабату, который уже записал себе в союзники Большое Начальство, что данная функция (кстати, локальная в файле) не предназначена для такого использования, и что если использовать ее именно таким образом, это ломает мои тщательно продуманные планы на развитие этого кода на следующие полгода вперед, и вообще, нужная ему функциональность была там чисто случайно и временно, а через неделю я планировал это место сильно изменить. Большое Начальство, разумеется, выступает на стороне Прабата, потому что ему тоже нужен следующий релиз (который и так уже опаздывает), а своими темпами Прабат его и через месяц не сделает.
Говнокодеры + идиоты на руководящих постах?
Валить из этого дурдома.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, AlexNek, Вы писали:
AN>Как раз то комментариев было недостаточно. Если язык не позволяет делать private функции, так хоть в комментариях надо было написать что только для внутреннего употребления.
Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет.
Здравствуйте, Pzz, Вы писали:
Pzz> AN>Как раз то комментариев было недостаточно. Если язык не позволяет делать private функции, так хоть в комментариях надо было написать что только для внутреннего употребления.
Pzz> Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет.
Ну так тому кто это хочет сделать для начала надо спросить разработчика а отчего она приватная хотя бы. Хотя негласное правило говорит: руки прочь от приватных функций.
Здравствуйте, Pzz, Вы писали:
CC>>SVN Blame таким в наглую харю! Pzz>Вот если бы к SVNу можно было приделать пулеметную ленту...
А было бы неплохо
Pzz>Не знаете, к нему еще соответствующего плагинчика не написали?
А это идея для стартапа
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Pzz, Вы писали:
Pzz>Ну я и свалил в конечном итоге. Доделал взятые на себя обязательства, и свалил.
И правильно.
Pzz>Беда в том, что большинство контор так работают.
Жизнь, она как детская рубаха: короткая и вся в дерьме. (С)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
Pzz>>Беда в том, что большинство контор так работают. CC>Жизнь, она как детская рубаха: короткая и вся в дерьме. (С)
Ну да, только в реальности детская рубаха обычно длинная и чистая
Здравствуйте, AlexNek, Вы писали:
AN>Здравствуйте, LaptevVV, Вы писали:
LVV>> LVV>> В данном случае можно завернуть в класс все операции с решеткой узлов. LVV>> LVV>> Но просто не вижу смысла это делать.
LVV>> AN>Попробуйте просто ради интереса
LVV>> LVV>> Если при решении последующих задач текст будет разрастаться -я, конечно, предприму шаги подобного рода.
LVV>> AN>тогда это может быть уже поздно
LVV>> Никогда не поздно. На полное переписывание хватает одного дня — такого размера текст. И я его стараюсь в таком объеме поддерживать. AN>Это просто два разных "концепта" и думается в них совершенно по другому. AN>Ну типа если мне надо в "С" изменить "поведение" функции, я думаю где бы мне вставить if, а если в "плюсах", то какую функцию перекрыть. То есть развитие кода идет просто по другому пути и "переписывая" его позже это будет тот же код, но завернутый в классы. Тогда конечно нет в этом смысла.
Здесь еще один момент важную роль играет. Заказчик-физик мыслит в терминах процедурного программирования и запудривать ему мозги объектно-ориентированным подходом не нужно. Он этого не примет, и в общем, будет прав...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, AlexNek, Вы писали:
Pzz>> Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет. AN>Ну так тому кто это хочет сделать для начала надо спросить разработчика а отчего она приватная хотя бы. Хотя негласное правило говорит: руки прочь от приватных функций.
И что я, как разработчик, отвечу на этот вопрос, так, чтобы больше не спрашивали?
Здравствуйте, Pzz, Вы писали:
Pzz> Pzz>> Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет.
Pzz> AN>Ну так тому кто это хочет сделать для начала надо спросить разработчика а отчего она приватная хотя бы. Хотя негласное правило говорит: руки прочь от приватных функций.
Pzz> И что я, как разработчик, отвечу на этот вопрос, так, чтобы больше не спрашивали?
Ну если "плюсы", то отправить к книге Страуструпа почитать про приватные функции
Как её увидят больше спрашивать не будут
Спросите его почему у него дома дверь всегда закрыта, а в магазине днем нет?
Здравствуйте, LaptevVV, Вы писали:
LVV> Здесь еще один момент важную роль играет. Заказчик-физик мыслит в терминах процедурного программирования и запудривать ему мозги объектно-ориентированным подходом не нужно. Он этого не примет, и в общем, будет прав...
Это важный момент, согласен.
Здравствуйте, AlexNek, Вы писали:
Pzz>> И что я, как разработчик, отвечу на этот вопрос, так, чтобы больше не спрашивали? AN>Ну если "плюсы", то отправить к книге Страуструпа почитать про приватные функции AN>Как её увидят больше спрашивать не будут
На что мне резонно возразят, что Страуструпу не платят деньги в нашей конторе, в отличии от
Здравствуйте, Pzz, Вы писали:
Pzz> Pzz>> И что я, как разработчик, отвечу на этот вопрос, так, чтобы больше не спрашивали?
Pzz> AN>Ну если "плюсы", то отправить к книге Страуструпа почитать про приватные функции Pzz> AN>Как её увидят больше спрашивать не будут
Pzz> На что мне резонно возразят, что Страуструпу не платят деньги в нашей конторе, в отличии от
У тебя было задание реализовать требуемую функциональность? Думаю нет. Ты реализовал другую поставленную задачу? Думаю да. Какие тогда вопросы по оплате?
Комментарий должен отвечать на 3 вопроса:
0) Кем и когда написан этот код
1) Для чего написан этот код
2) Почему написан этот код
(возможны незначительные дополнения)
Код отвечает на вопрос "Как работает этот код?".
ЗЫ: ЯВУ изобрели для того, чтобы программу мог прочитать человек.
Всё сказанное выше — личное мнение, если не указано обратное.
D>>нормальность вовсе не очевидна. Чтобы это проверить нужно писать дополнительный непереносимый (и возможно ненадежный) код. Если дополнительное копирование не приносит каких-то нетерпимых задержек, то я был бы против добавления проверок о которых ты пишешь.
Ф>Пользователи вам очень благодарны за безусловное копирование. Сколько там бэкап БД весит, несколько гигабайт, или несколько сотен гигабайт?
я же написал "Если дополнительное копирование не приносит каких-то нетерпимых задержек", нужно было большими буквами?
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, Abyx, Вы писали:
A>>Здравствуйте, Философ, Вы писали:
Ф>>>Комментарий должен отвечать на 3 вопроса: Ф>>>0) Кем и когда написан этот код A>>для этого есть система контроля версий
Ф>>>1) Для чего написан этот код Ф>>>2) Почему написан этот код A>>для этого есть commit сообщение в системе контроля версий
A>Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую. A>Особенно это прикольно если проект живет лет этак двадцать. A>И первая версия работала еще на VAX/VMS и Apollo.
Да, да. Тяжёлое детство, деревянные игрушки и т.д
Слепо полагаться на старый опыт в новых условиях далеко не всегда корректно.
В данном случае не корректно. 20 лет назад не всякий проект вообще удастаивался чести
иметь своё место под солнцем в тогда ещё только зараждающихся системах контроля версий.
Вот и приходилось строчить киллобайты бюрократии в комментах.
Но сейчас то, зачем?
Так что, тут Abyx всё правильно философа поправил.
Здравствуйте, LaptevVV, Вы писали:
_>>эээ, и там и там автодополнение есть, какая разница в чём код писать? я же не про логику, я про стилистику и оформление. LVV>Мне подсказки в Студии — мешают. Я и так знаю, что хочу набрать.
just google "как выключить intellisense" парам_пам_пам
Здравствуйте, AlexNek, Вы писали:
AN>Здравствуйте, Pzz, Вы писали:
Pzz>> Pzz>> Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет.
AN>Спросите его почему у него дома дверь всегда закрыта, а в магазине днем нет?
не факт, что у него в Мумбае закрываются двери дома.
Здравствуйте, blackhearted, Вы писали:
b> Pzz>> Pzz>> Язык, разумеется, позволяет. Но и переделать приватную функцию в публичную он точно так же позволяет.
b> AN>Спросите его почему у него дома дверь всегда закрыта, а в магазине днем нет?
b> не факт, что у него в Мумбае закрываются двери дома.
Ну тогда надо спросить, насколько он будет рад если все улица будет приходить к нему домой по нужде, потому как дом у него клево расположен.
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, Abyx, Вы писали:
A>>Здравствуйте, Философ, Вы писали:
Ф>>>Комментарий должен отвечать на 3 вопроса: Ф>>>0) Кем и когда написан этот код A>>для этого есть система контроля версий
Ф>>>1) Для чего написан этот код Ф>>>2) Почему написан этот код A>>для этого есть commit сообщение в системе контроля версий
A>Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую. A>Особенно это прикольно если проект живет лет этак двадцать. A>И первая версия работала еще на VAX/VMS и Apollo.
Здравствуйте, skeptic, Вы писали:
S>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, Abyx, Вы писали:
A>>>Здравствуйте, Философ, Вы писали:
Ф>>>>Комментарий должен отвечать на 3 вопроса: Ф>>>>0) Кем и когда написан этот код A>>>для этого есть система контроля версий
Ф>>>>1) Для чего написан этот код Ф>>>>2) Почему написан этот код A>>>для этого есть commit сообщение в системе контроля версий
A>>Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую. A>>Особенно это прикольно если проект живет лет этак двадцать. A>>И первая версия работала еще на VAX/VMS и Apollo.
S>Да, да. Тяжёлое детство, деревянные игрушки и т.д S>Слепо полагаться на старый опыт в новых условиях далеко не всегда корректно. S>В данном случае не корректно. 20 лет назад не всякий проект вообще удастаивался чести S>иметь своё место под солнцем в тогда ещё только зараждающихся системах контроля версий. S>Вот и приходилось строчить киллобайты бюрократии в комментах. S>Но сейчас то, зачем? S>Так что, тут Abyx всё правильно философа поправил.
Ну хорошо, переезжаем с CVS на ClearCase. Сохранятся коментарии?
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, Abyx, Вы писали:
A>>>Здравствуйте, Философ, Вы писали:
Ф>>>>Комментарий должен отвечать на 3 вопроса: Ф>>>>0) Кем и когда написан этот код A>>>для этого есть система контроля версий
Ф>>>>1) Для чего написан этот код Ф>>>>2) Почему написан этот код A>>>для этого есть commit сообщение в системе контроля версий
A>>Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую. A>>Особенно это прикольно если проект живет лет этак двадцать. A>>И первая версия работала еще на VAX/VMS и Apollo.
B>это не повод продолжать.
Это повод подумать, что будет с твоими комментариями при переезде.
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, skeptic, Вы писали:
S>>Здравствуйте, alpha21264, Вы писали:
A>>>Здравствуйте, Abyx, Вы писали:
A>>>>Здравствуйте, Философ, Вы писали:
Ф>>>>>Комментарий должен отвечать на 3 вопроса: Ф>>>>>0) Кем и когда написан этот код A>>>>для этого есть система контроля версий
Ф>>>>>1) Для чего написан этот код Ф>>>>>2) Почему написан этот код A>>>>для этого есть commit сообщение в системе контроля версий
A>>>Понимаешь... ты это говоришь, потому что ни разу не пробовал переезжать с одной системы на другую. A>>>Особенно это прикольно если проект живет лет этак двадцать. A>>>И первая версия работала еще на VAX/VMS и Apollo.
S>>Да, да. Тяжёлое детство, деревянные игрушки и т.д S>>Слепо полагаться на старый опыт в новых условиях далеко не всегда корректно. S>>В данном случае не корректно. 20 лет назад не всякий проект вообще удастаивался чести S>>иметь своё место под солнцем в тогда ещё только зараждающихся системах контроля версий. S>>Вот и приходилось строчить киллобайты бюрократии в комментах. S>>Но сейчас то, зачем? S>>Так что, тут Abyx всё правильно философа поправил.
A>Ну хорошо, переезжаем с CVS на ClearCase. Сохранятся коментарии?
А куда им деваться, они ж в исходнике
Я так понимаю имеется в виду история?
К счастью я никогда не работал ни с первым ни со вторым и тем более не переезжал между ними.
Но 5 минут гугления и если я всё правильно понял то при вдумчивом переезде большинство проблем можно избежать. тыц и тыц, а на айбиэмовском форуме вообще очень много инфы по теме.
Но это опять же всё атавизм.
Когда я говорил о новых условиях я имел в виду svn, git и mercurial прежде всего.
Здравствуйте, alpha21264, Вы писали:
A>Ну хорошо, переезжаем с CVS на ClearCase. Сохранятся коментарии?
Зависит от средства конверсии, правильное — должно сохранить всю историю, пусть даже переименовав ревизии.
По крайней мере для переезда CVS -> SVN, CVS -> git таких средств много и они таки работают хорошо.
A>Ну хорошо, переезжаем с CVS на ClearCase. Сохранятся коментарии?
ну я недавно перевозил свои конфигурационные скрипты (на домашнем сервере), которые хранились в rcs, перевел на git, всю историю из rcs перевел в git самописным скриптом.
Ты наверно имел в виду проблему неподдержки переименования штатными средствами cvs и rcs, но тут история теряется (если об этом не позаботиться) еще до момента переезда.
Не думаю, что в дальнейшем будут проблемы с переездом с git на нечто новое.
Здравствуйте, Sealcon190, Вы писали:
S>Здравствуйте, LaptevVV, Вы писали:
LVV>>Не, не люблю писать длинно...
S>Это "длинно" будет всяк короче длины твоих комментариев в коде.
Уже объяснял, что имена переменных сохранены специально (из прежней проги), чтобы заказчику было проще ориентироваться. А коммент — уже мой — для себя и для него.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, LaptevVV, Вы писали:
_>>>эээ, и там и там автодополнение есть, какая разница в чём код писать? я же не про логику, я про стилистику и оформление. LVV>>Мне подсказки в Студии — мешают. Я и так знаю, что хочу набрать.
B>just google "как выключить intellisense" парам_пам_пам
Ну дык!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Приветствую, netch80, вы писали:
n> Здравствуйте, Sheridan, Вы писали:
n> S>Откройте же для себя doxygen
n> И что он принципиально меняет?
Генерирует документацию из ничего практически. А если еще документировать в его стиле — то очень красиво выходит.
Здравствуйте, Sheridan, Вы писали:
n>> И что он принципиально меняет? S>Генерирует документацию из ничего практически. А если еще документировать в его стиле — то очень красиво выходит.
Полная жуть порой выходит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Приветствую, netch80, вы писали:
n> Данный тред посвящён комментариям к тому, что и как делается в коде, а не тому, как описать его деление на функции. Doxygen и аналоги обсуждаемому здесь полностью ортогональны.
Я к тому, что если решите документировать, то документируйте с доксигеном.
Приветствую, Pzz, вы писали:
Pzz> Если же документация пишется для людей, чтобы они ее читали, доксиген идет лесом.
Ты не умеешь, видимо, готовить. Или не осилил, хотя там осиливать нечего. Или лень тебе.
Вот такая телепатия.
Здравствуйте, Sheridan, Вы писали:
Pzz>> Если же документация пишется для людей, чтобы они ее читали, доксиген идет лесом. S>Ты не умеешь, видимо, готовить. Или не осилил, хотя там осиливать нечего. Или лень тебе. S>Вот такая телепатия.
Никто не умеет. Ты, просто, нормальной документации не видел.
Приветствую, Pzz, вы писали:
Pzz> Никто не умеет. Ты, просто, нормальной документации не видел.
Ну вот я сейчас как раз изучаю. Ибо достало по коду прыгать вперед-назад. Группы рулят например.
Приветствую, netch80, вы писали:
n> Моя телепатия говорит, что ты или тупо троллишь, или с утра забыл, что кроме документации-справочника существует множество других видов документации.
Твоя телепатия не смогла определить что в этой ветке разговор именно про doxygen. Специально для тебя я даже ветку поименую.
n> Да и справочник из doxygen, мягко говоря, односторонний, там даже расшифровки содержания enum'а не будет.
Мсье, вы прямо таки не знаете о чем говорите.
Приветствую, art_kuz, вы писали:
a> Требования например у нас такие комментрии в doxygen, так как генериться портал с документацией, иногда помогает. a> Используется стиль с++, т.е. никаких /* */.
Почему бы не
Здравствуйте, Sheridan, Вы писали:
S>Приветствую, art_kuz, вы писали:
a>> Требования например у нас такие комментрии в doxygen, так как генериться портал с документацией, иногда помогает. a>> Используется стиль с++, т.е. никаких /* */. S>Почему бы не S>
/**
S>*/
S>или S>
/*!
S>*/
S>а в коментариях с++ как? S>
///
S>или S>
//!
Никак не пойму — ради чего эта болтология?
Забыли смысл слова "РАЗУМ" вообще?
Или эта часть мозга отнялась?
Может Вы в курсе?
Приветствую, RealBobEx, вы писали:
RBE> Никак не пойму — ради чего эта болтология? RBE> Забыли смысл слова "РАЗУМ" вообще? RBE> Или эта часть мозга отнялась? RBE> Может Вы в курсе?
Болтология у тебя. Я задал вполне нормальный вопрос, ибо мне а) интересны корни решения и б) что означает "стиль с++"
Здравствуйте, Sheridan, Вы писали:
S>Приветствую, netch80, вы писали:
n>> Моя телепатия говорит, что ты или тупо троллишь, или с утра забыл, что кроме документации-справочника существует множество других видов документации. S>Твоя телепатия не смогла определить что в этой ветке разговор именно про doxygen. Специально для тебя я даже ветку поименую.
Моя телепатия говорит, что ты влез с темой про doxygen туда, где он нафиг не нужен, и пытаешься теперь внушить, что тут якобы "эта ветка" с отдельной темой, хотя её тут не было и она там не нужна.
n>> Да и справочник из doxygen, мягко говоря, односторонний, там даже расшифровки содержания enum'а не будет. S>Мсье, вы прямо таки не знаете о чем говорите. S>//! Оверлеи S>enum EOverlays S>{ S> oNew, //!< Новое... S> oTag, //!< Метка
Слабо. Для нормальной расшифровки такой попунктный список недостаточен.
Вернёмся к исходной теме. Каким образом, по-твоему, doxygen сможет сделать адекватный эквивалент обычным замечаниям в коде типа "здесь используется модифицированная версия алгоритма Зенона-Мбонга-Пупкина, потому что она показала лучшую устойчивость на нашем профиле данных"? Выносить это в заголовок описания функции не предлагать: таких мест может быть с десяток, и искать связи какой-то ерунды в заголовке с кодом никто не будет. Если не сможет — ты его приплёл без толку.
Приветствую, netch80, вы писали:
n> Моя телепатия говорит, что ты влез с темой про doxygen туда, где он нафиг не нужен, и пытаешься теперь внушить, что тут якобы "эта ветка" с отдельной темой, хотя её тут не было и она там не нужна.
Твоя телепатия не телепатия, так как до нее не дохордит, что я поднял ветку специально.
n> Слабо. Для нормальной расшифровки такой попунктный список недостаточен.
Так и будем вещать, типа "твое конфу слабее моего" из своего темного уголка или выйдешь на свет белый и покажешь всетаки?
n> Вернёмся к исходной теме.
Не хочу. Хочу поговорить про доксиген.
LVV>>>Не, не люблю писать длинно...
S>>Это "длинно" будет всяк короче длины твоих комментариев в коде. LVV>Уже объяснял, что имена переменных сохранены специально (из прежней проги), чтобы заказчику было проще ориентироваться. А коммент — уже мой — для себя и для него.
С этого надо было начинать А то "я не люблю длинно писать" и т.п. — это неконструктивно
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, alexey_sz, Вы писали:
_>>2) Пишем код так, чтобы комментарии были не нужны . Ну или самый необходимый минимум A>только так и никак иначе
A>ниже приведен код с комментариями. A>я считаю что он читается достаточно нормально и без комментариев, однако на всякий случай там есть комментарий для объяснения потенциально сложной идиомы A>(код плохой изза опасной копипасты, но мы счя не об этом)
A>
A>int adjustSideLength(int unadjusted, int sizeNonCl, int minSize, int maxSize)
A>{
A> auto viewport = unadjusted - sizeNonCl;
A> viewport = max(viewport, minSize);
A> viewport = (viewport + 3) & ~3; // align to 4
A> auto total = viewport + sizeNonCl;
A> return min(total, maxSize);
A>}
A>SIZE nonClientSize(long style, bool hasMenu)
A>{
A> SIZE size = {0, 0};
A> if((style & WS_BORDER) != 0)
A> {
A> size.cx += GetSystemMetrics(SM_CXFRAME) * 2;
A> size.cy += GetSystemMetrics(SM_CYFRAME) * 2;
A> }
A> if((style & WS_CAPTION) == WS_CAPTION)
A> size.cy += GetSystemMetrics(SM_CYCAPTION);
A> if(hasMenu)
A> size.cy += GetSystemMetrics(SM_CYMENU);
A> return size;
A>}
A>SIZE adjustWindowSize(SIZE unadjusted, long style, bool hasMenu)
A>{
A> auto nonClient = nonClientSize(style, hasMenu);
A> auto resolution = get_UO_resolution();
A> SIZE adjustedSize;
A> adjustedSize.cx = adjustSideLength(unadjusted.cx, nonClient.cx, resolution.cx, GetSystemMetrics(SM_CXSCREEN));
A> adjustedSize.cy = adjustSideLength(unadjusted.cy, nonClient.cy, resolution.cy, GetSystemMetrics(SM_CYSCREEN));
A> return adjustedSize;
A>}
A>
Объясняю чем плох данный код.
По имени функции adjustЧтоТоТам не понятно, модифицирует она это ЧтоТо или только вычисляет подходящий размер. Чтобы это понять нужно погрузиться в реализацию. Это скорее проблема наименования.
Но проблема в том что у автора кода и у модификатора никогда не будет на 100% совпадающего словаря. Что для одного кажется очевидным наименованием, для другого непонятным. То же и про багаж знаний. Любой специалист может не знать какой-нибудь модной мелочи, которая автору кажется очевидной.
Или имя выбрано вроде бы удачно, но может вдруг вызвать аллюзию к другой предметной области.
Это я к тому, что совсем без комментариев это плохой код.
Здравствуйте, BSDыщъх, Вы писали:
BSD>Здравствуйте, Abyx, Вы писали:
BSD>По имени функции adjustЧтоТоТам не понятно, модифицирует она это ЧтоТо или только вычисляет подходящий размер. Чтобы это понять нужно погрузиться в реализацию.
достаточно навести на нее курсор и увидеть сигнатуру — там нет out-параметров
что характерно, чтобы увидеть комментарий надо сделать тоже самое
BSD>Но проблема в том что у автора кода и у модификатора никогда не будет на 100% совпадающего словаря. Что для одного кажется очевидным наименованием, для другого непонятным. То же и про багаж знаний. Любой специалист может не знать какой-нибудь модной мелочи, которая автору кажется очевидной. BSD>Или имя выбрано вроде бы удачно, но может вдруг вызвать аллюзию к другой предметной области.
После некоторого времени можно понять какой именно словарь используется в коде. Тогда будет понятно, что theta это угол а не, скажем, температура.
Вместо того чтобы расписывать словарь в коде, лучше сделать отдельную документацию (wiki например).