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

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

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

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

15.03.2012, 16:31. Просмотров 669. Ответов 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);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 16:31     Как делать правильнее?
Посмотрите здесь:

Как правильнее написать - C++
Пример int ПРОВЕРКА1{ Проверка переменной на свойство; Возврат 1 или 0; } void main(){ int x; scanf("%d",&x); ...

Как правильнее ввести текстовую строку - C++
почему стандартный ввод небезопасен? что лучше делать так char str; char *s; s = gets( str ); почему лучше так?

Как правильнее проинициализировать char's, чтобы не было мусора? - C++
struct ElementOfTree { char value; ElementOfTree *parent; ElementOfTree *left; ElementOfTree *right; }; struct Tree ...

Какой способ представления полей класса правильнее? - C++
Здравствуйте! Переписываю игровой движок с Java на C++. В C++ не так давно программирую, поэтому возник вопрос как выгоднее...

Нюансы раздельной компиляции: где и что лучше и правильнее размещать? - C++
Здравствуйте! Допустим, я хочу написать интерфейс класса в h-файле, а его реализацию в cpp-файле. Могу ли я в этом cpp-файле до...

как это делать? - C++

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 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
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.03.2012, 19:33     Как делать правильнее? #14
go, только если описаны в теле класса. Иначе нужно указывать явно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 19:44     Как делать правильнее?
Еще ссылки по теме:

как делать трассировку? - C++
не получается нормально сделать трассировку. помогите. надо уложиться в 50 строк, избегая ввода и вывода переменных. //...

Задание проги на Си. Как ее делать? - C++
Задание: Пару скобок в логической формуле назовем избыточной, если после ее удаления формула останется эквивалентна исходной. Удалить все...

Как делать оконные приложения C++ - C++
Извините за ламерский вопрос, но всё же, кто как делает оконные приложения на С++? Mfc? Или Borland C++ Builder? Кто может дать...

Подскажите как делать,пожалуйста - C++
Вот задачка,сколько сижу думаю над ней,не понимаю=( 1)Соседями элементами Аij в матрице назовем элементы Аkl(внизу) c...


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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 19:44     Как делать правильнее? #15
Т. о. подытожу: если функции будут описаны как inline, то второй вариант лучше.
Если же как в этом примере, то первый.
Yandex
Объявления
15.03.2012, 19:44     Как делать правильнее?
Ответ Создать тему
Опции темы

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