Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
#1

Как делать правильнее? - C++

15.03.2012, 16:31. Просмотров 666. Ответов 16
Метки нет (Все метки)

Есть класс, допустим, "Фигура"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Shape
{
protected:
   int xpos;
   int ypos;
public:
   /* Здесь деструкторы и конструторы, гетеры..., возможно,
 перегруженные операторы и еще много разного на любой вкус - не важно, наверное(?)*/
   void setX(const int newx);
   void setY(const int newy);
   void moveTo(const int, const int);
};
void Shape::SetX(const int newx)
{
   xpos = newx;
}
void Shape::SetY(const int newy)
{
   ypos = newy;
}
Как было бы правильнее сделать?

Так?

C++
1
2
3
4
5
void Shape::moveTo(const int newx, const int newy)
{
   xpos = newx;
   ypos = newy;
}
Или так?

C++
1
2
3
4
5
void Shape::moveTo(const int newx, const int newy)
{
   setX(newx);
   setY(newy);
}
Во втором варианте можно бы было написать?
C++
1
void moveTo(const int, const int) const;
А не
C++
1
void moveTo(const int, const int);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 16:32     Как делать правильнее? #2
Цитата Сообщение от Merovingian Посмотреть сообщение
Так?
Первый вариант лучше по времени.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:34     Как делать правильнее? #3
второй вариант лучше для поиска ошибок
zss
Модератор
Эксперт С++
6240 / 5843 / 1890
Регистрация: 18.12.2011
Сообщений: 14,960
Завершенные тесты: 1
15.03.2012, 16:42     Как делать правильнее? #4
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:42  [ТС]     Как делать правильнее? #5
То, что первый вариант лучше по времени, а второй лучше для поиска ошибок - это я вижу.

Тут, конечно, сложно ошибиться

А больше разницы никакой?
zss
Модератор
Эксперт С++
6240 / 5843 / 1890
Регистрация: 18.12.2011
Сообщений: 14,960
Завершенные тесты: 1
15.03.2012, 16:44     Как делать правильнее? #6
Для наглядности кода можете подчеркнуть принадлежность изменяемых данных
к классу добавлением указателя this:
C++
1
2
this->xpos = newx;
this->ypos = newy;
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:44  [ТС]     Как делать правильнее? #7
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
Точно! Сомнения рассеяны... или развеяны)
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:47     Как делать правильнее? #8
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2012, 16:49     Как делать правильнее? #9
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
В принципе, да. Но если ты собираешься менять формат внутреннего представления, то тебе достаточно будет исправлять геты и сеты, а не отлавливать изменения по всему классу. Так что лучше поинтересуйся, можно ли как то ещё заинлайнить один метод в тело другого, кроме повторения там его исходника. То есть, можно ли написать второй вариант, а получить первый и как это делается.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:52  [ТС]     Как делать правильнее? #10
Цитата Сообщение от Melkor Посмотреть сообщение
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???

Не по теме:

Ну я не думаю, что сеттеры такие громоздкие бывают, что в них можно заплутать)

А драйверы.... Не думаю, что их пишут на ООП. Почти уверен, что на чистом си

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2012, 17:09     Как делать правильнее? #11
Сеты не могут быть громоздкими, громоздким бывает весь класс, а путаться будешь в общем списке мест их использования. Поэтому и следует поискать, как заставить компилятор подставлять тела методов при каждом использовании в других методах и ни когда не повторять в методах решение задач других методов. Хотя, зависит от сложности формата внутреннего представления, я не знаю, каким оно у тебя может оказаться, а чем он сложнее, тем сложнее и сеты с гетами. Но классы целиком не часто будут в экран влезать.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.03.2012, 17:15     Как делать правильнее? #12
Merovingian, делайте через аксессоры, рефакторить будет проще. А по поводу скорости: на таком не экономят. Придет время и если заметятся тормоза, то профайлер в руки. К тому же такие методы можно инлайнить.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 17:20     Как делать правильнее? #13
Цитата Сообщение от fasked Посмотреть сообщение
К тому же такие методы можно инлайнить.
А разве они не по умолчанию инлайн?
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.03.2012, 19:33     Как делать правильнее? #14
go, только если описаны в теле класса. Иначе нужно указывать явно.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 19:44     Как делать правильнее? #15
Т. о. подытожу: если функции будут описаны как inline, то второй вариант лучше.
Если же как в этом примере, то первый.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 19:54  [ТС]     Как делать правильнее? #16
Цитата Сообщение от go Посмотреть сообщение
если функции будут описаны как inline, то второй вариант лучше.

Не по теме:

Да, но ведь не факт, что компилятор сделает их inline ?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 20:10     Как делать правильнее?
Еще ссылки по теме:

Какой способ представления полей класса правильнее? C++
Как правильнее написать C++
C++ Как правильнее проинициализировать char's, чтобы не было мусора?
Как правильнее ввести текстовую строку C++
C++ Нюансы раздельной компиляции: где и что лучше и правильнее размещать?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.03.2012, 20:10     Как делать правильнее? #17
Merovingian, не факт. Так же не факт, что компилятор не заинлайнит функции, которые таковыми не объявлены.
Yandex
Объявления
15.03.2012, 20:10     Как делать правильнее?
Ответ Создать тему
Опции темы

Текущее время: 14:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru