Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменные-члены класса как проблема ООП 
:(
    Опции темы
math64
Дата 21.5.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



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

Добавлено через 1 минуту и 23 секунды
Цитата(iipetrov @  21.5.2013,  14:12 Найти цитируемый пост)
public-метод может выполнить свою функциональность, описанную в документацию, и поменять private-поля. 
Это может отразится на работе всех остальных методов класса.

Вот это и должно быть отражено в документации.
PM   Вверх
Guinness
Дата 21.5.2013, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(iipetrov @  21.5.2013,  13:58 Найти цитируемый пост)
Паттерн Singleton не зря же придумали. Это попытка решить описанную проблему ООП.

То что экзепляры класса разные? Это не проблема - это свойство любого объекта. Сложно в мире найти хотя бы 2 одинаковых объекта.
Singleton придумывали для того, чтобы в системе гарантированно был один экземпляр данного класса. Вопрос его использования в проектах - отдельная тема для обсуждения.
PM MAIL   Вверх
KaZepKa
Дата 21.5.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



Так что ТС не нравиться, что плохо документируют классы и он не знает, когда что поменяется?
Или тут что-то другое?)
PM MAIL   Вверх
Guinness
Дата 21.5.2013, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(iipetrov @  21.5.2013,  14:12 Найти цитируемый пост)
private-поля никогда не отражаются в документации. public-метод может выполнить свою функциональность, описанную в документацию, и поменять private-поля. Это может отразится на работе всех остальных методов класса.

Обычно такие методы имеют определенные правила именования. Они, чаще всего, будут начинаться с open, set, add, del, close или любого друго глагола, который явно будет указывать, что внутреннее состояние указанного объекта поменяется.
PM MAIL   Вверх
volatile
Дата 21.5.2013, 14:28 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(iipetrov @  21.5.2013,  09:39 Найти цитируемый пост)
Переменные-члены класса как проблема ООП 

Вас имхо тролят, господа
 smile 
PM MAIL   Вверх
Alexeis
Дата 21.5.2013, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  На самом деле в словах ТС есть доля правды. Сложные объекты как правило это плохие объекты. Документирование это, конечно, хорошо, но речь не о том, чтобы код писать аккуратно, а чтобы масштабирование приводило хотя бы к линейному росту числа ошибок. Классический подход основанный на наследовании и большой иерархии классов приводит таки к тому, что число ошибок начинает расти заметно быстрее чем количество строк кода. Как раз по той причине, что забывается где и что меняется.
  Я сам склоняюсь к тому, чтобы масштабирование делать за счет агрегации. Хотя кучу небольших классов сложнее увязывать между собой, но их проверка и тестирование многократно проще. Класс без полей это уже не ООП вовсе, но при небольшом количестве полей работа класса становиться достаточно прозрачной.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM ICQ Skype   Вверх
Arantir
Дата 21.5.2013, 15:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



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

iipetrov, все Ваши аргументы — это аргументы простого кодера. Вы берете свойства самого языка, паттерны и концепции, варите это все в собственном соку и выставляете претензии. Это бред, не имеющий практического применения.
Если бы хоть один нормальный проект в качестве примера создали/разобрали, то этой темы бы просто не возникло.

Математика исходит от природы, а не природа от математики. Программирование идет от практики, а не практика от программирования. Если бы Вы смогли это понять, то решили бы и все свои разногласия.

Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
нестатический метод совершенно не обязан давать одинаковые результаты на одинаковых входных данных
Это же отлично. Это же потрясающе! Можно создавать динамические и даже самообучающиеся программы!
Или Вы кроме конечных автоматов больше других структур вообразить не можете?

Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
Достаточно один раз вызвать неконстантный метод чтобы программа начала давать непредсказуемые результаты.
А какие это "непредсказуемые"? Программа выдаст мне строку вместо числа? Выключит компьютер вместо сохранения файла? Это уже точно бред. 
Если программа непредсказуема — то это фейл ее создателя. Если на вход ожидают данные с конкретными требованиями, то ничто не мешает эти данные по этим требованиям проверить. 
Программа будет настолько предсказуемой, насколько таковой Вы ее сделаете. 


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
iipetrov
Дата 21.5.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.5.2013

Репутация: нет
Всего: нет



Цитата(Arantir @ 21.5.2013,  15:03)
Или Вы кроме конечных автоматов больше других структур вообразить не можете?

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

Добавлено @ 15:16
Цитата(Arantir @ 21.5.2013,  15:03)
А какие это "непредсказуемые"? Программа выдаст мне строку вместо числа? Выключит компьютер вместо сохранения файла? Это уже точно бред.

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

Это сообщение отредактировал(а) iipetrov - 21.5.2013, 15:24
PM MAIL   Вверх
NoviceF
Дата 21.5.2013, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Цитата(iipetrov @  21.5.2013,  10:39 Найти цитируемый пост)
Какие еще есть решения у этой проблемы?

Цитата(iipetrov @  21.5.2013,  10:39 Найти цитируемый пост)
Программист, использующий класс, не может положиться на результат работы нестатического метода.


Автор, как ты видишь класс, являющийся абстракцией буфера, заполняемого пользователем с клавиатуры?
Какой метод ты бы использовал, чтобы программист "мог положиться" на результат работы метода GetAverage(), возвращающего среднее арифметическое всех значений находящихся в буфере. Кстати размер буфера тоже задаётся пользователем и не известен на момент компиляции.

Это сообщение отредактировал(а) NoviceF - 21.5.2013, 20:42
PM MAIL   Вверх
Result
Дата 21.5.2013, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 2
Всего: 5



Цитата(iipetrov @ 21.5.2013,  09:39)
Это создает существенную проблему: нестатический метод совершенно не обязан давать одинаковые результаты на одинаковых входных данных.

Вот смотри, в примере вызывается один метод add, а результат интерпретируется как вызов другого getA. Т.е. результат метода add всегда на одинаковых входных данных одинаков, значение будет увеличиваться на входной параметр. 
Как можно еще понимать результат вызова метода "прибавить" ? ИМХО, значением на которое увеличится (уменьшится при отрицательном).

Как бы ты стал тестировать работу метода add ?
PM   Вверх
baldina
Дата 21.5.2013, 21:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



ну что вы накинулись, господа. человек озвучил реальную (впрочем, избитую) проблему. проблему не только ООП, а императивного программирования вообще.
Цитата(Alexeis @  21.5.2013,  14:34 Найти цитируемый пост)
 На самом деле в словах ТС есть доля правды.

 smile 

Цитата(iipetrov @  21.5.2013,  09:39 Найти цитируемый пост)
Это создает существенную проблему: нестатический метод совершенно не обязан давать одинаковые результаты на одинаковых входных данных.

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

здесь проблема лишь в сложности контроля состояния. в ООП определенность поведения объекта это семантика его класса. в не ООП - это тоже семантика, но не класса, а фрагмента программы. например, псевдослучайного генератора rand()

Цитата(iipetrov @  21.5.2013,  13:47 Найти цитируемый пост)
В программе есть множество экземпляров, которые вроде бы представляют одно и то же, а на самом деле совершенно различны. Это тоже может привести к ошибкам.

точно так же если в программе множество глобальных переменных, программа становится трудно управляемой. вобщем ООП тут непричем.

Цитата(iipetrov @  21.5.2013,  09:39 Найти цитируемый пост)
В качестве решения например можно
- помещать в секцию public только константные методы, а состояние класса задавать в конструкторе

есть такое.
это шаг в сторону функционального программирования. ФП считается более надежным именно из-за отсутствия побочных эффектов.
везде, где можно использовать функциональный подход, его полезно использовать. stl и boost - хорошие образцы такого подхода в С++

однако совсем без побочных эффектов не обойтись, т.к. именно ради них и пишутся программы

Добавлено через 7 минут и 46 секунд
ЗЫ: для контроля непротиворечивости фрагмента программы (класса, функции, библиотеки) используют контроль части состояния, которая должна оставаться неизменной в процессе или после выполнения операций (т.е. логических выражений относительно текущего значения переменных). это называется проверкой инваранта (класса, функции, цикла). во всяких assertах и внешних тестах фактически проверяются инварианты. 
PM MAIL   Вверх
Arantir
Дата 21.5.2013, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



iipetrov, да Вы просто некачественную книжечку почитали на эту тематику...
Скажу Вам так. Ваши проблемы связанны с Вашим личным непониманием и не имеют связи с реальным миром.
Аргументы Ваши логически правильные, но они не доказывают существование оспариваемой проблемы, это самодостаточные утверждения, даже не являющееся аргументами.

Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
нестатический метод совершенно не обязан давать одинаковые результаты на одинаковых входных данных.
Верно.
Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
Программист, использующий класс, не может положиться на результат работы нестатического метода.

Плохой программист.
Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
Достаточно один раз вызвать неконстантный метод чтобы программа начала давать непредсказуемые результаты.

Плохая программа.

Вот и все.  Все, что вы пишите — это ошибки, которые может допустить программист. Но важно заметить, что ошибки программиста — не часть ООП. И он не обязан их совершать.

Это сообщение отредактировал(а) Arantir - 21.5.2013, 22:06


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Alexeis
Дата 21.5.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Arantir @  21.5.2013,  23:06 Найти цитируемый пост)
Вот и все.  Все, что вы пишите — это ошибки, которые может допустить программист. Но важно заметить, что ошибки программиста — не часть ООП. И он не обязан их совершать.

  А вот и обязан. Особенно ООП ошибки при написании ООП кода. Хотя каждый программист и мнит себя Богом, но статистика вещь неумолимая. Если есть даже небольшой процент совершить логическую ошибку любой некоторой  строке, то с увеличением числа строк/классов/функций шанс совершить ошибку растет по формуле 1-(шанс не совершить ошибку)^n , где  n число единиц кода  для которых по статистике имеется такой шанс не совершить ошибку. Я думаю для больших проектов процент совершить хотя бы одну логическую ошибку порядка 99.99% если не выше. 
  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
iipetrov
Дата 21.5.2013, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.5.2013

Репутация: нет
Всего: нет



Цитата(Arantir @ 21.5.2013,  22:06)
Вот и все.  Все, что вы пишите — это ошибки, которые может допустить программист. Но важно заметить, что ошибки программиста — не часть ООП. И он не обязан их совершать.

Ошибки могут допустить и программисты-авторы библиотек классов. В каком-нибудь далеком базовом классе непонятно почему меняется состояние. В результате возникает ошибка в конечной программе.

Добавлено через 6 минут и 37 секунд
Цитата(NoviceF @ 21.5.2013,  20:16)
Какой метод ты бы использовал, чтобы программист "мог положиться" на результат работы метода GetAverage(), возвращающего среднее арифметическое всех значений находящихся в буфере.

А метод GetAverage(int* a, int n) с точки зрения ООП некорректен? Обязательно делать массив и число элементов членами класса?
PM MAIL   Вверх
Arantir
Дата 21.5.2013, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Цитата(Alexeis @  21.5.2013,  22:01 Найти цитируемый пост)
А вот и обязан.

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

Я же имел ввиду, что программу можно сделать предсказуемой. И оставлять ее непредсказуемой только потому, что это возможно в следствие принципов ООП — это неправильно.

ТС сказал что-то вроде "Можно потянуть связки, вставая с кровати. Какие есть методы решения этой проблемы?" Но миллионы людей как-то по утрам нормально встают с кровати не заморачиваясь этим вопросом, ибо он, как таковой, не имеет смысла. В этом контексте ТС просто не может понять, как люди с кровати встают.


Как можно приводить этот пример 
Код

if ((float)(a % 100) / 3 == (int)((a % 100) / 3))
и при этом писать писать 
Цитата(iipetrov)

Переменные-члены класса как проблема ООП
Цитата(iipetrov @  21.5.2013,  08:39 Найти цитируемый пост)
Это создает существенную проблему: нестатический метод совершенно не обязан давать одинаковые результаты на одинаковых входных данных.

Такой человек или еще или вообще не программист. 
Не ООП делает программу непредсказуемой, а банальные или глупые ошибки. Неправильное преобразование типов, необдуманные инкременты, отсутствие проверок корректности данных и т.п. т.д.
ООП позволяет создавать полностью корректные программы любого размера и масштаба. Проблема ошибок — это проблема человеческого восприятия мира, а не принципов ООП.

Если чем-то можно совершить ошибку, то это еще не значит, что это его недостаток. И ножом можно порезаться, и самолет может упасть, и короткое замыкание в технике может быть... Но нож должен быть острым, чтобы хорошо резать; самолет должен быть над землей, чтобы быстро лететь; технике нужна электроэнергия, чтобы выполнять столь полезные функции.
То, что в ООП есть обсуждаемые в этой теме вещи, только дает больший размах, больше свободы для реализации своих идей на практике.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.