Russian Qt Forum
Ноябрь 23, 2024, 04:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 3 4 [5] 6 7 ... 16   Вниз
  Печать  
Автор Тема: Приватные методы  (Прочитано 102280 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #60 : Сентябрь 28, 2015, 17:15 »

Но и тогда, вы никогда не знаете, как будет использоваться ваш код в будущем другими людьми...
Ну это фантастика. Каждый класс можно использовать только так, как это предполагал его автор. И это касается даже самых, на первый глаз, универсальных классов. Включая стандартную библиотеку.
Сможете привести пример такого класса, который был разработан для одного, а вы бы легко его приспособили для другого?
Записан
Bepec
Гость
« Ответ #61 : Сентябрь 28, 2015, 17:29 »

Хых.
Пример класс скачивания странички.
Используем как класс определения доступности интернета Веселый

Класс пишется для определенных ситуаций. Но он как кубик рубика, имеет десятки различных сторон применения.

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #62 : Сентябрь 28, 2015, 17:31 »

Хых.
Пример класс скачивания странички.
Используем как класс определения доступности интернета Веселый

Класс пишется для определенных ситуаций. Но он как кубик рубика, имеет десятки различных сторон применения.
Он все так же будет скачивать странички, только на их содержимое вам будет наплевать. И приватными методами вы этого не измените.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #63 : Сентябрь 28, 2015, 17:36 »

QWidget Подмигивающий
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #64 : Сентябрь 28, 2015, 17:46 »

QWidget Подмигивающий
Ну в принципе да, его можно использовать как коллекцию виджетов...
Но даже в настолько универсальном классе нашлось место для приватных данных и методов. И я уверен, что без чтения исходников вы о них даже не знали. Подмигивающий
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #65 : Сентябрь 29, 2015, 01:21 »

Я лично вижу лишь одно оправданное применение привата: какие-нибудь локальные "хелперы", которые на 200% больше нигде не понадобятся, чем в данном конкретном классе. Но и тогда, вы никогда не знаете, как будет использоваться ваш код в будущем другими людьми...

Радикальный взгляд с другой стороны:
(Building user interfaces for object-oriented systems)
Цитировать
1. All data is private. Period. (This rule applies to all implementation details, not just the data.)
2. get and set functions are evil. (They're just elaborate ways to make the data public.)
3. Never ask an object for the information you need to do something; rather, ask the object that has the information to do the work for you.
4. It must be possible to make any change to the way an object is implemented, no matter how significant that change may be, by modifying the single class that defines that object.
Как думаете, что скажет автор этой статьи, если запретить ему использовать private? Улыбающийся И я согласен с его доводами. А с Вашими нет.

Protected-секции недостаточно.

Код
C++ (Qt)
 
class Status
{
...
}
 
class A
{
   A() : m_status() {}
 
protected:
   const Status & status() const { return m_status; }
 
private:
   Status m_status;
}
 

Достаточно ясно сказано, что если сильно надо, то в наследнике можете посмотреть значение статуса, а вот менять его нельзя. Автор класса лучше знает, где и как может меняться статус, и почему изменение статуса сторонними классами может быть опасно. Исходя из Вашей позиции, широкий круг пользователей этого класса может лучше автора знать, как изменять статус объекта. Если этот широкий круг пользователей поломает логику работы объекта несанкционированным изменением статуса, и будут писать автору, что он криворукий, что на это должен отвечать автор? Улыбающийся

Но и тогда, вы никогда не знаете, как будет использоваться ваш код в будущем другими людьми...

Когда есть чёткое разделение кода по секциям доступа, то точнее будете знать, как этот код может, и главное будет использоваться. По крайней мере есть возможность исключить неправильное использование класса. Ну и документацию никто не отменял, где можно расписать, что можно, что нельзя и почему. То, что Вам непосчастливилось встретиться с плохим кодом, это прискорбно. Но это частный случай, и как уже неоднократно указывали, язык тут не при чём.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Сентябрь 29, 2015, 05:19 »

Код
C++ (Qt)
protected:
   const Status & status() const { return m_status; }
 
private:
   Status m_status;
}
 
Ну а чего возвращаем по ссылке, провоцируя const_cast?  Улыбающийся

Достаточно ясно сказано, что если сильно надо, то в наследнике можете посмотреть значение статуса, а вот менять его нельзя. Автор класса лучше знает, где и как ...
Ах как легко делать выводы вот на таком примерчике с нулевым ф-ционалом Улыбающийся Как все стройно и логично! В действительности автор часто вообще ничего не знает, а тупо лепит "по книжке". Или знает но не в состоянии представить себе все варианты использования, это нормально. В любом случае пользователь класса оказывается в тупиковой ситуации.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #67 : Сентябрь 29, 2015, 12:20 »

Цитировать
Ах как легко делать выводы вот на таком примерчике с нулевым ф-ционалом
Основной посыл здесь в том, что отказываясь от привата, вы, фактически, только представьте: развязываете руки целой команде "Практиков" (с большой буквы П) из подмостерья Racheengel, например..
Представляете, чем это чревато? А эти люди ещё всерьёз говорят о
Цитировать
но язык предоставляет конструкции, которые потенциально опасны, а их ценность под вопросом.
 
Так вот, отказ от приват, открывает эту потенциальную опасность, поподя ваш код не в те руки)

И да, нет ничего практичнее хорошей теории)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #68 : Сентябрь 29, 2015, 12:25 »

Код
C++ (Qt)
protected:
   const Status & status() const { return m_status; }
 
private:
   Status m_status;
}
 
Ну а чего возвращаем по ссылке, провоцируя const_cast?  Улыбающийся
Хороший вопрос Улыбающийся. А как надо? Как бы Вы метод status() написали?

Ах как легко делать выводы вот на таком примерчике с нулевым ф-ционалом Улыбающийся
В примерчике показан смысл, а не функционал. В простыне функционального примера экрана на два, смысл остался бы точно таким же Улыбающийся.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #69 : Сентябрь 29, 2015, 12:26 »

Хороший вопрос Улыбающийся. А как надо? Как бы Вы метод status() написали?
Возвращать по значению.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #70 : Сентябрь 29, 2015, 12:37 »

Хороший вопрос Улыбающийся. А как надо? Как бы Вы метод status() написали?
Так же как и Вы. Тут, правда, есть манечка, дескать, "бинарная совместимость" - но положил я на нее.

Основной посыл здесь в том, что отказываясь от привата, вы, фактически, только представьте: развязываете руки целой команде "Практиков" (с большой буквы П) из подмостерья Racheengel, например..
Представляете, чем это чревато?
Та ничем, это дорога в светлое будущее. А вообще private - это скорее светлая сторона языка, особенно по сравнению с таким калом как template ...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #71 : Сентябрь 29, 2015, 12:49 »

Цитировать
Та ничем, это дорога в светлое будущее.
Ну судя по заявлениям типа:
Цитировать
с таким калом как template ...
Это скорее, дорога в тёмное прошлое, даже не скорее, а точно  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #72 : Сентябрь 29, 2015, 13:15 »

развязываете руки целой команде "Практиков" (с большой буквы П) из подмостерья Racheengel, например..

Мои подмастерья вполне безобидные и без необходимости const_cast не пихают во все дыры (ну, или по рукам вовремя получают). Я не писал, вообще-то, что мы СОВСЕМ не используем приват. Но на практике почему-то от него было больше проблем, чем позитива. Или сделать данные приватными и на каждую переменную завести по геттеросеттеру (java style) - это хорошая практика???

Цитировать
Как бы Вы метод status() написали?

Нормальный метод, возврат по ссылке исключает создание копии. Что с ней дальше будут делать - вопрос, если очередной Гуру Полиморфизма придет, то const_cast напишет Улыбающийся Он же ГУРУ.

Цитировать
А вообще private - это скорее светлая сторона языка, особенно по сравнению с таким калом как template ...

Если под "калом" имеется в виду синтаксис - соглашусь. Если т.н. "метапогромирование" - то тоже соглашусь (но это все-таки больше проблема Гур, чем темплейтов). Но в целом-то фича важная и нужная, когда правильно используется, а не write-only.

Просто изначально темплейты были для другого придуманы, а как без шаблонов контейнеры лепить? Ась? Улыбающийся
« Последнее редактирование: Сентябрь 29, 2015, 13:17 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #73 : Сентябрь 29, 2015, 13:20 »

Нормальный метод, возврат по ссылке исключает создание копии. Что с ней дальше будут делать - вопрос, если очередной Гуру Полиморфизма придет, то const_cast напишет Улыбающийся Он же ГУРУ.
А если нет такого члена как m_status, а статус вернуть надо? Улыбающийся
А если сейчас такой член есть, а через год он станет не нужен и его уберут, а статус возвращать по прежнему надо? Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #74 : Сентябрь 29, 2015, 13:26 »

А если нет такого члена как m_status, а статус вернуть надо? Улыбающийся

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

А если сейчас такой член есть, а через год он станет не нужен и его уберут, а статус возвращать по прежнему надо? Улыбающийся

По-моему, у Вас тут противоречие. Нужен статус или нет? Если да - зачем его убирать? Если нет - зачем его возвращать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 ... 3 4 [5] 6 7 ... 16   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 23.