MetaProg

Описание: Разработка и отладка приложений. Упор на 3D-графику.

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#13 dyvniy » Пн, 22 сентября 2014, 10:30:38

Надо агли учить
http://habrahabr.ru/hub/agile/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#14 dyvniy » Пн, 22 сентября 2014, 15:20:16

Heart
http://www.dtelepathy.com/ux-metrics/#intro
Спойлер
HEART разделяет все метрики на 5 категорий

Happiness (Счастье)
К метрикам счастья относятся, к примеру:
— пользовательское удовлетворение;
— ощущение, что продуктом легко пользоваться;
— net promoter score.

Engagement (Вовлечение)
К примеру:
— количество визитов пользователя в неделю;
— количество фото, загружаемых юзером в день;
— количество лайков и шэров.

Adoption (Принятие)
К принятию можно отнести:
— обновления до новой версии;
— созданные пользователем подписки;
— покупки сделанные новыми пользователями в приложении.

Retention (Возвращаемость)
Конкретными метриками здесь могут быть:
— количество пользователей, остающихся активными с течением времени
— churn
— повторные покупки

Task Success (Успех ключевых задач)
Ключевыми задачами могут, к примеру быть:
— успешные поиски;
— время загрузки фотографии;
— полностью заполненный пользователем профиль.
http://www.dtelepathy.com/ux-metrics/assets/HeartFramework.pdf
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#15 dyvniy » Вт, 23 сентября 2014, 12:51:57

весело
http://developerslife.ru/

как бросить писать идеальный код
http://habrahabr.ru/post/129171/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#16 dyvniy » Пн, 29 сентября 2014, 21:32:31

ПЕРСОНАЛЬНЫЙ САЙТ ХОХЛОВОЙ МАРИНЫ НИКОЛАЕВНЫ.
GGG - СЕТЕЦЕНТРИЧЕСКИЕ СИСТЕМЫ УПРАВЛЕНИЯ
http://viphmn.ru/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#17 dyvniy » Вт, 30 сентября 2014, 09:26:49

agile
http://habrahabr.ru/hub/agile/

Скоро выложу диктофонные записи курса по agile тут
/viewtopic.php?f=6&t=125
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#18 dyvniy » Чт, 9 октября 2014, 12:09:57

Стандарт кодирования, которого придерживаются в Adalisk
http://wiki.cloudlab.glidewelldental.com/C++ Coding Standard
Спойлер
Стандарт кодирования С++

Содержание
Стандарт кодирования С++
Общие положения
Правила кодирования
Стандарт С++ 2011 (С++0x) и его фичи
Рекомендации
Быстродействие кода
Нотации и единицы измерений

Общие положения

Фичи STL, аналоги которых присутствуют в GDP (Glidewell Development Platform), использовать нельзя. Таким образом, под запрет попадают следующие компоненты STL:
контейнеры, а конкретно std::vector, std::array, std::deque, std::list, std::map, std::set, std::queue, std::priority_queue, std::stack и все и любые их версии.
строки, классы, функции и переменные для организации работы со строками std::string
любые виды указателей STL. GDP предоставляет собственную систему умных указателей (хотя и несколько ограниченную), используйте её.
Использование любых системных функций и функций windows API запрещено. Мы стараемся делать кроссплатформенный код.
Использование любой сторонней библиотеки должно быть предварительно согласовано и одобрено заказчиком. В нашем случае это Сергей Никольский.
Любой код, который был привнесён извне, то есть создан не в компании Адалиск, должен, во-первых быть одобрен к использованию заказчиком, а во-вторых оформлен специальным образом, то есть должен быть чётко указан источник, дата и кто этот код добавил в наши исходники.
Если код не передается в собственность Глайдвелл (например он используется у вашего предыдущего работодателя), то он должен быть лицензирован и положен в ThirdParty.
Правила кодирования

Вместо new используйте gdpnew и gdparraynew
Один класс ≡ один файл. Редкие исключения должны быть обоснованы. Как правило, исключения возникают, когда какие-то используемые объекты требуют специальным образом оформленных input-объектов на вход. Например, IGeoPaintObjectsWidget::Input.
Имплементация методов в заголовочном файле недопустима. Более того, вообще запрещена имплементация сразу после декларации метода класса или структуры. То есть там где вы описываете класс допустима только декларация методов, и никакой имплементации. Inline методы следует переносить в hpp файл. Заметим, что чаще всего, имплементация методов располагается либо в cpp, либо в hpp файле. Наличие и того и другого – редкость, усложняет понимание, и намекает, что возможно класс надо поделить на два. В hpp файл должны помещаться только inline методы. Обычные методы помещаются в cpp.
В названиях классов и структур можно использовать только латинские буквы и арабские цифры. Подчёркивание нежелательно. Соответственно, название файла с имплементацией класса должно совпадать с именем класса, но имена файлов обязательно и только в нижнем регистре. Имя класса должно начинаться с заглавной латинской буквы. Если имя состоит из нескольких сочлененных слов, то начало каждого слова должно быть с большой буквы.
Все названия членов класса начинаются с маленькой буквы. Все названия приватных и защищённых членов класса заканчиваются подчёркиванием.
При написании классов желательно придерживаться следующего правила: вначале идет публичная часть, затем protected и в конце приватная. Данные должны быть в начале соответствующей секции, методы в конце. Методы, относящиеся к схожей функциональности надо группировать вместе. Например, если в классе есть несколько конструкторов или несколько методов get, то они должны быть декларированы рядом и их имплементация тоже должна быть написана в одной части файла. В .cpp файле конструктор, деструктор и методы, относящиеся к инициализации и деинициализации класса надо размещать в начале файла.
Все глобальные переменные - либо статические, либо константы. Названия глобальных переменных желательно начинать с буквы ‘g’, название константы с ‘c’. Например gGlobalVariable, cImportantConstant. При этом вторая буква названия должна быть заглавной.
Если вы объявляете константы и переменные видимые только внутри одного C++ файла и не предполагаете доступа к этим объектам извне, используйте unnamed namespace. Пример

#include <someheader.h>
namespace
{
const double cDoubleConst = 0.1e-3; //some constant
const int cNumberOfIteration = 40; //some other constant
double gSomeVariable = 5.; //some variable seen through whole .cpp file

}
Это исключит конфликт имен между разными cpp файлами.
Пути к файлам в директиве #include писать исключительно через слеш – косую черту, наклонённую вправо (/). Вот так:

#include <dental/basic/dentalsettings.h>

Фигурная скобка (и открывающая и закрывающая) всегда пишется с новой строки.
Код относящийся к управляющей структуре всегда нужно брать в фигурные скобки, даже если это всего одна строка.

if(isInlay)
{
return true;
}

if(isInlay)
return true; // НЕВЕРНО!!!

if(isInlay) return true; // НЕВЕРНО!!!

Не допускается более одного символа точка с запятой (;) в одной строке. Если в строке есть точка с запятой, то это должен быть последний символ кода в строке (далее может быть только комментарий). Это правило не касается цикла for.
После каждой запятой (,) и точки с запятой (;) должен следовать пробел, либо конец строки.

void smoothCycleLineSoft( RealPArray * line, double force, int iterations );
Двойное двоеточие не может начинать или заканчивать строку. У нас по коду очень часто можно увидеть такое:

GeoBounds IComplex2D_BooleanPlaneUtil::
getTransformedBounds (const GeoMatrix &xf) const
Это крайне раздражает и существенно усложняет поиск. Пишите название класса и метода на одной строке.

Выделяйте пробелом справа и слева все бинарные операции.

if ( a >= size )
Конструкция Try Catch запрещена. Исключения возможны только в случае, когда мы вынуждены общаться со сторонними библиотеками.
Шаблоны запрещены.
Оператор запятая (,) строго воспрещён!
Тернарный условный оператор (?:) следует использовать только с «простыми» параметрами, например:

int o_sign = val < 0 ? -1 : 1;
Не следует писать вызовы методов в аргументах после ? и перегружать код:

int in = isClosed ? (i == size ? 1+1 : i+1) : Min (size, i+1);
И не следует использовать этот оператор в вызове метода:

isubdivider->maintainSets((maintainedFaces && maintainedFaces->size())? maintainedFaces : NULL,(maintainedEdges && maintainedEdges->size())? maintainedEdges : NULL, NULL);
Не используйте в функциях числовые значения, кроме 0, 1, 2, 3. Имеется в виду не писать что-то типа alfa <= 45/51. Любые числовые значения нужно присваивать переменным или константам с понятными именами.

for( i = 1; i < 100; i++ ) // неправильно

Использование механизма friend допустимо в исключительных и оговоренных ситуациях. К таким относится ситуация, когда мы хотим сохранить состояние объекта (State). А так же friend хорошо использовать для мультипоточных workers. Больше на моей памяти нет подобных ситуаций.
Локальные псевдонимы простых и определённых классов и структур строго воспрещены!

typedef GeoVector Vector;
Однако, допустимо использовать псевдонимы для сложных шаблонных объявлений.


typedef Map2IterStack IterStack<IterObjStack<Map2Iter>>
Не используйте двойные и более указатели.
Файл не длиннее 1000 строк.
Строки не длиннее 140 символов.Если метод с параметрами слишком длинный чтобы уместиться на одной строке, то перечисление параметров надо переносить на следующую строку. Например:

void DSToothPolylineWidgetData::getPolylinesColor( GeoColor& colorGeneralLine, GeoColor& colorEquatorLine,
GeoColor& colorCuspLine, GeoColor& colorFissureLine,
GeoColor& colorSubFissureLine, GeoColor& colorStandard ) const
Выравнивание параметров возможно либо по первому параметру, либо (если это приводит к слишком большому сдвигу вправо) по началу названия метода, следующему после "::"

Порядок аргументов в функции должен быть следующим:

void methodName( inputParameters, input-outputParameters, outputParametes,
inputParametersWithDefaults, input-outputParametersWithDefaults, outputParametesWithDefaults);

void foo( const GeoVector& origin, int resolution, GeoVector& center, IterStack<int>& marginLine );
Всегда делайте метод константным, если он не вносит изменения в класс. Тут следует заметить, что GDP не придерживается этого правила и, как следствие, мешает нам следовать этому правилу. Поэтому не ленитесь и применяйте кастинг там, где это необходимо, чтобы победить GDP.
Если в классе есть члены данных типов для которых нет конструктора, должен быть добавлен конструктор по умолчанию, инициализирующий эти данные. Если все данные в классе относятся к типам имеющим собственные конструкторы, то тогда конструктор по умолчанию может быть опущен. Например

class A
{
int someValue_;
public:
A(); // должен быть конструктор по умолчанию, чтоб проинициализировать someValue_;
};

class B
{
GeoVector someVector_;
public:
// конструктор по умолчанию можно не заводить, так как GeoVector будет проинициализирован своим конструктором;
};
Используйте виртуальные деструкторы в базовых классах, если от этих классов предполагается наследование.
Примечания:
В некоторых случаях можно сознательно отказаться от виртуальных деструкторов, даже если предполагается наследование. Это может понадобиться по соображениям быстродействия и/или экономии памяти. Помните, что при создании хотя бы одной виртуальной функции, вы увеличиваете размер экземпляра класса на длину указателя на таблицу виртуальных функций. Например, класс содержащий два поля типа int будет занимать 64 бита, если виртуальных методов нет, и 96/128 бит (в зависимости от платформы), если у вас есть виртуальные методы. Кроме того, если деструктор пустой, то, если он не виртуальный, компилятор может оптимизировать вызов, в случае, если деструктор виртуальный, компилятор всегда его позовет. Помните, что вызов любого виртуального метода происходит дольше чем вызов обычного метода. Так как, в случае виртуального метода, надо вначале отыскать его адрес в таблице виртуальных методов, а только затем вызвать сам метод.
Аналогичная ситуация с конструкторами по умолчанию для инициализации полей. Иногда возможны ситуации, когда ради быстродействия вы можете оставлять поля неинициализированными в конструкторе.
Применять два вышеуказанных правила надо очень осторожно и только там, где быстродействие и размер критичны. Например, вы храните в контейнере миллионы экземпляров класса и вам не хочется чтобы размер контейнера увеличился из-за виртуальных методов, или скорость создания/уничтожения экземпляров класса при перемещении внутри контейнера пострадала из-за виртуальности или ненужной инициализации.
Ни в коем случае не вызывайте виртуальные функции в конструкторах и деструкторах! Это может приводить к неожиданному поведению при наследовании. Если вам надо проводить инициализацию класса, которая может быть перегружена у наследников, заводите виртуальную функцию init или construct и проводите инициализацию в ней. Конструктор в этом случае делается максимально простой.
Не инициализируйте глобальные переменные глобальными переменными. В С++ не задан порядок инициализации глобальных переменных, определённых в разных модулях. Поэтому в момент инициализации одной переменной другая может быть ещё не инициализированной.
Символы табуляции надо заменять пробелами. Один таб = 4 пробела. Это настройка студии.
Всегда включайте в switch не пустой default. Если не знаете, что там написать - пишите assert.
Выделяйте логически обособленные куски кода фигурными скобками.
Для охраны заголовка используйте только конструкцию

#ifndef __FILE_NAME_H__
#define __FILE_NAME_H__
class A
{
//...
};
#endif //__FILE_NAME_H__

Не используйте

#pragma once

Обратите внимание, что в качестве атрибута define требуется использовать капитализированное имя файла. Для улучшения читаемости можно применять знаки подчеркивания между словами в имени файла. Например

#ifndef __GEN_DRAG_WIDGET_H__
#define __GEN_DRAG_WIDGET_H__
.
.
.
#endif

Операторы инкремента/декремента должны всегда стоять обособлено. Т.е. запрещены выражения вида

f = i++ + ++i;
И даже просто

a = ++i;
крайне нежелательно. Вместо этого пишите:

++i;
a = i;
Переменная должна быть инициализирована при объявлении. Такой код:

int a;
запрещен. Должно быть

int a = 0;
Если в классе есть хотя бы одна виртуальная функция, то все потомки этого класса должны наследоваться виртуально.

class CoolModifier: virtual public ICoolModifier
Не используйте побитовые операции с булевыми значениями. Используйте булевы операции и помните о сокращенных вычислениях:

found &= addPoint_(contour, p, dir); // the bad way
if ( found | nice ) // same

found = addPoint_(contour, p, dir) && found // the right way
if ( found || nice ) // do it like here

Не сравнивайте булевые значения с небулевыми. Результаты могут вас удивить. Студия вам в этом поможет.

int value = 300;
if ( value == true ) // false!


Слово virtual следует писать для для всех виртуальных методов, даже если они уже отнаследованны от виртуальных.
Стандарт С++ 2011 (С++0x) и его фичи

«auto» разрешено к использованию.
«static_assert» рекомендуется к использованию.
«nullptr» настоятельно рекомендуется к использованию.
«override» категорически обязательно к использованию! Наличие слова override не отменяет необходимости писать слово virtual для всех виртуальных методов.
«Rvalue ссылки» пока запрещены к использованию.
«лямбда выражения» разрешено использовать только там, где нам необходимо куда-то, в какой-то внешний метод или класс, находящийся в неконтролируемом коде (GDP), отдать указатель на функцию. Все иные возможности использования анонимных функций запрещены!
Пояснения:
Насколько мне известно, сейчас есть три случая, где оправдано применение лямбд:
Некоторые методы класса IterStack принимают указатель на ф-ю на вход
void IterStack::iter (void (* func) (T &elt));
void IterStack::sort ( int (*compFun) (const void *, const void *));
int IterStack::find (const T &, int (*compFun) (const void *, const void *)) const;
Конструктор класса SGfxViewCb требующий на вход указатель на функцию
SGfxViewCb(T * obj, CbMethod mth)
RunMultithreaded и его вариации.
template<typename Callable, typename Caller>
void RunMultithreaded( Callable c, int from, int to, Caller* caller = 0, int safety = GEO_THREAD_SAFE_IF_MAPPED, int type = GeoThreadQueueWorker::GetIndexAsYouGo, bool keepWorkers = false )
Рекомендации

Далее есть несколько нестрогих правил, но нестрогие они только по той причине, что зачастую в зубодробильном математическом коде иначе нельзя.

Максимальная вложенность управляющих структур не больше 3.
Циклы, блоки if и блоки else не должны быть длиннее 36 строк.
Пробелы в объявлении цикла for лучше писать так:

for( int i = 0; i < numberOfIterations; i++ )
Приведение типов делать в функциональном стиле:

float a = float( b )
Быстродействие кода

Очень важно при написании геометрического кода с самого начала обращать внимание на быстродействие. Есть несколько простых правил, следуя которым с самого начала вы будете писать более быстрый код.

По возможности не объявлять локальные переменные внутри циклов. Это особенно касается переменных сложного типа, имеющих собственные конструкторы.
Все массивы должны передаваться в/из функций по ссылке, а не по значению.
Аналогично с переменными параметрами "тяжелых" типов. Их надо передавать по ссылкам а не через стек.
Если вам нужно использовать временные массивы в вашей функции (например IterStack), а функция вызывается много раз, то с точки зрения быстродействия, выгоднее завести массив один раз и, предварительно сбросив его содержимое, передавать его в функцию как параметр, а не создавать каждый раз новый экземпляр массива внутри функции. IterStack::reset() работает гораздо быстрее чем создание нового IterStack. Так как в этом случае нет выделения памяти
Вычисление расстояния между двумя точками довольно медленная операция, так как она включает вычисление квадратного корня. Если вам не нужно само расстояние, а требуется только сравнить два расстояния между собой, то лучше использовать квадрат расстояния. В GeoVector есть два метода: magnitude и length2. length2 как раз вычисляет квадрат длины вектора.
Старайтесь кэшировать результаты вычислений. Зачастую в цикле вызывается код вычисляющий какую-либо характеристику поверхности, вместо того, чтобы один раз ее вычислить и занести в переменную. В общем случае, при написании цикла или функции вызываемой много раз подумайте о том, чтобы константные вычисления вынести за пределы итераций.
Следует хранить тяжелые объекты в контейнерах косвенно, то есть в IPtr<MyHeavyClass>. Это позволяет избежать множества копирований при изменении контейнера (добавлении/удалении элементов, и т.п.). Так же может быть сэкономлено время при инициализации контейнера. Список тяжелых объектов включает в себя BitVector и другие контейнеры, но не исчерпывается ими.
To be continued...
Нотации и единицы измерений

Все линейные размеры в коде рассчитываются и задаются в метрах.
Все углы в коде рассчитываются и передаются в радианах. Однако, в настроечных файлах *.exe.config углы задаются в градусах
Нумерация зубов в коде всегда FDI.
:byp:
Изображение


Название раздела: Программирование (под Desktop и Android)
Описание: Разработка и отладка приложений. Упор на 3D-графику.

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Программирование (под Desktop и Android)»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 102 гостя