1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
|
|
1 | |
Пишем свой класс, спецификатор доступа protected09.07.2015, 18:43. Показов 5095. Ответов 61
Метки нет (Все метки)
Всем привет!
Из книги Р. Лафоре относительно спецификатора доступа protected:
0
|
09.07.2015, 18:43 | |
Ответы с готовыми решениями:
61
Ошибка доступа access violation: почему класс-наследник не видит protected данные-члены класса-родителя? Пишем свой чекер Пишем свой OPC-server пишем свой троян с нуля |
10.07.2015, 14:52 | 41 |
Ну вообще-то достаточно проверять дату при вводе/задании.
Если же вы допустите некорректный ввод, то вы получите не предвиденные последствия (вообще это как бы банально и ежу понятно) которые вы потом уже никак не отловите и не обнаружите и в этом нет ничего хорошего.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 14:58 | 42 |
Ну это все понятно. Только мне кажется, что ты говоришь о всем приложении в целом, а я о проектировании библиотечного класса, который не в курсе, проверяешь ты там снаружи свои данные, или уверен в их правильности, или еще что.
PS где-то я уверен, что передаю верные данные. Где-то не уверен. И здесь правильный подход - проверять корректность в использующей класс части только там, где нужно. Этим и будут сохраняться инварианты класса и избегаться UB. А в классе оставить только ассерты и не пытаться сохранить инварианты любой ценой.
0
|
10.07.2015, 15:03 | 43 | |||||
К примеру
1. from - задано невалидным 2. to - задано невалидным 3. daysBetween() работает не верно. Добавлено через 3 минуты А библиотечные классы не строятся один на другом? Должен быть уверен в том что ты проверяешь, как должна быть осуществлена проверка что бы не допустить багов должно быть отображено в документации библиотеки.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 15:12 | 44 |
Само собой. Но проверки - это не обязательно ответственность именно класса.
Какая разница? Всегда есть используемый класс и использующий. Да, очевидно, что контракты должны быть прописаны в документации и ассертами. Добавлено через 3 минуты Совсем хорошо, если еще негативные тесты есть.
0
|
10.07.2015, 15:20 | 45 |
Да любой класс используемый, вопрос уровня. Для того и пишут классы- для возможности повторного использования, а не копипаста кода. Вот как раз отсутствие проверок и делает код непригодным к повторному использованию ибо "человек" должен слишком много знать об этом кривом классе и слишком много сделать проверок руками... и возможно окажется что легче будет писать с нуля нежели использовать этот класс.
Добавлено через 2 минуты А кого тогда эта ответственность? Класс должен отвечать за то что ему поручают, т.е за то с чем его ассоциируют, Класс "дата" не должен хранить класс "строку" ( как в моем примере: from.setDate(" .... "); ) он должен хранить именно дату, а не что иное.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
10.07.2015, 15:23 | 46 |
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 15:33 | 47 |
Вообще не вижу проблем. Если у тебя такая ситуация, что на каждый чих что-то надо проверять, то либо оберни в свой, в котором будут проверки, либо воспользуйся уже такой готовой оберткой. Но изначально предоставлять класс со всеми проверками - не лучшая идея.
Тот, кто его использует, обязан проверять, что он следует контракту используемого класса для того, чтобы получить гарантированное поведение. Добавлено через 3 минуты Хорошо. Не вижу смысла вам писать, раз уж сами не можете потратить минуту на поиск информации. Я в няньки не нанимался.
0
|
10.07.2015, 15:42 | 48 |
Зачем? Я так вряд ли поступлю... скорее я выкину тот класс и напишу свою реализацию с проверками зачем мне мараться.
Добавлено через 1 минуту Не лучшая идея допускать UB cо старта. Добавлено через 56 секунд Тому кто использует срать, он хочет получить желаемое, а не UB. UB на то UB а не гарантированое повидение. Если вы изначально UB приравниваете/(включаете) к гарантированному поведению то грош вам цена как программисту. Понятно что есть некоторые упущения и "люфты" которые могут привести к UB при использовании библиотеки, но тем не менее не на каждом же шагу.
1
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 15:46 | 49 |
То есть для тебя читать документацию означает мараться? Ну ок Может с итераторов начнешь? А то класс итератора при разыменовании не проверяет, конечный он или нет. Там UB получается. Ну так как?
Добавлено через 1 минуту Оу, почитайте про DbC на досуге.
0
|
10.07.2015, 15:49 | 50 |
А при чем тут дока? Если кривая библиотека, то и получишь документацию к кривой библиотеке не более.
А с чего начинать со специализированных классов? С таким же успехом можно было уже и назвать std::pair<> в котором члены класса открыты. Вы ведь сами изначально привели пример с датой изначально так?
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 16:05 | 51 |
Библиотека не кривая. Если ты ее используешь не так, как задумано авторами (как задумано - написано в документации) - это твои личные проблемы. Библиотека ведет себя в полном соответствии с документацией. Почему тогда она кривая? Или по твоей логике, если белье сушится в микроволновке как-то странно, то это микроволновка кривая? Или все-таки проблема в том, что ты не прочитал, как ей пользоваться?
Везде есть контракт на вызов. И там, и там, тебе говорят, не вызывай, мол, такую-то функцию с такими-то данными, получишь фиг знает что! Добавлено через 5 минут PS Хочешь пользоваться микроволновкой, которая всегда перед нагревом целую минуту проверяет, положил ты туда еду или еще что?
0
|
10.07.2015, 16:19 | 52 |
Если микроволновка выглядит полностью как стиральная машинка то да виноват разработчик и тут дока не при чем ибо ошибка допущена уже при покупке "инструмента".
Добавлено через 4 минуты Тем не менее не плохо бы что бы микроволновка не допускала включение при открытой дверце.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
10.07.2015, 16:28 | 53 |
Не, по большому счету это проблема автора ибо я себе найду другую библиотеку, а вот его библиотекой будет пользоваться меньшей людей. Недостаточно просто написать доку, хороший интерфейс должен способствовать правильному использованию и сводить к минимуму возможности его использовать неправильно.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 16:34 | 54 |
Так кто все-таки виноват? Производитель или потребитель? А может в городе, в котором живет производитель, микроволновки выглядят как раз именно так, как у тебя стиральные машинки? Для того и существует документация - чтобы устранять непонимания между тем, кто производит, и тем, кто пользуется. Да и вообще это не наш случай. В нашем внешний вид практически один и тот же.
Даже если будет минуту определять, открыта она или нет? А как насчет определения, не нагреется ли за такое время еда больше, чем хочет потребитель? Или меньше? Говорю же, каждая ситуация имеет свои специфические особенности, которые надо учитывать. Поэтому говорить, что например, всегда куча проверок - это хорошо - неправильно. Добавлено через 2 минуты Да, верно. Но DbC мало как влияет на внешний вид API. Просто в одном случае проверки спрятаны внутри, а в другом - их нет, и неправильное использование ведет к UB. И для того, чтобы определить, есть они или нет, все равно нужно читать доку. Логично постоянно задаваться вопросом - а что будет, если я передам неверные данные? И ответ надо искать в документации, а не фантазировать.
0
|
10.07.2015, 17:06 | 55 |
Вина потребителя лишь в том что он купил фиговый инструмент.
Ну а если бы в рту росли грибы .... С таким подходом все можно довести до абсурда. К примеру, а если в моем городе не принято читать документацию? У вас микроволновка определяет минуту? В любом случае это лучше чем так позволяет работать с открытой дверцей, нарушая TБ. Я не говорил что нужно доводить все до абсурда и пихать проверки куда не нужно.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
10.07.2015, 17:36 | 56 |
Avazart, вернемся к теме.
Чел написал всем известную книгу: http://www.amazon.com/Large-Sc... 0201633620 http://stackoverflow.com/quest... are-design Его слова с аннотации к выступлению на CppCon14 (выделения мои):
0
|
11.07.2015, 01:59 | 57 |
Вопрос в том что ставить во главе безопасность или скорость, как по мне в большинстве случаем ставится во главе именно безопастность. С другой стороны спецификой именно С++ также являестся и эффективность/скорость. В общем баланс никто не отменял.
В любом случае пользователю желательно предоставить безопастную библиоткеку точнее сказать библиотеку с безопасным видом/интерфейсом, в нутри которая конечно может содержать самые разные оптимизации от си кода до асм вставок. То что допустим STL не делает какие либо проверки и больший перевес в сторону скорости, так это "основопологающая" либа собственно которой отдельное место стандарте и посвещена не одна книга. Т.е готовы ли вы писать талмуды и "учить" людей как правильно использовать вашу библиотеку, вводить свои термины и понятия специфические для вашей либы? Нужна ли вам настолько производительность? Добавлено через 9 минут Не по теме: Кстати все же для этого есть алтернативный интерфейс через индексы и метод .at(). Добавлено через 16 минут Что касается изначальной темы и авторов книг: http://bookscafe.net/read/satt... idp1948512
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
11.07.2015, 02:52 | 58 |
Желательно кому? А если пользователю ну очень важна скорость? Еще при проектировании либы разработчики примерно определяют, какой процент времени CPU целесообразно потратить на проверку предусловий.
Ну а если нужна? Да и какие талмуды? Что именно должно документироваться, написано в вики https://en.wikipedia.org/wiki/Design_by_contract Это только у вектора.
0
|
11.07.2015, 03:00 | 59 |
Двойной интерфейс (безопасный/небезопасный), оптимизация "внутри".
Все что нестандартное, все что может вызвать ошибку итп, что бы пользователь не гадал и не лез в исходники что бы понять в чем и где ошибка. Разве всякие ассерты не являются проверками? Так на кой листу произвольный доступ. Если же итерируешь то самой сабой подразумевается проверка и валидность. Как в принципе и работа с массивами через указатели.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
11.07.2015, 03:12 | 60 |
Двойной интерфейс как вариант. По сути это и есть готовая обертка - вызовы внутри будут делегироваться к коду без проверок.
В случае без проверок мы документируем, как правильно надо пользоваться, остальное - UB. В случае с проверками нам помимо этого нужно расписать, как либа сообщает об ошибках (исключения, коды ошибок, запись в лог, какие-нибудь Maybe монады) и какие именно ошибки в каком случае возвращаются. Кажется, что во втором варианте писать больше, разве нет? Ну просто итераторы - это такая фигня, которая используется алгоритмами для того, чтобы по максимуму абстрагироваться от типа контейнера. Или я не понял, что ты имел в виду.
0
|
11.07.2015, 03:12 | |
11.07.2015, 03:12 | |
Помогаю со студенческими работами здесь
60
Пишем свой интерпретатор языка BASIC Пишем свой первый Windows-драйвер Пишем свой интерпретатор языка BASIC Спецификатор доступа и виртуальные функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |