Re[7]: хромая логика
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.12.16 14:25
Оценка:
Здравствуйте, flаt, Вы писали:

M>>Суффикс "_m" используется у Микрософта для членов классов с любой видимостью. Тот же WTL, да и MFC вроде тоже


F>Только не суффикс, а префикс, и не "_m", а "m_"


Ну да, не "Волгу", а сто рублей, не выиграл, а проиграл

Я уже пару лет в WTL не заглядывал, подзабыл что там как
Маньяк Робокряк колесит по городу
Re[7]: хромая логика
От: Кодт Россия  
Дата: 02.12.16 14:54
Оценка:
Здравствуйте, __kot2, Вы писали:

__>вообще, кстати, в хромиуме еще очень странно выглядит использование паскалевского именования. правда, не всегда, но это выглядит еще более странным


Гугловский стиль гласит:
— примитивные функции, особенно инлайновые, (и изредка — неинлайновые геттеры-сеттеры для единообразия с соседними инлайновыми членами) пишутся в змеином_виде
— неинлайновые функции — пишутся в ПаскалевомВиде (они называют это верблюжим, но какой же это верблюжийВид, если с заглавной буквы)

— инлайновыми можно делать только те функции, которые не виртуальные и чьё тело укладывается в одну строчку
Перекуём баги на фичи!
Re[7]: хромая логика
От: Кодт Россия  
Дата: 02.12.16 15:11
Оценка:
Здравствуйте, __kot2, Вы писали:

__>вообще, на самом деле к оечно придирабс и хромиум — один из лучших проектов на С++.


Лучший, но тем внезапнее видеть такие косяки.
На самом деле, если задаться целью, то выловить можно много косяков.
Но хромовская политика чистоты кода — начиная с чистоты стиля — делает своё светлое дело.

__> есть такой мрак, что прямо кровь из глаз течет и ничего — пользуются люди. но если придираться, то я мое ревью бы на Point.h выглядело бы так:

__>constexpr Point() : x_(0), y_(0) {}  - нафиг constexpr. что он дает?

Во-первых, это такое поветрие, переезжать на C++14.
Во-вторых, это позволяет писать constexpr-функции, которые внутри занимаются геометрическими расчётами.

__>  constexpr Point(int x, int y) : x_(x), y_(y) {} - зачем два конструктора, когда одного достаточно с дефолтными параметрами?

А вот это — нафиг-нафиг! Ты же не можешь сделать функцию, у которой либо-ноль-либо-два параметра.
Получается, невольно разрешишь запись Point(x), которая обозначает Point(x,0). Кому-то специально нужны точки с нулевой ординатой?
Да ещё и без explicit, это вообще незащищённый секс.

__> constexpr int x() const { return x_; } - убрать нафиг эти методы, сделать члены x и y публичными
__>  constexpr int y() const { return y_; }

Единообразие с другими геометрическими классами, особенно — с прямоугольником. Иначе было бы rect.width и rect.right() либо rect.width() и rect.right.

Наркомания с групповым сеттером — какое-то легаси. Может быть, делалось для единообразия с подобными модификаторами прямоугольников и инсетов, так и осталось.

__>почему паскалевское именование в С++ проекте?


По нормативам. Змеи для инлайнов, паскали для громоздкого.

__> void SetToMin(const Point& other);  - непонятная фигня. почему это метод класса Point?

Фигня как раз понятная, — нахождение левой верхней точки, например, при объединении и пересечении прямоугольников.
Почему не в виде функции LeftTopMost(const Point& a, const Point& b) — это легаси наркомания.
Перекуём баги на фичи!
Отредактировано 02.12.2016 15:17 Кодт . Предыдущая версия .
Re[2]: хромая логика
От: Кодт Россия  
Дата: 02.12.16 15:19
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Интересно, а они действительно поддерживают отрицательные отступы?


В принципе, да. Но только надо очень чётко понимать, к чему приведёт раздувание прямоугольника: не выбежит ли он за допустимые границы.
Перекуём баги на фичи!
Re[8]: хромая логика
От: __kot2  
Дата: 02.12.16 15:26
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Но хромовская политика чистоты кода — начиная с чистоты стиля — делает своё светлое дело.
в принципе, из публичных code style гугловский и правда самый вменяемый. конечно, смущает, что они не осилили исключения и по мелочам, но в общем он лучше остальных

К>А вот это — нафиг-нафиг! Ты же не можешь сделать функцию, у которой либо-ноль-либо-два параметра.

К>Получается, невольно разрешишь запись Point(x), которая обозначает Point(x,0). Кому-то специально нужны точки с нулевой ординатой?
К>Да ещё и без explicit, это вообще незащищённый секс.
да, согласен. это аргумент делать два конструктора. я лично в совсем небольшом проекте предпочту один (вдруг добавлю новое поле и проинициализировую только в одном конструкторе, про второй забуду — такое бывало), но при работе нам большим проектом большой командой лучше иметь два

я, кстати, видел где-то пример кода в стиле

struct S
{
    int x = 10;
};

это часть нового стандарта? какого именно? или это для простоты обсуждения было?

К>Единообразие с другими геометрическими классами, особенно — с прямоугольником. Иначе было бы rect.width и rect.right() либо rect.width() и rect.right.

ну, это тоже как бы, повод для обсуждения
можно, например rect представить в виде пары pos, dimensions — соотв-но pos будет Point. то есть будет r.pos.x — не нужно городить единообразие, оно натуральным образом возникает. но, возможно, в некоторых случаях стоит иметь какие-то соглашения насчет x() и y(), хотя логичнее иметь скорее соглашение насчет pos()

К>По нормативам. Змеи для инлайнов, паскали для громоздкого.

странные нормативы. скорее всего написаны C# товарищами. по ходу пришли из попыток присобачить проперти к С++. надо было им лучше плюсовиков найти для написания style guide

К>Фигня как раз понятная, — нахождение левой верхней точки, например, при объединении и пересечении прямоугольников.

а я вот не догадался

К>Почему не в виде функции LeftTopMost(const Point& a, const Point& b) — это легаси наркомания.

так незачем поощрять наркоманию, даже если это легаси! надо быть сразу бить палкой тому, кто это добавил. явно же не с начала в классе было
Отредактировано 02.12.2016 15:36 __kot2 . Предыдущая версия .
Re[4]: хромая логика
От: Ops Россия  
Дата: 02.12.16 17:47
Оценка:
Здравствуйте, __kot2, Вы писали:

__>точнее даже так — __kot2 это нормальный идентификатор в С++?

По рукам бить

Each name that contains a double underscore __ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.

Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: хромая логика
От: __kot2  
Дата: 02.12.16 18:47
Оценка:
Здравствуйте, Ops, Вы писали:
Ops>По рукам бить
Ops>

Ops>Each name that contains a double underscore __ or begins with an underscore followed by an uppercase
Ops>letter (2.12) is reserved to the implementation for any use.

вот тут та же система — ник kot на всех форумах занят, а __kot — свободен и зарезервирован специально для меня
Re[9]: хромая логика
От: PM  
Дата: 03.12.16 22:02
Оценка: 12 (1) +1
Здравствуйте, __kot2, Вы писали:

__>я, кстати, видел где-то пример кода в стиле


__>
__>struct S
__>{
__>    int x = 10;
__>};
__>

__>это часть нового стандарта? какого именно? или это для простоты обсуждения было?

Это non-static data member initializers, были добавлены в C++11: http://en.cppreference.com/w/cpp/language/data_members#Member_initialization

И класс Point мог бы выглядеть так:

struct Point
{
    int x = 0;
    int y = 0;

    constexpr Point() = default;
    constexpr Point(int x, int y) : x(x), y(y) {}
...
};


Также есть вариант с делегирующим конструктором:

Point::Point() : Point(0, 0) {}


Ещё странно, что гугловцы выбрали путь дублирования кода и наделали пар Point/PointF, Size/SizeF и т.п. вместо шаблонов.
Re[10]: хромая логика
От: Кодт Россия  
Дата: 05.12.16 12:40
Оценка:
Здравствуйте, PM, Вы писали:

PM>Ещё странно, что гугловцы выбрали путь дублирования кода и наделали пар Point/PointF, Size/SizeF и т.п. вместо шаблонов.


Это не странно. Гугловцы настойчиво любят пихать функции в отдельные единицы компиляции, чтобы уменьшить распухание экзешника и избежать ада статических переменных при компонентной сборке.

У них, например, недавно был приступ паранойи — явно забанить все конструкторы, генерируемые компилятором.
// .h

class Foo {
 public:
  Foo(const Foo&); // = default
  . . . .
 private:
  int x_, y_, z_;
};

// .cc
Foo::Foo(const Foo&) = default;


С шаблонами такой фокус, ясное дело, не провернёшь.

И обратите внимание на то, что Point сотоварищи имеет атрибут GFX_EXPORT — это старый добрый __declspec(dllexport) из модуля gfx.dll
Перекуём баги на фичи!
Re[11]: хромая логика
От: PM  
Дата: 06.12.16 08:11
Оценка:
Здравствуйте, Кодт, Вы писали:

PM>>Ещё странно, что гугловцы выбрали путь дублирования кода и наделали пар Point/PointF, Size/SizeF и т.п. вместо шаблонов.


К>Это не странно. Гугловцы настойчиво любят пихать функции в отдельные единицы компиляции, чтобы уменьшить распухание экзешника и избежать ада статических переменных при компонентной сборке.


К>У них, например, недавно был приступ паранойи — явно забанить все конструкторы, генерируемые компилятором.

К>
К>// .h

К>class Foo {
К> public:
К>  Foo(const Foo&); // = default
К>  . . . .
К> private:
К>  int x_, y_, z_;
К>};

К>// .cc
К>Foo::Foo(const Foo&) = default;
К>


К>С шаблонами такой фокус, ясное дело, не провернёшь.


К>И обратите внимание на то, что Point сотоварищи имеет атрибут GFX_EXPORT — это старый добрый __declspec(dllexport) из модуля gfx.dll


А разве explicit instantiation в .cc файле не сработает? Типа такого:

// .hpp
template<typename T>
struct PointT
{
    T x = {};
    T y = {};

    PointT();
    PointT(T x, T y);
}; 

using Point = PointT<int>;
using PointF = PointT<float>;

// declare explicit instantiation
extern template PointT<int>;
extern template PointT<float>;

// .cpp
template<typename T>
struct PointT<T>::PointT() = default;

template<typename T>
struct PointT<T>::PointT(T x, T y) : x(x), y(y) {}

// define explicit instantiation
template PointT<int>;
template PointT<float>;


Надо будет с dllexport попробовать.
Re[12]: хромая логика
От: Кодт Россия  
Дата: 06.12.16 10:37
Оценка:
Здравствуйте, PM, Вы писали:

К>>С шаблонами такой фокус, ясное дело, не провернёшь.

К>>И обратите внимание на то, что Point сотоварищи имеет атрибут GFX_EXPORT — это старый добрый __declspec(dllexport) из модуля gfx.dll
PM>А разве explicit instantiation в .cc файле не сработает? Типа такого:

Сработает, наверно (?). Но гугл пошёл другим путём.
Надо поизучать, как атрибуты экспорта накладываются на явное воплощение шаблонов. Может быть, у gcc и VC есть расхождения в этих делах, и поэтому гугловцы решили не наступать на тонкий лёд.
Перекуём баги на фичи!
Re[13]: хромая логика
От: N. I.  
Дата: 07.12.16 09:51
Оценка:
Кодт:

К>>>И обратите внимание на то, что Point сотоварищи имеет атрибут GFX_EXPORT — это старый добрый __declspec(dllexport) из модуля gfx.dll

PM>>А разве explicit instantiation в .cc файле не сработает? Типа такого:

К>Сработает, наверно (?).


Работать-то оно будет, но вот мне интересно другое: какая экономия размера бинарника может получиться за счёт форсирования реального вызова функции, которая проста, как две копейки?
Re: хромая логика
От: c-smile Канада http://terrainformatica.com
Дата: 08.12.16 00:58
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Из исходников хромиума.


Эта муть из CSS тянется...


background-size: 300px 100px;       /* width->300, height->100 */

/* but! */

padding: 1.6em 20px;        /* top and bottom (vertical) 1.6em, left and right (horizontal) 20px margin */
padding: 1em 3px 30px 5px;  /*  top    1em  padding  */
                            /*  right  3px  padding  */
                            /*  bottom 30px padding  */
                            /*  left   5px  padding  */
Re[2]: хромая логика
От: Dair Россия https://dair.spb.ru
Дата: 08.12.16 05:50
Оценка:
Здравствуйте, c-smile, Вы писали:

К>>Из исходников хромиума.

CS>Эта муть из CSS тянется...

Ничего, ничего хорошего из web не пришло.

Kill it with fire.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.