54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
1

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

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

Author24 — интернет-сервис помощи студентам
Есть класс, допустим, "Фигура"

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);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2012, 16:31
Ответы с готовыми решениями:

Перерисовка, как правильнее?
какое условие правильнее использовать если нужно перерисовывать визуализацию, если перетащить...

Как правильнее написать
Пример int ПРОВЕРКА1{ Проверка переменной на свойство; Возврат 1 или 0; } void main(){ ...

Как правильнее сделать?
Как правильно сделать: сначала создать интерфейс программы(формы , фреймы , кнопки и т. д.) или...

Как правильнее и быстрее?
Как правильнее будет? Так: SELECT ID, NAME_USR, dbo.GetNameDistr(NAME_USR) AS NAME_DISTR, RIC,...

16
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 16:32 2
Цитата Сообщение от Merovingian Посмотреть сообщение
Так?
Первый вариант лучше по времени.
1
31 / 31 / 6
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:34 3
второй вариант лучше для поиска ошибок
1
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,687
15.03.2012, 16:42 4
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:42  [ТС] 5
То, что первый вариант лучше по времени, а второй лучше для поиска ошибок - это я вижу.

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

А больше разницы никакой?
0
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,687
15.03.2012, 16:44 6
Для наглядности кода можете подчеркнуть принадлежность изменяемых данных
к классу добавлением указателя this:
C++
1
2
this->xpos = newx;
this->ypos = newy;
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:44  [ТС] 7
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
Точно! Сомнения рассеяны... или развеяны)
0
31 / 31 / 6
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:47 8
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2012, 16:49 9
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
В принципе, да. Но если ты собираешься менять формат внутреннего представления, то тебе достаточно будет исправлять геты и сеты, а не отлавливать изменения по всему классу. Так что лучше поинтересуйся, можно ли как то ещё заинлайнить один метод в тело другого, кроме повторения там его исходника. То есть, можно ли написать второй вариант, а получить первый и как это делается.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:52  [ТС] 10
Цитата Сообщение от Melkor Посмотреть сообщение
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???

Не по теме:

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

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

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2012, 17:09 11
Сеты не могут быть громоздкими, громоздким бывает весь класс, а путаться будешь в общем списке мест их использования. Поэтому и следует поискать, как заставить компилятор подставлять тела методов при каждом использовании в других методах и ни когда не повторять в методах решение задач других методов. Хотя, зависит от сложности формата внутреннего представления, я не знаю, каким оно у тебя может оказаться, а чем он сложнее, тем сложнее и сеты с гетами. Но классы целиком не часто будут в экран влезать.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.03.2012, 17:15 12
Merovingian, делайте через аксессоры, рефакторить будет проще. А по поводу скорости: на таком не экономят. Придет время и если заметятся тормоза, то профайлер в руки. К тому же такие методы можно инлайнить.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 17:20 13
Цитата Сообщение от fasked Посмотреть сообщение
К тому же такие методы можно инлайнить.
А разве они не по умолчанию инлайн?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.03.2012, 19:33 14
go, только если описаны в теле класса. Иначе нужно указывать явно.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 19:44 15
Т. о. подытожу: если функции будут описаны как inline, то второй вариант лучше.
Если же как в этом примере, то первый.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 19:54  [ТС] 16
Цитата Сообщение от go Посмотреть сообщение
если функции будут описаны как inline, то второй вариант лучше.

Не по теме:

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

0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.03.2012, 20:10 17
Merovingian, не факт. Так же не факт, что компилятор не заинлайнит функции, которые таковыми не объявлены.
1
15.03.2012, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2012, 20:10
Помогаю со студенческими работами здесь

Как правильнее настроить охлаждение
Здравствуйте! У меня возник вопрос о охлаждении (хотелось бы сбросить температуру видеокарты и...

Как правильнее обработать исключения?
Здарвствуйте. Хочу сделать так, чтобы кодировка программы задавалась пользователем явно(будь то...

как правильнее сформировать обьект
вобщем есть вот такая вот форма я пишу программку которая бы могла сама формировать...

Как правильнее связать сущности?
У меня есть Сущности: СчетЮридическогоЛица ВладыЮридическогоЛица Операции Я их соединил таким...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru