powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Абстрактные классы.
25 сообщений из 63, страница 2 из 3
Абстрактные классы.
    #36448507
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmonПо теме - assert разве не для этого? В релизе промолчит, в отладке обругается. Если нет поддржки assert со стороны языка, то всегда можно какой-нибудь заменитель изобразить, IMHO.
А когда по вашему assert отработает?
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36448856
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoА когда по вашему assert отработает?не в этом дело, исключение можно проигнорировать, ассерт - никогда, или это не ассерт
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449151
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychXDiaBLoА когда по вашему assert отработает?не в этом дело, исключение можно проигнорировать, ассерт - никогда, или это не ассерт
Вообще, ошибка должна и в релизе остаться ошибкой. Но я не утверждаю, что ассерты не нужны, можно и так сделать.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449181
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как оказалось, в разных местах под "assertions" подразумеваются не совсем тождественные механизмы.

Я на примере Delphi поясню. Там имеется процедура Assert(Condition: Boolean; Message: string), и волшебный ключ компиляции, который, когда включен - контролирует условия Assert, а когда выключен (в релизе), то вызов Assert вообще кода не генерирует. Соответственно, можно написать

procedure TAbstractClass.SomeMethod();
begin
Assert(False, 'Do not call me!');
end;

В релизе этот вызов ни к чему не приведет, ползатель ничего не заметит (потому что ползателю такие сообщения об ошибках ни к чему). В development build под отладчиком мы просто выпадем на этом вызове. В test build тестер увидит полезное сообщение Do not call me (MyUnit10.pas, line XXX), то есть прямо с именем модуля исходника и номером строки (стека, правда, не хватает, но это уже намного лучше, чем Asbtract Error at 00719F13).

Удобно ж, ёпрст!
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449213
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychисключение можно проигнорировать, ассерт - никогда, или это не ассерт

Ну, assert - в конечном итоге тоже исключение.
Я для себя решил так: если пользователь может что-то поделать с проблемой, то это должно быть оформлено исключением (File not found, Host unreachable, Disk full и так далее), теоретически доходящим до пользователя, а если пользователь тут ни ухом, ни рылом помочь не может, то лучше бы тут был отключаемый assert (вот вызов "запрещенного" метода - как раз тот случай).
Но это моё мнение, я на нем не настаиваю :)
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449237
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmonegorychисключение можно проигнорировать, ассерт - никогда, или это не ассерт

Ну, assert - в конечном итоге тоже исключение.
Я для себя решил так: если пользователь может что-то поделать с проблемой, то это должно быть оформлено исключением (File not found, Host unreachable, Disk full и так далее), теоретически доходящим до пользователя, а если пользователь тут ни ухом, ни рылом помочь не может, то лучше бы тут был отключаемый assert (вот вызов "запрещенного" метода - как раз тот случай).
Но это моё мнение, я на нем не настаиваю :)
Ога, а юзер потом будет говорить:"у меня не работает, разберитесь", и никакой более информации. Это ещё хорошо, если получится воссоздать ошибку у себя на машине, повторив его действия. Но иногда ошибка может быть повторимой только на его машине. Как быть?
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449259
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoНо иногда ошибка может быть повторимой только на его машине. Как быть?

Ставить ему test build, думать об этом... как-то так. Трудно и не везде применимо, согласен.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449278
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmonXDiaBLoНо иногда ошибка может быть повторимой только на его машине. Как быть?

Ставить ему test build, думать об этом... как-то так. Трудно и не везде применимо, согласен.
Именно, не везде. Нужно чтобы релиз показывал все важные ошибки, а тётя, у которой ошибка случилась, могла бы зачитать сообщение.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449320
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoНужно чтобы релиз показывал все важные ошибки, а тётя, у которой ошибка случилась, могла бы зачитать сообщение.

В порядке трёпа:
Тестирование с помощью тёти - не наш метод. Вообще-то, тёте надо видеть сообщения в форме простых команд, типа "Выкинь отсмотренное кино с винчестера", "Воткни патчкорд в дырку", "Больше так не делай". Все остальные сообщения для тёти обычно сливаются в одно могучее "Shit happens", и при анализе опираться на устные показания тёти не стоит по-любому, imho. Сбрось в файлик настоящий Exception, стек, дату, время, разные важные параметры (в том числе, например, трек пройденных и "заглоченных" assertов, если будете свою их реализацию делать), и нехай тётя файлик этот по мылу пришлёт. Не грузите тётю сообщениями типа "Abstract Error" или, например, незабываемое "Произошел разрушительный сбой по адресу XXXXXXXX". Тёте что этот адрес, что разрушительная сила сбоя, что ваши абстракции - до одного и того же фонаря.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449348
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmonXDiaBLoНужно чтобы релиз показывал все важные ошибки, а тётя, у которой ошибка случилась, могла бы зачитать сообщение.

В порядке трёпа:
Тестирование с помощью тёти - не наш метод. Вообще-то, тёте надо видеть сообщения в форме простых команд, типа "Выкинь отсмотренное кино с винчестера", "Воткни патчкорд в дырку", "Больше так не делай". Все остальные сообщения для тёти обычно сливаются в одно могучее "Shit happens", и при анализе опираться на устные показания тёти не стоит по-любому, imho. Сбрось в файлик настоящий Exception, стек, дату, время, разные важные параметры (в том числе, например, трек пройденных и "заглоченных" assertов, если будете свою их реализацию делать), и нехай тётя файлик этот по мылу пришлёт. Не грузите тётю сообщениями типа "Abstract Error" или, например, незабываемое "Произошел разрушительный сбой по адресу XXXXXXXX". Тёте что этот адрес, что разрушительная сила сбоя, что ваши абстракции - до одного и того же фонаря.
Тёти мне звонят и пишут, описывают ситуацию. Но я всё подумываю сделать сервачок, на который будет регистрироваться весь порядок действий пользователей. Чтобы с пары нажатий кнопок, видеть всю ситуацию. Пока некогда такое делать, но сплю и вижу такое.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449375
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толкование стека исключений отдаётся полностью на откуп разработчику, а не пользователю. Обычно в оконном приложении при ошибке, юзер получает красный лопух с грозным сообщением "Приложение вызвало ошибку code = PIZDETS:0001. Обратитесь в службу поддержки". При этом (я очень надеюсь) полный стек ошибок должен выпасть в какой-нибудь application.YYYY-MM-DD.log. Девелопер, увидев такие дела может детализировать сообщения. Например: стартовать приложение с ассертами там, или добавить logging.level=SUPPORT и делать прочие пляски с бубном.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36449808
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, стоит сделать для вывода ошибок нечто такое:
Выводится окошко с вменяемым текстом исключения (с точки зрения пользователя) и внизу нечто типа кнопки "Детали", нажав на которую будет показана полная информация о исключении в контроле, из которого можно скопировать текст. Тогда при ошибке пользователь не пугается увидев какой-то ужас, но при этом у него есть возможность просто отправить по запросу разработчика текст исключения просто скопировав его из деталей. Тут много объяснять не потребуется:
1. Нажмите кнопку "Детали"
2. Скопируйте из окошка снизу весь текст и скиньте мне на почту/в аську
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451022
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLo
Тёти мне звонят и пишут, описывают ситуацию. Но я всё подумываю сделать сервачок, на который будет регистрироваться весь порядок действий пользователей. Чтобы с пары нажатий кнопок, видеть всю ситуацию. Пока некогда такое делать, но сплю и вижу такое.
После того, как тётя не смогла по телефону рассказать хотя бы по буквам, что там по английски написано в сообщении об ошибке, я сделал такую вещь: создал табличку (у меня база MS-SQL) в которую записывал информацию о коннектах/реконнектах и ошибках,
типа {имя пользователя, время, текст}.
Когда звонит тётя, я открываю табличку и вижу, что там у нее было.
Мне она звонит очень редко, т.к. уже все отлажено.
А если у вас часто такие ситуации встречаются, то стоит чего-нибудь подобное придумать.
По крайней мере это не так уж и сложно сделать.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451053
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmonНе грузите тётю сообщениями типа "Abstract Error" или, например, незабываемое "Произошел разрушительный сбой по адресу XXXXXXXX". Тёте что этот адрес, что разрушительная сила сбоя, что ваши абстракции - до одного и того же фонаря.
Как-то играл в какую-то игру про гонки. И несколько раз она вылетала в Windows с сообщением об ошибке: я непомню точно, что там было написано, но что-то про неверный вызов чисто виртуального метода.
XDiaBlo

Это я к тому пишу, что хочу сказать: если язык не поддерживает абстрактные классы, то какой смысл их иммитировать? Может быть применить другое архитектурное решение, при котором не надо будет ухищрятся так?
Есть ситуации, когда не только шаблоны, но и ООП могут только повредить проекту, если применять это не там, где нужно.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451097
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SV,
А есть ситуации, где без абстрактных классов возникнет либо дублирование кода, либо базовый класс, который допускает инстанцирование, при том, что он сам по себе, использоваться не должен. Как быть?
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451101
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBlo,
Как мне кажется, идея релизовывать вот это:
Код: plaintext
1.
2.
3.
4.
    public String getXML()
    {
        throw new Exception("Not realised yet.");
    }
Может привести ко многим проблемам:
Прежде всего будут страдать и плакать тёти, когда у них это вылетит в самый неподходящий момент.
Да и наверно писать код, который по замыслу не должен выполнятся, как-то странно...
Я не спорю, что есть такие приемы, но наверно чем меньше их в программе, тем лучше.
Простите за критику.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451120
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoMAYAKOV_SV,
А есть ситуации, где без абстрактных классов возникнет либо дублирование кода, либо базовый класс, который допускает инстанцирование, при том, что он сам по себе, использоваться не должен. Как быть?
Тут нужно смотреть конкретную ситуацию.
А так, выход всегда есть. Да и GoF не панацея от всех проблем.
Я считаю, что нужно писать код так, чтобы многие ошибки можно было увидеть на стадии компиляции, а не во время выполнения.
Я как-то сделал абстрактный класс стратегия, потом наделал конкретных стратегий от него.
Смотрю - что-то методы у классов маленькие. Потому плюнул на это и написал простую процедуру вместо всех этих классов, которая была всего одна страница в объеме - и был просто счастлив Расширять ее не надо было, да в использовании она проще была.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451133
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SV,
Хочу кое-что со стратегиями сделать. Ща там лапша на тыщу строк, которую я уже немного упорядочил. Любопытно будет увидеть что получится.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451138
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoMAYAKOV_SV,
А есть ситуации, где без абстрактных классов возникнет либо дублирование кода, либо базовый класс, который допускает инстанцирование, при том, что он сам по себе, использоваться не должен. Как быть?
У меня сейчас каша в голове, может не все хорошо в моем примере, но надеюсь может поможет
Проблему можно решить заменой наследования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 class a 
 {
  private:
   CString txt;
  public:
   virtual void put() =  0 ;
 };
 class b : a
 {
   void put()
   {
     AfxMessageBox(txt);
   }
 };
На агрегирование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 class a 
 {
  private:
   CString txt;
  public:
   CString GetText()
   {
     return txt;
   }
 };
 class b 
 {
   a agr;
   void put()
   {
     AfxMessageBox(agr.GetText());
   }
 };
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451153
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SV,
Я подозреваю что вы всё же имеете в виду что-то типа того, чтобы наследовать все классы от одного интерфейса, а то, что было бы в абстрактном классе, реализовывать в отдельном классе, и использовать его через агрегирование. В таком случае в вашем коде не хватает общего предка. Причём в С++ сие смысла не имеет, а в языках без абстрактных классов, но с интерфейсами, имеет. Вот это уже хороший вариант, спасибо.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451186
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoMAYAKOV_SV,
Я подозреваю что вы всё же имеете в виду что-то типа того, чтобы наследовать все классы от одного интерфейса, а то, что было бы в абстрактном классе, реализовывать в отдельном классе, и использовать его через агрегирование. В таком случае в вашем коде не хватает общего предка. Причём в С++ сие смысла не имеет, а в языках без абстрактных классов, но с интерфейсами, имеет. Вот это уже хороший вариант, спасибо.
Я где-то в книге читал про замену наследования на агрегирования, помоему по рефакторингу книга была, не помню.
Что то я читал несколько раз ваше сообщение и не совсем понимаю, голова щас другим забита...
Т.е. в каждом производном от интерфейса классе так писать?:
Код: plaintext
1.
2.
3.
4.
 void Test()
 {
    a->Test();
 }
Мне кажется вы всеми силами пытаетесь смоделировать абстрактный класс, т.е. обхитрить язык.
А я толкал мысль о том, что можно попробывать выбрать какое-нибудь другое архитектурное решение. Не могу сказать точно какое, потому как не знаю вашу задачу.
По крайней мере я держу у себя в уме такое правило: если что-то слишком сложно в коде получается, то явно что-то не то в самой идее и нужно ее пересмотреть...
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451199
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SV,
Да ёмоё, если нужно чтобы всё же было наследование, но при этом не подходит конкретный класс в качестве родителя, и нужно не дублировать код в наследниках, то как вы предлагаете обойтись без абстрактного класса, как не совмещением наследования интерфейса и агрегирования?
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451383
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoMAYAKOV_SV,
Да ёмоё, если нужно чтобы всё же было наследование, но при этом не подходит конкретный класс в качестве родителя, и нужно не дублировать код в наследниках, то как вы предлагаете обойтись без абстрактного класса, как не совмещением наследования интерфейса и агрегирования?
Если вам агрегирование поможет, я только рад, я не против.
Главное не забывайте тестировать, если рефакторите существующий код.
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451557
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAYAKOV_SVXDiaBLoMAYAKOV_SV,
Да ёмоё, если нужно чтобы всё же было наследование, но при этом не подходит конкретный класс в качестве родителя, и нужно не дублировать код в наследниках, то как вы предлагаете обойтись без абстрактного класса, как не совмещением наследования интерфейса и агрегирования?
Если вам агрегирование поможет, я только рад, я не против.
Главное не забывайте тестировать, если рефакторите существующий код.
Да, хотелось бы в юнит-тесты завернуть, да что-то не пойму как их к С++ Билдеру прикрутить. Вручную тестирую
...
Рейтинг: 0 / 0
Абстрактные классы.
    #36451733
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLo
Да, хотелось бы в юнит-тесты завернуть, да что-то не пойму как их к С++ Билдеру прикрутить. Вручную тестирую
Тестирование - вообще мое самое слабое место.
Книгу все собираюсь почитать по этой теме.
Но мой опыт мне показал, что к тестированию нужно очень серьезно относиться.
Хорошо, если пользователь - добрая и терпеливая тётя, или ошибка в программе не так серьезно может отразится. А если нет?...
В этом плане, я побаиваюсь делать рефакторинг.
Если делаю, то только на разрабатываемом проекте, но не на уже работающем.
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Абстрактные классы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]