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

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

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

Сообщений: 2679


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


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

Встречный вопрос - зачем?
Чтобы показать, что приватная часть используется только в наследуемом классе. Тем самым отделяем частное от общего.

Отлично, а теперь представьте, что вам необходимо отнаследоваться и изменить или расширить приватную часть в наследнике. Код в дллке, исходники отсутствуют (сторонняя либа), что делать будем?
Записан

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 не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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


инвариант? не, не слышал.

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

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 не волк, в лес не уйдёт
qate
Супер
******
Offline Offline

Сообщений: 1177


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

Отлично, а теперь представьте, что вам необходимо отнаследоваться и изменить или расширить приватную часть в наследнике. Код в дллке, исходники отсутствуют (сторонняя либа), что делать будем?

приватная часть - это внутренняя реализация этого класса
если создатель класса поместил чтото в приват, значит он показывает этим - это мое, не лезь сюда.
если ты пользователь класса - тебе в паблик
если ты наследник - ты можешь еще и protected
пользовать dll без исходников - ССЗБ )
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #18 : Сентябрь 22, 2015, 11:04 »

если создатель класса поместил чтото в приват, значит он показывает этим - это мое, не лезь сюда.

А если там Большой Багъ ?

если ты пользователь класса - тебе в паблик
если ты наследник - ты можешь еще и protected
пользовать dll без исходников - ССЗБ )

А если либа коммерческая ?

Я не троллинга ради, это реальная проблема, которая возникает время от времени. Необходимо изменить реализацию приватной части в наследнике. protected - это отличный способ сказать человеку, что реализация внутренняя и так просто ее менять не следует. А что говорит приват? Только то, что код очень сильно завязан на конкретной последовательности обработки данных, и, типа, "работает - не трогай". Но, как правило, именно там и "не работает" Улыбающийся


Записан

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 не волк, в лес не уйдёт
qate
Супер
******
Offline Offline

Сообщений: 1177


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

А если либа коммерческая ?

писать баг репорт, жаловаться, избегать вообще таких либ (если возможно) и такой разработки )

если ее написали криво, то конструкция языка в этом не виноваты же )

можно написать отдельное приложение с этой либой - упадет, перезапустить, не мешая основной программе

Записан
Bepec
Гость
« Ответ #20 : Сентябрь 22, 2015, 18:33 »

Такой хакинг оправдан только в случае острой необходимости, ибо не гарантирует работоспособности кода после правки переменных.
Одним изменением можно завести класс в тупик, из которого нет выхода.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


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


инвариант? не, не слышал.

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

наличие инкапсуляции ещё не гарантия инварианта.
но её отсутствие - точно сводит инвариант на нет.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #22 : Сентябрь 24, 2015, 10:30 »

protected, отличное средство для инкапсуляции Улыбающийся

а наличие private подрывает один из принципов ООП - наследуемость.
Записан

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 не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #23 : Сентябрь 24, 2015, 23:40 »

protected, отличное средство для инкапсуляции Улыбающийся

а наличие private подрывает один из принципов ООП - наследуемость.

1.
private ничего не подрывает.
лишь определяет контракт.

2.
вы в любом случае наследуете весь функционал и данные базового класса.
другое дело, что вы не всегда имеете к нему доступ.
и это не случайно. см пункт 1.

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

Сообщений: 2679


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


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

Приведите пример НЕОБХОДИМОГО использования private, а не protected. Т..е. когда без него либо совсем не обойтись, либо преимущества настолько велики.
Записан

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 не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


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

Приведите пример НЕОБХОДИМОГО использования private, а не protected. Т..е. когда без него либо совсем не обойтись, либо преимущества настолько велики.

приведите пример НЕОБХОДИМОГО использования модификаторов доступа вообще,
а так же квалификаторов const.

вы похоже не осознаете, насколько глупа ваша просьба.

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

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

но вы сами можете взять эти самые книжки и просто прочитать.
например: "Совершенный код" Макконелла.



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

Сообщений: 2679


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


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

Пример необходимости const? Да ради бога. C помощью const вы сообщаете компилятору, что данный метод либо переменная являются в принципе константными. Возьмем, например, метод

bool doSomething(const QList& listIn, QList& listOut) const
{
...
}

const QList& listIn обозначает то, что listIn не должен меняться внутри doSomething. Во-первых, программист, видя это определение, понимает, что listIn является входным параметром, в отличие от listOut, а во-вторых, это дает больше возможностей компилятору оптимизировать данный код.

const в конце doSomething означает, что сам по себе метод не предполагает изменений состояния объекта (чем не инваринт?), а значит, написать в коде что-то типа

m_member = listIn;

компилятор не позволит, пока m_member не будет объявлен как mutable в заголовке класса.

И не надо меня тыкать в книжки и прочую документацию. Я в своей жизни много всего перечитал. Как правило, теория и практика - вещи не всегда совместимые (хотя академику-теоретику этого, увы, не дано понять, уж простите).

Прежде чем обвинять людей в том, что они идиоты, докажите это. Не повторяйте книжные фразы. Просто приведите пример преимущества private против protected. Как видите, "глупую" просьбу насчет const я выполнил Улыбающийся

Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Приведите пример НЕОБХОДИМОГО использования private, а не protected. Т..е. когда без него либо совсем не обойтись, либо преимущества настолько велики.
Не все можно исчерпать примерами, но преимущества private (как и const) действительно могут быть очень велики. Они позволяют программисту сделать "утверждение", проводить какую-то (не побоюсь этого слова) концепцию. Правильна она или нет - др вопрос. Да, это часто конфликтует с "гибкостью", c'est la vie

Да и вообще полемика довольно беспредметна, мол, "мне не нравится это". Плохо или хорошо - но оно так будет, и наши симпатии ничего не изменят. Не навязывают идиотскую "классовость" как в др языках - и слава богу, радуйтесь жизни  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Просто получается, что все, что находится в привате - не имеет права на ошибку и на ее исправление (либо расширение функционала) в потомках. А это ограничивает, и не всегда в лучшую сторону.
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Просто получается, что все, что находится в привате - не имеет права на ошибку и на ее исправление (либо расширение функционала) в потомках. А это ограничивает, и не всегда в лучшую сторону.
Да, так и есть. Но недостатки есть продолжение достоинств - и наоборот. А стремление "чтобы всем было хорошо" выглядит несколько наивно  Улыбающийся
Записан
Страниц: 1 [2] 3 4 ... 16   Вверх
  Печать  
 
Перейти в:  


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