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

Поиск:

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


Новичок



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

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



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

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

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

Какие еще есть решения у этой проблемы? Есть ли какие-то общепринятые подходы? 

В качестве примера можно привести такие классы

Код

class Simple
{
  private int a = 0;

  public void add(int b)
  {
    a = a + b;
  }

  public int getA()
  {
    return a;
  }
}

class Difficult
{
  private int a = 0;

  public void add(int b)
  {
    if ((float)(a % 100) / 3 == (int)((a % 100) / 3) )
      a = a + b;
    else
      a = a - b;
  }

  public int getA()
  {
    return a;
  }
}


Если первый класс относительно предсказуем, то про второй класс это уже не сказать.
На практике обычно переменных-членов намного больше, и поведение намного более непредсказуемо.

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


Эксперт
****


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

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



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

Ты пишешь несусветную глупость. Нестатический метод - это такая функция, первый аргумент которой всегда указатель на объект класса. У константных методов этот указатель константный. Все. Вдолби это себе в голову и твоя универсальная формула начнет работать.
PM   Вверх
xvr
Дата 21.5.2013, 11:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

Это не проблема - это аксиома.  smile 

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


Амеба
Group Icon


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

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



  Суть функции члена это изменение состояния объекта. Иначе функциональщина получается какая-то.

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


Новичок



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

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



Цитата(bsa @ 21.5.2013,  10:53)
Ты пишешь несусветную глупость. Нестатический метод - это такая функция, первый аргумент которой всегда указатель на объект класса. У константных методов этот указатель константный.

Этот аргумент скрыт от программиста, если он и есть... Программисту С++ не важно как реализуется на низком уровне.

Статический метод не зависит от данных класса. 
Константный метод зависит от данных класса, но не меняет их.
Не константный метод делает с данными класса что угодно.

Поэтому гарантирует одинаковый выход при одинаковом входе только статический метод. Исключение - случай когда все методы константные, или когда вообще нет данных.

Где конкретно у меня написана глупость?



PM MAIL   Вверх
Guinness
Дата 21.5.2013, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(iipetrov @  21.5.2013,  13:08 Найти цитируемый пост)
Где конкретно у меня написана глупость?

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


Новичок



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

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



Цитата(Guinness @ 21.5.2013,  13:26)
Цитата(iipetrov @  21.5.2013,  13:08 Найти цитируемый пост)
Где конкретно у меня написана глупость?

Боюсь, что везде. Вы же не отличаете данные класса от данных экземпляра класса.

Еще как отличаю. Я ничего еще про экземпляры не говорил. Это отдельная проблема.
Не надо цепляться к словам. Имелись в виду именно данные экземпляра класса.

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


Эксперт
****


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

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



iipetrov, код у тебя не C++, а  C# или Java.
Не статический метод может делать с полями класса что угодно, но это не значит что он должен это делать.
Обычно перед объявлением метода описывается, что он делает - и он должен делать именно это.
При оформлении этих комментариев по специальным правилам из файла исходников можно создать файл документации.
Пользователю твоего класса прочитавшему твою документацию, должно быть ясно что метод делает. А про private-поля он не должен думать.
PM   Вверх
iipetrov
Дата 21.5.2013, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.5.2013,  13:38)
Пользователю твоего класса прочитавшему твою документацию, должно быть ясно что метод делает. А про private-поля он не должен думать.

Юзеру надо постоянно помнить в каком же состоянии находится экземпляр класса. А состояние именно в private-полях (то есть юзер фактически не знает его). Это рано или поздно приведет к ошибкам.
К тому же сплошь и рядом классы плохо документируются, и даже исходник класса отсутствует.


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


Опытный
**


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

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



Цитата(iipetrov @  21.5.2013,  13:35 Найти цитируемый пост)
 Я ничего еще про экземпляры не говорил

Цитата(iipetrov @  21.5.2013,  13:35 Найти цитируемый пост)
Имелись в виду именно данные экземпляра класса.

Цитата(iipetrov @  21.5.2013,  13:35 Найти цитируемый пост)
Не надо цепляться к словам.

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

Какая?
PM MAIL   Вверх
iipetrov
Дата 21.5.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guinness @ 21.5.2013,  13:43)
Цитата
Это отдельная проблема.

Какая?

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

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


Опытный
**


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

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



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

Вы всетаки разберитесь, что такое класс, а что такое его экземпляр. И чем они отличаются. Хотя бы на интуитивно понятном примере класса User, у которого, к примеру, есть атрибуты login и pswd.
Или если Вы это понимаете, то я не понимаю про какие ошибки Вы говорите. Приведите пример.
PM MAIL   Вверх
iipetrov
Дата 21.5.2013, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Паттерн Singleton не зря же придумали. Это попытка решить описанную проблему ООП.

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


Эксперт
****


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

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



Классы без полей - это экзотический случай, у нормальных классов есть хотя бы одно поле, и это никак не нарушает парадигму ООП - где-то состояние объеков же надо хранить, без этого никак.
А вот если ты не пишешь документацию (хотя бы давая говорящие имена методам), а тем более изменяя метод, и не отражаешь это в документации - это действительно нарушение принципов ООП.
Относительно лишних полей:
Код

class A {
public:
  int getX() { return x; }
private:
  int x;
};

class B {
public:
  A getA() { return a; }
  int getX() { if(<оптимизация>) x = a->getX(); return x; }
private:
  A* a;
  int x; // Вот это поле действительно лишнее - можно всегда получить его из a->getX()
};



Это сообщение отредактировал(а) math64 - 21.5.2013, 14:06
PM   Вверх
iipetrov
Дата 21.5.2013, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



math64
private-поля никогда не отражаются в документации. 
public-метод может выполнить свою функциональность, описанную в документацию, и поменять private-поля. 
Это может отразится на работе всех остальных методов класса.

Это сообщение отредактировал(а) iipetrov - 21.5.2013, 14:13
PM MAIL   Вверх
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   Вверх
Arantir
Дата 22.5.2013, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


Новичок



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

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



Цитата(Arantir @ 22.5.2013,  00:07)
Я не отрицаю возможности ошибок. Я не отрицаю возможности непредсказуемого поведения программы.
Я лишь отрицаю верность утверждения, на котором основана эта тема. Утверждения о том, что это является проблемой, порожденной ООП.

В программах без ООП те же проблемы могут вызвать глобальные переменные. Но их как правило стараются избегать. 
В классах же данные есть почти всегда. Поэтому описанная проблема больше относится к именно ОО подходу.
PM MAIL   Вверх
Alexeis
Дата 22.5.2013, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Arantir @  22.5.2013,  00:40 Найти цитируемый пост)
Вы искривляете смысл цитаты. Ошибка, как человеческий фактор, уже не зависит от того ООП это или не ООП, или вообще ли это программирование. При любой ручной работе такие ошибки обязательно когда-то возникают.

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

Цитата(Arantir @  22.5.2013,  00:40 Найти цитируемый пост)
ООП позволяет создавать полностью корректные программы любого размера и масштаба. Проблема ошибок — это проблема человеческого восприятия мира, а не принципов ООП.

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

Вообще, ТС, конечно, троль. Чую он нарыл описалово преимущества ФП по отношению к императивным языкам и вборсил в форум ярых императивщиков. 


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

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

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


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


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

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



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

У меня в голове не вмещаются одновременно 2 вещи: Ваши, как Вы пытаетесь показать, "глубокие" познания в этой сфере и факт существования этой темы. Кажется, что просто не существует ответа, который Вы бы хотели тут увидеть...

Добавлено через 9 минут и 43 секунды
Цитата(Alexeis @  21.5.2013,  23:42 Найти цитируемый пост)
Не позволяет. ООП ничего не говорит о том как правильно писать программы.

То есть"говорит о том как" и "позволяет" — это одно и то же? Зачем просто придираться к словам?
Я перефразирую: с помощью (используя) ООП возможно создавать полностью корректные программы любого размера и масштаба. Большие программы без ошибок никаким принципам ООП не противоречат.
Дело в контроле и тестировании. При строительстве самолета уделяется огромное количество средств на контроль качества на всех уровнях производства. Если бы самолет строили столько же человек и с аналогичными возможностями, сколько в среднестатистической разработческой группе программистов, то ошибок в этом самолете было бы не меньше, чем в программах.



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


Амеба
Group Icon


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

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



Цитата(Arantir @  22.5.2013,  01:51 Найти цитируемый пост)
То есть"говорит о том как" и "позволяет" — это одно и то же? Зачем просто придираться к словам?

  Я не придираюсь к словам, я расставляю акценты. Ключевая мысль в том, что масштабируемые программы работают благодаря опыту проектирования и знаниям в первую очередь. При этом может использоваться кирпич (объект) как основной материал. Т.е. не объект панацея, а именно опыт и знания. Если, к примеру, вам дать n-е количество машин кирпичей и сказать стройте дом. Я не думаю, что получиться что-то хорошее. Хотя у вас неплохой инструмент кирпич, из которого построены много домов разной величины. 


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

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

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


Эксперт
****


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

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



Локальные переменные могут создавать те же проблемы:
Код

void f() {
A* a = new A();
int x = a->getX(); // Для оптимизации запомним x
...


if (x == 0) // вместо if (a->getX() == 0)
   ...
}

Так что это проблема не ООП.
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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